本發(fā)明涉及計(jì)算機(jī)存儲(chǔ)技術(shù)領(lǐng)域,特別是涉及一種Linux操作系統(tǒng)的內(nèi)存分配方法及釋放方法。
背景技術(shù):
在Linux操作系統(tǒng)中,內(nèi)存的管理和分配工作是影響系統(tǒng)穩(wěn)定運(yùn)行的重要因素?,F(xiàn)有的分配方法是基于伙伴算法,伙伴算法最大限度的減少了內(nèi)存的碎片,其數(shù)據(jù)結(jié)構(gòu)中包括鏈表和位圖,鏈表將同一級(jí)別的內(nèi)存塊組織在一起,位圖標(biāo)示了每一個(gè)內(nèi)存塊對(duì)應(yīng)的伙伴塊的狀態(tài),在內(nèi)存分配時(shí)要根據(jù)該狀態(tài)決定內(nèi)存如何分配。滿足以下條件的兩個(gè)內(nèi)存塊互為伙伴塊:兩個(gè)內(nèi)存塊的大小相同,兩個(gè)內(nèi)存塊的物理位置相鄰且兩個(gè)內(nèi)存塊的地址的只有最后一位不相同(地址連續(xù))?;锇樗惴ǖ乃枷刖褪菍⑽锢韮?nèi)存分成11個(gè)鏈表,每個(gè)鏈表包含的是大小為2的整數(shù)次冪,分別為1,2,4,8......512,1024的內(nèi)存塊。
舉例來(lái)說(shuō)要分配大小為256的內(nèi)存塊,會(huì)先到塊大小為256的鏈表中查找空閑塊,若有,則將塊大小為256的鏈表中的其中一個(gè)空閑塊分配給進(jìn)程;若沒有,則去大小為512的鏈表中進(jìn)行查找,將大小為512的內(nèi)存塊平均分為兩部分,一部分分配給進(jìn)程,一部分插入大小為256的鏈表中。若大小為512的鏈表中還沒有,到大小為1024的鏈表中查找,將大小為1024的內(nèi)存塊平均分為三部分,取出大小為256的內(nèi)存塊,將剩下的大小為512的內(nèi)存塊和大小為256的內(nèi)存塊分別插入到大小為512的鏈表中和大小為256的鏈表中。
以上是內(nèi)存塊分配的過程,內(nèi)存塊釋放的過程則是相反的。在分配過程中由大的內(nèi)存塊分解而成的小的內(nèi)存塊中沒有被分配的內(nèi)存塊將一直等著被分配的內(nèi)存塊被釋放從而和其合并,合并的操作正是在內(nèi)存塊釋放的過程中,因而伙伴系統(tǒng)能避免內(nèi)存碎片。每一個(gè)內(nèi)存塊都有一個(gè)伙伴塊,兩個(gè)伙伴塊都是空閑時(shí)會(huì)組成一個(gè)大的內(nèi)存塊,將新的內(nèi)存塊組織在該鏈表的上一級(jí)鏈表中。
盡管伙伴算法非常經(jīng)典,但是也存在缺陷。比如,合并要求過于嚴(yán)格,只能是滿足伙伴關(guān)系的內(nèi)存塊才能合并。例如,有兩個(gè)內(nèi)存塊,雖然兩個(gè)內(nèi)存塊的大小相同,物理位置相鄰但是由于二者的地址不連續(xù),例如最后兩位不相同,則兩個(gè)內(nèi)存塊就不滿足伙伴關(guān)系,因而也不能合并成為一個(gè)大的內(nèi)存塊,導(dǎo)致出現(xiàn)較多小的內(nèi)存塊不能合并成大的內(nèi)存塊,降低了內(nèi)存的分配和利用效率。
由此可見,如何提高系統(tǒng)的內(nèi)存分配和利用效率是本領(lǐng)域技術(shù)人員亟待解決地問題。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的是提供一種Linux操作系統(tǒng)的內(nèi)存分配方法及釋放方法,用于提高系統(tǒng)的內(nèi)存分配和利用效率。
為解決上述技術(shù)問題,本發(fā)明提供一種Linux操作系統(tǒng)的內(nèi)存分配方法,,包括:
S10:判斷所述Linux操作系統(tǒng)中是否包含有符合內(nèi)存分配請(qǐng)求的內(nèi)存空間;如果是,進(jìn)入步驟S11;
S11:判斷第一鏈表是否包含有所述內(nèi)存分配請(qǐng)求對(duì)應(yīng)的目標(biāo)內(nèi)存塊;如果否,則進(jìn)入步驟S12;
S12:根據(jù)所述內(nèi)存分配請(qǐng)求對(duì)應(yīng)的目標(biāo)級(jí)別在第二鏈表中確定出第二目標(biāo)子鏈表;
S13:判斷所述第二目標(biāo)子鏈表中是否包含有所述目標(biāo)內(nèi)存塊;如果是,進(jìn)入步驟S14,如果否,進(jìn)入步驟S15;
S14:返回所述目標(biāo)內(nèi)存塊的地址;
S15:縮減分配給所述Linux操作系統(tǒng)自身的內(nèi)存,返回步驟S10;
其中,所述第一鏈表包含多個(gè)級(jí)別的第一子鏈表,分別用于存儲(chǔ)多個(gè)級(jí)別的內(nèi)存塊,所述第一鏈表的伙伴規(guī)則為:若兩個(gè)內(nèi)存塊的大小相同、物理位置相鄰且兩個(gè)內(nèi)存塊的地址除最后一位都相同時(shí),則所述兩個(gè)內(nèi)存塊互為伙伴塊,第一位圖指示所述第一鏈表中的內(nèi)存塊的狀態(tài);
所述第二鏈表包含多個(gè)級(jí)別的第二子鏈表,分別用于存儲(chǔ)多個(gè)級(jí)別的內(nèi)存塊,所述第二鏈表的伙伴規(guī)則為:若兩個(gè)內(nèi)存塊的大小相同、物理位置相鄰且兩個(gè)內(nèi)存塊的地址除最后兩位都相同時(shí),則兩個(gè)內(nèi)存塊互為伙伴塊,第二位圖指示所述第二鏈表中的內(nèi)存塊的狀態(tài)。
優(yōu)選地,步驟S11具體包括:
S110:根據(jù)當(dāng)前的目標(biāo)級(jí)別在所述第一鏈表中確定出第一目標(biāo)子鏈表;
S111:判斷當(dāng)前的第一目標(biāo)子鏈表是否包含有空閑的內(nèi)存塊;如果是,則確定所述第一鏈表包含有所述內(nèi)存分配請(qǐng)求對(duì)應(yīng)的目標(biāo)內(nèi)存塊,如果否,進(jìn)入步驟S112;
S112:將目標(biāo)級(jí)別+1,并判斷當(dāng)前的目標(biāo)級(jí)別是否大于最大級(jí)別;如果是,則確定所述第一鏈表未包含有所述內(nèi)存分配請(qǐng)求對(duì)應(yīng)的目標(biāo)內(nèi)存塊,如果否,返回步驟S110。
優(yōu)選地,如果當(dāng)前第一目標(biāo)子鏈表包含有所述內(nèi)存分配請(qǐng)求對(duì)應(yīng)的目標(biāo)內(nèi)存塊,則在步驟S111之后還包括:
S20:在所述第一目標(biāo)子鏈表中將所述目標(biāo)內(nèi)存塊刪除,并將所述目標(biāo)內(nèi)存塊的地址發(fā)送給分配進(jìn)程。
優(yōu)選地,在步驟S20之后還包括:
S21:根據(jù)所述第二位圖判斷所述目標(biāo)內(nèi)存塊是否影響所述第二鏈表中對(duì)應(yīng)的伙伴塊,如果是,則進(jìn)入步驟S22,如果否,進(jìn)入步驟S14。
S22:刪除所述第二鏈表中所述目標(biāo)內(nèi)存塊對(duì)應(yīng)的伙伴塊。
優(yōu)選地,如果所述Linux操作系統(tǒng)中未包含有符合所述內(nèi)存分配請(qǐng)求的內(nèi)存空間,則在步驟S10之后還包括:
S23:調(diào)用守護(hù)進(jìn)程以向所述Linux操作系統(tǒng)釋放內(nèi)存;返回步驟S10。
一種Linux操作系統(tǒng)的內(nèi)存釋放方法,包括:
S30:確定當(dāng)前的待釋放內(nèi)存塊對(duì)應(yīng)的目標(biāo)級(jí)別;
S31:判斷第一鏈表中是否包含有當(dāng)前的待釋放內(nèi)存塊的伙伴塊,如果否,則進(jìn)入步驟S32;
S32:判斷所述第二鏈表中是否包含有當(dāng)前的待釋放內(nèi)存塊的伙伴塊,如果是,進(jìn)入步驟S33,如果否,則進(jìn)入步驟S34;
S33:合并當(dāng)前的待釋放內(nèi)存塊及其伙伴塊,并加入到所述第二鏈表相應(yīng)的第二子鏈表中;
S34:將當(dāng)前的待釋放內(nèi)存塊加入到所述第一鏈表相應(yīng)的第一子鏈表中;
其中,所述第一鏈表包含多個(gè)級(jí)別的第一子鏈表,分別用于存儲(chǔ)多個(gè)級(jí)別的內(nèi)存塊,所述第一鏈表的伙伴規(guī)則為:若兩個(gè)內(nèi)存塊的大小相同、物理位置相鄰且兩個(gè)內(nèi)存塊的地址除最后一位都相同時(shí),則所述兩個(gè)內(nèi)存塊互為伙伴塊,第一位圖指示所述第一鏈表中的內(nèi)存塊的狀態(tài);
所述第二鏈表包含多個(gè)級(jí)別的第二子鏈表,分別用于存儲(chǔ)多個(gè)級(jí)別的內(nèi)存塊,所述第二鏈表的伙伴規(guī)則為:若兩個(gè)內(nèi)存塊的大小相同、物理位置相鄰且兩個(gè)內(nèi)存塊的地址除最后兩位都相同時(shí),則兩個(gè)內(nèi)存塊互為伙伴塊,第二位圖指示所述第二鏈表中的內(nèi)存塊的狀態(tài)。
優(yōu)選地,步驟S31具體包括:
S310:根據(jù)所述目標(biāo)級(jí)別在第一鏈表中查找對(duì)應(yīng)的第一目標(biāo)子鏈表;
S311:判斷所述第一目標(biāo)子鏈表中是否包含有當(dāng)前的待釋放內(nèi)存塊的伙伴塊,如果是,則確定所述第一鏈表中包含有當(dāng)前的待釋放內(nèi)存塊的伙伴塊;如果否,則確定所述第一鏈表中未包含有當(dāng)前的待釋放內(nèi)存塊的伙伴塊。
優(yōu)選地,如果所述第一目標(biāo)子鏈表中包含有當(dāng)前的待釋放內(nèi)存塊的伙伴塊,則步驟S311之后還包括:
步驟S35:合并當(dāng)前的待釋放內(nèi)存塊及其伙伴塊以作為新的待釋放內(nèi)存塊,并判斷當(dāng)前的待釋放內(nèi)存塊的級(jí)別是否小于最大級(jí)別;如果是,返回步驟S31,如果否,進(jìn)入步驟S34。
本發(fā)明所提供的Linux操作系統(tǒng)的內(nèi)存分配方法,在現(xiàn)有伙伴算法的數(shù)據(jù)結(jié)構(gòu)上,增加了第二鏈表和第二位圖,當(dāng)在第一鏈表中沒有得到內(nèi)存分配請(qǐng)求的內(nèi)存空間時(shí),可以在第二鏈表中進(jìn)一步嘗試,減少了內(nèi)存分配請(qǐng)求失敗的幾率。由于第二鏈表中將不符合第一鏈表中的伙伴規(guī)則的內(nèi)存塊進(jìn)一步選取,能夠把一部分內(nèi)存塊由非伙伴關(guān)系變?yōu)榛锇殛P(guān)系,從而加入到分配的隊(duì)列中,從而提高了內(nèi)存分配的效率,提高了內(nèi)存空間的利用率。
本發(fā)明所提供的Linux操作系統(tǒng)的內(nèi)存釋放方法,在現(xiàn)有伙伴算法的數(shù)據(jù)結(jié)構(gòu)上,增加了第二鏈表和第二位圖,當(dāng)在第一鏈表中沒有實(shí)現(xiàn)將待釋放內(nèi)存塊合并時(shí),可以在第二鏈表中進(jìn)一步嘗試,減少了內(nèi)存釋放請(qǐng)求失敗的幾率。由于第二鏈表的伙伴規(guī)則與第一鏈表的伙伴規(guī)則不同,因此,能夠把一部分內(nèi)存塊由非伙伴關(guān)系變?yōu)榛锇殛P(guān)系,從而實(shí)現(xiàn)內(nèi)存塊的合并。由此可見,提高了待釋放內(nèi)存塊合并的幾率,減小了操作系統(tǒng)的內(nèi)存碎片。
附圖說(shuō)明
為了更清楚地說(shuō)明本發(fā)明實(shí)施例,下面將對(duì)實(shí)施例中所需要使用的附圖做簡(jiǎn)單的介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明實(shí)施例提供的一種Linux操作系統(tǒng)的內(nèi)存分配方法的流程圖;
圖2為本發(fā)明實(shí)施例提供的另一種Linux操作系統(tǒng)的內(nèi)存分配方法的流程圖;
圖3為本發(fā)明實(shí)施例提供的一種Linux操作系統(tǒng)的內(nèi)存釋放方法的流程圖;
圖4為本發(fā)明實(shí)施例提供的另一種Linux操作系統(tǒng)的內(nèi)存釋放方法的流程圖。
具體實(shí)施方式
下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)前提下,所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)范圍。
本發(fā)明的核心是提供一種Linux操作系統(tǒng)的內(nèi)存分配方法及分配方法。
為了使本技術(shù)領(lǐng)域的人員更好地理解本發(fā)明方案,下面結(jié)合附圖和具體實(shí)施方式對(duì)本發(fā)明作進(jìn)一步的詳細(xì)說(shuō)明。
圖1為本發(fā)明實(shí)施例提供的一種Linux操作系統(tǒng)的內(nèi)存分配方法的流程圖。如圖1所示,Linux操作系統(tǒng)的內(nèi)存分配方法,包括:
S10:判斷Linux操作系統(tǒng)中是否包含有符合內(nèi)存分配請(qǐng)求的內(nèi)存空間。如果是,進(jìn)入步驟S11。
在具體實(shí)施中,首先要接收內(nèi)存分配請(qǐng)求,內(nèi)存分配請(qǐng)求表示當(dāng)前需要將操作系統(tǒng)中的一部分內(nèi)存空間分配出來(lái)以便進(jìn)行使用。因此,如果操作系統(tǒng)中的內(nèi)存空間不符合內(nèi)存分配請(qǐng)求的要求的話,則不能完成內(nèi)存分配請(qǐng)求的任務(wù)。通常操作系統(tǒng)的內(nèi)存空間不符合要求的情況是當(dāng)前的內(nèi)存空間小于內(nèi)存分配請(qǐng)求所需要的內(nèi)存空間。只有在操作系統(tǒng)的內(nèi)存空間符合要求的前提下,后續(xù)的步驟才能進(jìn)行。
S11:判斷第一鏈表是否包含有內(nèi)存分配請(qǐng)求對(duì)應(yīng)的目標(biāo)內(nèi)存塊。如果否,則進(jìn)入步驟S12。
其中,第一鏈表包含多個(gè)級(jí)別的第一子鏈表,分別用于存儲(chǔ)多個(gè)級(jí)別的內(nèi)存塊,第一鏈表的伙伴規(guī)則為:若兩個(gè)內(nèi)存塊的大小相同、物理位置相鄰且兩個(gè)內(nèi)存塊的地址除最后一位都相同時(shí),則兩個(gè)內(nèi)存塊互為伙伴塊,第一位圖指示第一鏈表中的內(nèi)存塊的狀態(tài)。通過第一位圖就可以判斷第一鏈表是否包含有內(nèi)存分配請(qǐng)求對(duì)應(yīng)的目標(biāo)內(nèi)存塊。
本文中的級(jí)別是按照內(nèi)存塊的大小來(lái)區(qū)分的,同樣大小的內(nèi)存塊具有同樣的級(jí)別,不同大小的內(nèi)存塊具有不同的級(jí)別。本文中的目標(biāo)內(nèi)存塊指的是與內(nèi)存分配請(qǐng)求對(duì)應(yīng)的內(nèi)存塊。例如,內(nèi)存分配請(qǐng)求要需要的內(nèi)存空間大小為512,則第一鏈表中大小為512對(duì)應(yīng)的第一子鏈表中的空閑的內(nèi)存塊就目標(biāo)內(nèi)存塊??梢岳斫獾氖?,目標(biāo)內(nèi)存塊是變化的,其變化與目標(biāo)級(jí)別的變化是同步的。即,如果當(dāng)前目標(biāo)級(jí)別為2級(jí),對(duì)應(yīng)的第一鏈表中內(nèi)存塊的大小為4的第一子鏈表,此時(shí)目標(biāo)內(nèi)存塊就是內(nèi)存塊的大小為4的第一子鏈表中空閑的內(nèi)存塊;如果當(dāng)前目標(biāo)級(jí)別為3級(jí),對(duì)應(yīng)的第一鏈表中內(nèi)存塊的大小為8的第一子鏈表,此時(shí)目標(biāo)內(nèi)存塊就是內(nèi)存塊的大小為8的第一子鏈表中空閑的內(nèi)存塊。
S12:根據(jù)內(nèi)存分配請(qǐng)求對(duì)應(yīng)的目標(biāo)級(jí)別在第二鏈表中確定出第二目標(biāo)子鏈表。
第二鏈表包含多個(gè)級(jí)別的第二子鏈表,分別用于存儲(chǔ)多個(gè)級(jí)別的內(nèi)存塊,第二鏈表的伙伴規(guī)則為:若兩個(gè)內(nèi)存塊的大小相同、物理位置相鄰且兩個(gè)內(nèi)存塊的地址除最后兩位都相同時(shí),則兩個(gè)內(nèi)存塊互為伙伴塊,第二位圖指示第二鏈表中的內(nèi)存塊的狀態(tài)。
當(dāng)有內(nèi)存分配請(qǐng)求時(shí),首先是根據(jù)內(nèi)存分配請(qǐng)求對(duì)應(yīng)的目標(biāo)級(jí)別進(jìn)行查找,即如果內(nèi)存分配請(qǐng)求需要大小為512的內(nèi)存塊,則目標(biāo)級(jí)別就是9級(jí),則9級(jí)所在的第二子鏈表就是第二目標(biāo)子鏈表。
S13:判斷第二目標(biāo)子鏈表中是否包含有目標(biāo)內(nèi)存塊。如果是,進(jìn)入步驟S14,如果否,進(jìn)入步驟S15。
S14:返回目標(biāo)內(nèi)存塊的地址。
S15:縮減分配給Linux操作系統(tǒng)自身的內(nèi)存,返回步驟S10。
通過第二位圖就可以判斷第二鏈表是否包含有內(nèi)存分配請(qǐng)求對(duì)應(yīng)的目標(biāo)內(nèi)存塊。當(dāng)確定了第二目標(biāo)子鏈表之后,就在該子鏈表中查看是否有空閑的內(nèi)存塊,如果有則該內(nèi)存塊就是目標(biāo)內(nèi)存塊,則返回目標(biāo)內(nèi)存塊的地址,并結(jié)束;如果第二目標(biāo)子鏈表中不包含有目標(biāo)內(nèi)存塊,則說(shuō)明當(dāng)前分配給Linux操作系統(tǒng)自身的內(nèi)存較多,導(dǎo)致系統(tǒng)可用的內(nèi)存較少,因此執(zhí)行步驟S15。當(dāng)縮減分配給Linux操作系統(tǒng)自身的內(nèi)存后,操作系統(tǒng)中可用的內(nèi)存空間就變多了,此時(shí)就可以繼續(xù)執(zhí)行步驟S10,這里不再贅述。
本實(shí)施例提供的Linux操作系統(tǒng)的內(nèi)存分配方法,在現(xiàn)有伙伴算法的數(shù)據(jù)結(jié)構(gòu)上,增加了第二鏈表和第二位圖,當(dāng)在第一鏈表中沒有得到內(nèi)存分配請(qǐng)求的內(nèi)存空間時(shí),可以在第二鏈表中進(jìn)一步嘗試,減少了內(nèi)存分配請(qǐng)求失敗的幾率。由于第二鏈表中將不符合第一鏈表中的伙伴規(guī)則的內(nèi)存塊進(jìn)一步選取,能夠把一部分內(nèi)存塊由非伙伴關(guān)系變?yōu)榛锇殛P(guān)系,從而加入到分配的隊(duì)列中,從而提高了內(nèi)存分配的效率,提高了內(nèi)存空間的利用率。
圖2為本發(fā)明實(shí)施例提供的另一種Linux操作系統(tǒng)的內(nèi)存分配方法的流程圖。在上述實(shí)施例的基礎(chǔ)上,步驟S11具體包括:
S110:根據(jù)當(dāng)前的目標(biāo)級(jí)別在第一鏈表中確定出第一目標(biāo)子鏈表。
S111:判斷當(dāng)前的第一目標(biāo)子鏈表是否包含有空閑的內(nèi)存塊;如果是,則確定第一鏈表包含有內(nèi)存分配請(qǐng)求對(duì)應(yīng)的目標(biāo)內(nèi)存塊,如果否,進(jìn)入步驟S112。
S112:將目標(biāo)級(jí)別+1,并判斷當(dāng)前的目標(biāo)級(jí)別是否大于最大級(jí)別;如果是,則確定第一鏈表未包含有內(nèi)存分配請(qǐng)求對(duì)應(yīng)的目標(biāo)內(nèi)存塊,如果否,返回步驟S110。
在步驟S110-S112中,當(dāng)確定了目標(biāo)級(jí)別后,從目標(biāo)級(jí)別開始,在第一鏈表中對(duì)應(yīng)的子鏈表,即第一目標(biāo)子鏈表中查找是否包含有空閑的內(nèi)存塊,如果該目標(biāo)級(jí)別對(duì)應(yīng)的子鏈表不包含空閑的內(nèi)存塊,則將目標(biāo)級(jí)別+1,例如步驟S111的目標(biāo)級(jí)別為3的話,則在步驟S112之后,目標(biāo)級(jí)別就為4。由于鏈表中最大級(jí)別為10,因此,目標(biāo)級(jí)別每增加一級(jí),都需要判斷是否大于最大級(jí)別,如果大于,則確定第一鏈表未包含有內(nèi)存分配請(qǐng)求對(duì)應(yīng)的目標(biāo)內(nèi)存塊;如果不大于,則在下一級(jí),即新的目標(biāo)級(jí)別對(duì)應(yīng)的在第一鏈表中確定出第一目標(biāo)子鏈表,并重復(fù)上述步驟,這里不再所述。
在上述實(shí)施例的基礎(chǔ)上,如果當(dāng)前第一目標(biāo)子鏈表包含有內(nèi)存分配請(qǐng)求對(duì)應(yīng)的目標(biāo)內(nèi)存塊,則在步驟S111之后還包括:
S20:在第一目標(biāo)子鏈表中將目標(biāo)內(nèi)存塊刪除,并將目標(biāo)內(nèi)存塊的地址發(fā)送給分配進(jìn)程。
在上述實(shí)施例的基礎(chǔ)上,在步驟S20之后還包括:
S21:根據(jù)第二位圖判斷目標(biāo)內(nèi)存塊是否影響第二鏈表中對(duì)應(yīng)的伙伴塊,如果是,則進(jìn)入步驟S22,如果否,進(jìn)入步驟S14。
S22:刪除第二鏈表中目標(biāo)內(nèi)存塊對(duì)應(yīng)的伙伴塊。
由于第二鏈表中是包含特殊的伙伴塊,如果互為伙伴塊的一個(gè)內(nèi)存塊作為目標(biāo)內(nèi)存塊的話,則另一個(gè)內(nèi)存塊有可能會(huì)受到影響而不能存在于第二鏈表中。第二位圖指示第二鏈表中的內(nèi)存塊的狀態(tài),因此,需要通過第二位圖判斷目標(biāo)內(nèi)存塊是否影響第二鏈表中對(duì)應(yīng)的伙伴塊,如果影響,則需要?jiǎng)h除第二鏈表中目標(biāo)內(nèi)存塊對(duì)應(yīng)的伙伴塊。
在上述實(shí)施例的基礎(chǔ)上,如果Linux操作系統(tǒng)中未包含有符合內(nèi)存分配請(qǐng)求的內(nèi)存空間,則在步驟S10之后還包括:
S23:調(diào)用守護(hù)進(jìn)程以向Linux操作系統(tǒng)釋放內(nèi)存;返回步驟S10。
圖3為本發(fā)明實(shí)施例提供的一種Linux操作系統(tǒng)的內(nèi)存釋放方法的流程圖。Linux操作系統(tǒng)的內(nèi)存釋放方法,包括:
S30:確定當(dāng)前的待釋放內(nèi)存塊對(duì)應(yīng)的目標(biāo)級(jí)別。
S31:判斷第一鏈表中是否包含有當(dāng)前的待釋放內(nèi)存塊的伙伴塊。如果否,則進(jìn)入步驟S32。
其中,第一鏈表包含多個(gè)級(jí)別的第一子鏈表,分別用于存儲(chǔ)多個(gè)級(jí)別的內(nèi)存塊,第一鏈表的伙伴規(guī)則為:若兩個(gè)內(nèi)存塊的大小相同、物理位置相鄰且兩個(gè)內(nèi)存塊的地址除最后一位都相同時(shí),則兩個(gè)內(nèi)存塊互為伙伴塊,第一位圖指示第一鏈表中的內(nèi)存塊的狀態(tài)。
第二鏈表包含多個(gè)級(jí)別的第二子鏈表,分別用于存儲(chǔ)多個(gè)級(jí)別的內(nèi)存塊,第二鏈表的伙伴規(guī)則為:若兩個(gè)內(nèi)存塊的大小相同、物理位置相鄰且兩個(gè)內(nèi)存塊的地址除最后兩位都相同時(shí),則兩個(gè)內(nèi)存塊互為伙伴塊,第二位圖指示第二鏈表中的內(nèi)存塊的狀態(tài)。
當(dāng)有內(nèi)存釋放請(qǐng)求時(shí),首先要確定待釋放內(nèi)存塊的大小,以確定目標(biāo)級(jí)別,例如待釋放內(nèi)存塊的大小為512,則目標(biāo)級(jí)別就是9級(jí),需要在第一鏈表的第9級(jí)對(duì)應(yīng)的第一子鏈表中判斷是否有伙伴塊與其合并。如果沒有,則在第二鏈表中判斷是否有伙伴塊。由此可見,現(xiàn)對(duì)于現(xiàn)有技術(shù),提高了待釋放內(nèi)存塊合并的幾率,從而減小操作系統(tǒng)的內(nèi)存碎片。
S32:判斷第二鏈表中是否包含有當(dāng)前的待釋放內(nèi)存塊的伙伴塊。如果是,進(jìn)入步驟S33,如果否,則進(jìn)入步驟S34。
S33:合并當(dāng)前的待釋放內(nèi)存塊及其伙伴塊,并加入到第二鏈表相應(yīng)的第二子鏈表中。
可以理解的是,當(dāng)兩個(gè)內(nèi)存塊合并后,其等級(jí)就會(huì)+1,因此需要加入到下一級(jí)對(duì)應(yīng)的第二子鏈表中。另外,還需要修改第二位圖。
S34:將當(dāng)前的待釋放內(nèi)存塊加入到第一鏈表相應(yīng)的第一子鏈表中。
如果第二鏈表中也沒有相應(yīng)的伙伴塊,則說(shuō)明該待釋放內(nèi)存塊在當(dāng)前無(wú)法進(jìn)行合并,本發(fā)明中,將當(dāng)前的待釋放內(nèi)存塊加入到第一鏈表相應(yīng)的第一子鏈表中。例如,待釋放的內(nèi)存塊的級(jí)別為9級(jí),則加入到第一鏈表中9級(jí)對(duì)應(yīng)的第一子鏈表中。
本實(shí)施例提供的Linux操作系統(tǒng)的內(nèi)存釋放方法,在現(xiàn)有伙伴算法的數(shù)據(jù)結(jié)構(gòu)上,增加了第二鏈表和第二位圖,當(dāng)在第一鏈表中沒有實(shí)現(xiàn)將待釋放內(nèi)存塊合并時(shí),可以在第二鏈表中進(jìn)一步嘗試,減少了內(nèi)存釋放請(qǐng)求失敗的幾率。由于第二鏈表的伙伴規(guī)則與第一鏈表的伙伴規(guī)則不同,因此,能夠把一部分內(nèi)存塊由非伙伴關(guān)系變?yōu)榛锇殛P(guān)系,從而實(shí)現(xiàn)內(nèi)存塊的合并。由此可見,提高了待釋放內(nèi)存塊合并的幾率,減小了操作系統(tǒng)的內(nèi)存碎片。
圖4為本發(fā)明實(shí)施例提供的另一種Linux操作系統(tǒng)的內(nèi)存釋放方法的流程圖。在上述實(shí)施例的基礎(chǔ)上,步驟S31具體包括:
S310:根據(jù)目標(biāo)級(jí)別在第一鏈表中查找對(duì)應(yīng)的第一目標(biāo)子鏈表。
S311:判斷第一目標(biāo)子鏈表中是否包含有當(dāng)前的待釋放內(nèi)存塊的伙伴塊,如果是,則確定第一鏈表中包含有當(dāng)前的待釋放內(nèi)存塊的伙伴塊;如果否,則確定第一鏈表中未包含有當(dāng)前的待釋放內(nèi)存塊的伙伴塊。
在上述實(shí)施例的基礎(chǔ)上,如果第一目標(biāo)子鏈表中包含有當(dāng)前的待釋放內(nèi)存塊的伙伴塊,則步驟S311之后還包括:
步驟S35:合并當(dāng)前的待釋放內(nèi)存塊及其伙伴塊以作為新的待釋放內(nèi)存塊,并判斷當(dāng)前的待釋放內(nèi)存塊的級(jí)別是否小于最大級(jí)別;如果是,返回步驟S31,如果否,進(jìn)入步驟S34。
可以理解的是,如果在第一目標(biāo)子鏈表中包含了當(dāng)前待釋放內(nèi)存塊的伙伴塊,則合并之后就變?yōu)樾碌拇尫艃?nèi)存塊,只不過級(jí)別+1,此時(shí)當(dāng)前的待釋放內(nèi)存塊就是新的待釋放內(nèi)存塊。如果新的待釋放內(nèi)存塊的級(jí)別小于最大級(jí)別,則說(shuō)明還可以進(jìn)行合并,則返回步驟S31,如果是等于最大級(jí)別,則就不可以合并,流程結(jié)束。
以上對(duì)本發(fā)明所提供的提高系統(tǒng)的內(nèi)存分配和利用效率進(jìn)行了詳細(xì)介紹。說(shuō)明書中各個(gè)實(shí)施例采用遞進(jìn)的方式描述,每個(gè)實(shí)施例重點(diǎn)說(shuō)明的都是與其他實(shí)施例的不同之處,各個(gè)實(shí)施例之間相同相似部分互相參見即可。對(duì)于實(shí)施例公開的裝置而言,由于其與實(shí)施例公開的方法相對(duì)應(yīng),所以描述的比較簡(jiǎn)單,相關(guān)之處參見方法部分說(shuō)明即可。應(yīng)當(dāng)指出,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來(lái)說(shuō),在不脫離本發(fā)明原理的前提下,還可以對(duì)本發(fā)明進(jìn)行若干改進(jìn)和修飾,這些改進(jìn)和修飾也落入本發(fā)明權(quán)利要求的保護(hù)范圍內(nèi)。
專業(yè)人員還可以進(jìn)一步意識(shí)到,結(jié)合本文中所公開的實(shí)施例描述的各示例的單元及算法步驟,能夠以電子硬件、計(jì)算機(jī)軟件或者二者的結(jié)合來(lái)實(shí)現(xiàn),為了清楚地說(shuō)明硬件和軟件的可互換性,在上述說(shuō)明中已經(jīng)按照功能一般性地描述了各示例的組成及步驟。這些功能究竟以硬件還是軟件方式來(lái)執(zhí)行,取決于技術(shù)方案的特定應(yīng)用和設(shè)計(jì)約束條件。專業(yè)技術(shù)人員可以對(duì)每個(gè)特定的應(yīng)用來(lái)使用不同方法來(lái)實(shí)現(xiàn)所描述的功能,但是這種實(shí)現(xiàn)不應(yīng)認(rèn)為超出本發(fā)明的范圍。
結(jié)合本文中所公開的實(shí)施例描述的方法或算法的步驟可以直接用硬件、處理器執(zhí)行的軟件模塊,或者二者的結(jié)合來(lái)實(shí)施。軟件模塊可以置于隨機(jī)存儲(chǔ)器(RAM)、內(nèi)存、只讀存儲(chǔ)器(ROM)、電可編程ROM、電可擦除可編程ROM、寄存器、硬盤、可移動(dòng)磁盤、CD-ROM、或技術(shù)領(lǐng)域內(nèi)所公知的任意其它形式的存儲(chǔ)介質(zhì)中。