欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

內(nèi)存分配的方法及裝置的制作方法

文檔序號(hào):6376008閱讀:202來(lái)源:國(guó)知局
專(zhuān)利名稱(chēng):內(nèi)存分配的方法及裝置的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,具體而言,涉及內(nèi)存分配的方法及裝置。
背景技術(shù)
在如軟件編程的計(jì)算機(jī)應(yīng)用中,經(jīng)常涉及內(nèi)存資源的動(dòng)態(tài)申請(qǐng)和釋放。比如創(chuàng)建一個(gè)線程時(shí)需要為該線程分配??臻g,當(dāng)該線程被刪除時(shí)需要回收對(duì)應(yīng)的??臻g。關(guān)于內(nèi)存管理,業(yè)界已存在多種算法,各有其優(yōu)缺點(diǎn)。評(píng)價(jià)一款內(nèi)存算法的優(yōu)劣,主要有性能、利用率、可靠性、可格式化等要素。內(nèi)存算法主要分為靜態(tài)內(nèi)存算法、塊內(nèi)存算法、分割合并式內(nèi)存算法等幾大類(lèi)。靜態(tài)內(nèi)存算法性能很高,但只能申請(qǐng)內(nèi)存資源而不能釋放內(nèi)存資源,一般用在初始化階段。塊內(nèi)存算法性能也很高,可動(dòng)態(tài)申請(qǐng)或釋放內(nèi)存資源,但其可分配的內(nèi)存資源的大小受到內(nèi)存塊的大小的限制,而且利用率也比較差。分割合并式內(nèi)存算法可滿(mǎn)足任意大小的內(nèi)存資 源的申請(qǐng)或釋放,利用率也高,但現(xiàn)有算法的性能比較差。例如,一種塊內(nèi)存算法是指將內(nèi)存池等分成若干個(gè)頁(yè)申請(qǐng)內(nèi)存資源時(shí),若對(duì)應(yīng)內(nèi)存塊的塊類(lèi)型的鏈表不為空則從該鏈表中摘取一個(gè)內(nèi)存塊,否則申請(qǐng)一個(gè)空閑的內(nèi)存頁(yè),將該空閑的內(nèi)存頁(yè)按對(duì)應(yīng)的內(nèi)存塊的大小進(jìn)行等分,釋放內(nèi)存資源時(shí),若內(nèi)存頁(yè)中的所有內(nèi)存塊都空閑,則回收該內(nèi)存頁(yè)并掛入空閑的內(nèi)存頁(yè)的鏈表。但是,該算法會(huì)導(dǎo)致頁(yè)內(nèi)碎片與塊內(nèi)碎片,并且最大可申請(qǐng)的內(nèi)存資源的大小不能超過(guò)最大內(nèi)存塊的大小。例如,另一種塊內(nèi)存算法是指每個(gè)內(nèi)存塊的塊類(lèi)型都維護(hù)一個(gè)空閑鏈表申請(qǐng)內(nèi)存資源時(shí),先檢查對(duì)應(yīng)的鏈表是否為空,如果不為空則從鏈表中摘取一個(gè)內(nèi)存塊,否則根據(jù)分配指針再劃分一個(gè)當(dāng)前大小的內(nèi)存塊;釋放內(nèi)存資源時(shí),直接將當(dāng)前釋放的內(nèi)存塊掛到對(duì)應(yīng)塊類(lèi)型的空閑鏈表中。但是,該算法容易導(dǎo)致塊內(nèi)碎片,最大可申請(qǐng)的內(nèi)存資源的大小不能超過(guò)最大內(nèi)存塊的大小,并且已被劃分出的內(nèi)存塊不能格式化為其它塊類(lèi)型。例如,一種分割合并式內(nèi)存算法是指可按任意大小劃分內(nèi)存塊,并且當(dāng)內(nèi)存塊被釋放時(shí)可以對(duì)前后緊鄰的空閑內(nèi)存塊進(jìn)行合并。在該算法中,為了迅速查找到適合的內(nèi)存塊,將所有空閑內(nèi)存塊維護(hù)成一個(gè)平衡二叉樹(shù)。但是,該算法涉及二叉樹(shù)結(jié)點(diǎn)的申請(qǐng)、釋放、查找和平衡操作,因此性能比較差。

發(fā)明內(nèi)容
本發(fā)明實(shí)施例提出了內(nèi)存分配的方法及裝置,旨在解決現(xiàn)有內(nèi)存分配中無(wú)法兼具高性能、高利用率和申請(qǐng)任意內(nèi)存大小的問(wèn)題。一方面,提出了一種內(nèi)存分配的方法,包括將空閑內(nèi)存塊串接到相應(yīng)的空閑鏈表中,所述空閑鏈表的頭指針維護(hù)在大小為N的空閑鏈表頭數(shù)組中,所述空閑鏈表頭數(shù)組中頭指針指向的相應(yīng)的空閑鏈表的索引為n,其中所述N為正整數(shù),所述η為O至N-I的整數(shù),索引為η的空閑鏈表用于串接大小為X的空閑內(nèi)存塊,其中X大于或等于2η且小于或等于2η+1-1 ;當(dāng)申請(qǐng)的內(nèi)存的大小為Y時(shí),從索引為m+1的空閑鏈表開(kāi)始、在索引為m+1的空閑鏈表與索引為η的空閑鏈表之間確定第一個(gè)非空的空閑鏈表,其中所述m小于或等于N-l,Y大于或等于2m且小于或等于2m+1-l ;提取所述第一個(gè)非空的空閑鏈表中的第一個(gè)空閑內(nèi)存塊,按照所述申請(qǐng)的內(nèi)存的大小分配第一個(gè)空閑內(nèi)存塊。在第一方面的第一種可能的實(shí)現(xiàn)方式中,所述當(dāng)申請(qǐng)的內(nèi)存的大小為Y時(shí),從索引為m+1的空閑鏈表開(kāi)始、在索引為m+1的空閑鏈表與索引為η的空閑鏈表之間確定第一個(gè)非空的空閑鏈表包括當(dāng)申請(qǐng)的內(nèi)存的大小在2Π至2Π+1-1之間時(shí),從索引為m+1的空閑鏈表開(kāi)始、在索引為m+1的空閑鏈表與索引為η的空閑鏈表之間,通過(guò)與所述空閑鏈表頭數(shù)組對(duì)應(yīng)的位圖確定第一個(gè)非空的空閑鏈表,其中所述位圖中的每個(gè)位標(biāo)示所述空閑鏈表頭數(shù)組中對(duì)應(yīng)的空閑鏈表是否為空。結(jié)合第一方面或第一方面的第一種可能的實(shí)現(xiàn)方式,在第二種可能的實(shí)現(xiàn)方式中,還包括若所述第一個(gè)空閑內(nèi)存塊中存在未分配的剩余空閑內(nèi)存,根據(jù)所述剩余空閑內(nèi)存的大小將所述剩余空閑內(nèi)存對(duì)應(yīng)的空閑內(nèi)存塊串接到相應(yīng)的空閑鏈表中。結(jié)合第一方面或第一方面的第一種可能的實(shí)現(xiàn)方式或第一方面的第二種可能的實(shí)現(xiàn)方式,在第三種可能的實(shí)現(xiàn)方式中,所述將空閑內(nèi)存塊串接到相應(yīng)的空閑鏈表中包括以雙向鏈表的形式將所述空閑內(nèi)存塊串接到空閑鏈表中。結(jié)合第一方面或第一方面的第一種可能的實(shí)現(xiàn)方式或第一方面的第二種可能的實(shí)現(xiàn)方式或第一方面的第三種可能的實(shí)現(xiàn)方式,在第四種可能的實(shí)現(xiàn)方式中,所述將空閑內(nèi)存塊串接到相應(yīng)的空閑鏈表中包括在內(nèi)存釋放時(shí),合并地址相連的空閑內(nèi)存塊為新的空閑內(nèi)存塊,將所述新的空閑內(nèi)存塊串接到相應(yīng)的空閑鏈表中,其中所述空閑內(nèi)存塊的地址存儲(chǔ)在空閑內(nèi)存塊的控制頭中。第二方面,提出了一種內(nèi)存分配的裝置,包括串接單元,用于將空閑內(nèi)存塊串接到相應(yīng)的空閑鏈表中,所述空閑鏈表的頭指針維護(hù)在大小為N的空閑鏈表頭數(shù)組中,所述空閑鏈表頭數(shù)組中頭指針指向的相應(yīng)的空閑鏈表的索引為η,其中所述N為正整數(shù),所述η為O至N-I的整數(shù),索引為η的空閑鏈表用于串接大小為X的空閑內(nèi)存塊,其中X大于或等于2η且小于或等于2η+1-1 ;確定單元,用于當(dāng)申請(qǐng)的內(nèi)存的大小為Y時(shí),從索引為m+1的空閑鏈表開(kāi)始、在索引為m+1的空閑鏈表與索引為η的空閑鏈表之間確定第一個(gè)非空的空閑鏈表,其中所述m小于或等于N-1,Y大于或等于2m且小于或等于2m+1-l ;提取單元,用于提取所述第一個(gè)非空的空閑鏈表中的第一個(gè)空閑內(nèi)存塊,按照所述申請(qǐng)的內(nèi)存的大小分配第一個(gè)空閑內(nèi)存塊。在第二方面的第一種可能的實(shí)現(xiàn)方式中,所述確定單元用于當(dāng)申請(qǐng)的內(nèi)存的大小在2"'至2"1+1-1之間時(shí),從索引為m+1的空閑鏈表開(kāi)始、在索引為m+1的空閑鏈表與索引為η的空閑鏈表之間,通過(guò)與所述空閑鏈表頭數(shù)組對(duì)應(yīng)的位圖確定第一個(gè)非空的空閑鏈表,其中所述位圖中的每個(gè)位標(biāo)示所述空閑鏈表頭數(shù)組中對(duì)應(yīng)的空閑鏈表是否為空。結(jié)合第二方面或第二方面的第一種可能的實(shí)現(xiàn)方式,在第二種可能的實(shí)現(xiàn)方式中,所述串接單元還用于若所述第一個(gè)空閑內(nèi)存塊中存在未分配的剩余空閑內(nèi)存,根據(jù)所述剩余空閑內(nèi)存的大小將所述剩余空閑內(nèi)存對(duì)應(yīng)的空閑內(nèi)存塊串接到相應(yīng)的空閑鏈表中。結(jié)合第二方面或第二方面的第一種可能的實(shí)現(xiàn)方式或第二方面的第二種可能的 實(shí)現(xiàn)方式,在第三種可能的實(shí)現(xiàn)方式中,所述串接單元用于以雙向鏈表的形式將所述空閑內(nèi)存塊串接到空閑鏈表中。
結(jié)合第二方面或第二方面的第一種可能的實(shí)現(xiàn)方式或第二方面的第二種可能的實(shí)現(xiàn)方式或第二方面的第三種可能的實(shí)現(xiàn)方式,在第四種可能的實(shí)現(xiàn)方式中,所述串接單元具體用于在內(nèi)存釋放時(shí),合并地址相連的空閑內(nèi)存塊為新的空閑內(nèi)存塊,將所述新的空閑內(nèi)存塊串接到相應(yīng)的空閑鏈表中,其中所述空閑內(nèi)存塊的地址存儲(chǔ)在空閑內(nèi)存塊的控制頭中。由此可見(jiàn),本發(fā)明實(shí)施例由于采用空閑鏈表頭數(shù)組協(xié)助內(nèi)存分配,從而空閑內(nèi)存塊根據(jù)大小串接到空閑鏈表頭數(shù)組,可以在短時(shí)間內(nèi)查找到滿(mǎn)足申請(qǐng)大小的空閑內(nèi)存塊,并且通過(guò)鏈表串接空閑內(nèi)存塊有利于提聞性能。此外,本發(fā)明實(shí)施例能夠在具有聞性能的同時(shí),兼具碎片少、可申請(qǐng)任意內(nèi)存大小的特點(diǎn)。


為了更清楚地說(shuō)明本發(fā)明實(shí)施例的技術(shù)方案,下面將對(duì)本發(fā)明實(shí)施例中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面所描述的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他 的附圖。圖I是根據(jù)本發(fā)明實(shí)施例的內(nèi)存分配的方法的流程圖。圖2示出根據(jù)本發(fā)明實(shí)施例的內(nèi)存分配中空閑鏈表頭數(shù)組與位圖的關(guān)系。圖3示出了根據(jù)本發(fā)明實(shí)施例的內(nèi)存分配中空閑內(nèi)存塊的結(jié)構(gòu)示意圖。圖4是根據(jù)本發(fā)明實(shí)施例的內(nèi)存分配的裝置的結(jié)構(gòu)示意圖。圖5是根據(jù)本發(fā)明另一實(shí)施例的內(nèi)存分配的裝置的結(jié)構(gòu)示意圖。
具體實(shí)施例方式下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例是本發(fā)明的一部分實(shí)施例,而不是全部實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)的前提下所獲得的所有其他實(shí)施例,都應(yīng)屬于本發(fā)明保護(hù)的范圍。以下將結(jié)合附圖詳細(xì)描述本發(fā)明實(shí)施例的內(nèi)存分配的方法。如圖I所示,包括以下步驟。11,將空閑內(nèi)存塊串接到相應(yīng)的空閑鏈表中,所述空閑鏈表的頭指針維護(hù)在大小為N的空閑鏈表頭數(shù)組中,所述空閑鏈表頭數(shù)組中頭指針指向的相應(yīng)的空閑鏈表的索引為n,其中所述N為正整數(shù),所述η為O至(N-I)的整數(shù),索引為η的空閑鏈表用于串接大小為X (2η比特彡X ( 2η+1-1比特)的空閑內(nèi)存塊。具體而言,系統(tǒng)中存在多個(gè)空閑鏈表,該空閑鏈表的頭指針維護(hù)在空閑鏈表頭數(shù)組中。例如,該空閑鏈表頭數(shù)組的大小為N,也就是說(shuō)明共有N個(gè)空閑鏈表。將大小為N的空閑鏈表頭數(shù)組按照從小到大的順序編號(hào),例如從O至Ν-1。進(jìn)一步地,可以將順序編號(hào)η作為空閑鏈表的索弓I,以區(qū)分出每個(gè)空閑鏈表中串接的空閑內(nèi)存塊??梢詫⑵浯笮閄 (2η比特彡X ( 2η+1-1比特)的空閑內(nèi)存塊串接到索引為η的空閑鏈表中。例如,大小為I比特的空閑內(nèi)存塊串接到索引為O的空閑鏈表中;大小為2或3比特的空閑內(nèi)存塊串接到索引為I的空閑鏈表中;大小為4至7比特的空閑內(nèi)存塊串接到索引為2的空閑鏈表中;以此類(lèi)推,大小為2"至2n+1-l比特的空閑內(nèi)存塊串接到索引為η的空閑鏈表中。這樣,所有空閑內(nèi)存塊都可以串接到不同的空閑鏈表中,但由單一的空閑鏈表頭數(shù)組統(tǒng)一管理和串接,便于查找空閑內(nèi)存塊以及任意大小空閑內(nèi)存塊的申請(qǐng)。此外,空閑內(nèi)存塊還可以雙向鏈表的形式串接到空閑鏈表中,這樣當(dāng)某一空閑內(nèi)存塊插入空閑鏈表或從空閑鏈表中刪除時(shí),與其相關(guān)的串接在同一空閑鏈表中的空閑內(nèi)存塊能快速串接,以避免由于空閑內(nèi)存塊的移動(dòng)對(duì)性能造成的不利影響。12,當(dāng)申請(qǐng)的內(nèi)存的大小Y ((2m比特彡X彡2m+1_l比特)時(shí),從索引為(m+1)的空閑鏈表開(kāi)始、在索引為(m+1)的空閑鏈表與索引為η的空閑鏈表之間確定第一個(gè)非空的空閑鏈表,其中所述m小于或等于(Ν-1)。具體而言,當(dāng)確定需要申請(qǐng)的內(nèi)存的大小在2m比特至2m+1_l比特之間(其中,m小于或等于(N-I))時(shí),可以從索引為(m+1)的空閑鏈表開(kāi)始、在索引為(m+1)的空閑鏈表與索引為η的空閑鏈表之間進(jìn)行查找。例如,從索引(m+1)開(kāi)始,按照從小到大的索引的順序, 即(m+2)、(m+3)……,直到確定第一個(gè)非空的空閑鏈表。需要說(shuō)明的是,索引大于m的空閑鏈表中串接的空閑內(nèi)存塊的大小一定大于2m+1-l比特。也就是說(shuō),從索引為(m+1)的空閑鏈表開(kāi)始查找到的空閑內(nèi)存塊的大小可以滿(mǎn)足請(qǐng)求的內(nèi)存的大小2m比特至2m+1-l比特。那么,從索引為(m+1)的空閑鏈表開(kāi)始逐一查找得到的非空的空閑鏈表中串接的空閑內(nèi)存塊一定滿(mǎn)足請(qǐng)求的內(nèi)存的要求。進(jìn)一步地,為了減少確定第一個(gè)非空的空閑鏈表的時(shí)間,可以引入位圖(bitmap),該bitmap具有N個(gè)位,分別標(biāo)識(shí)空閑鏈表頭數(shù)組中對(duì)應(yīng)的N個(gè)空閑鏈表的狀態(tài),例如“O”是空的空閑鏈表,“I”表示非空的空閑鏈表。因此,當(dāng)申請(qǐng)的內(nèi)存的大小在。-至]1·+1-:比特之間時(shí),從索引為(m+1)的空閑鏈表開(kāi)始、在索引為(m+1)的空閑鏈表與索引為η的空閑鏈表之間,通過(guò)與所述空閑鏈表頭數(shù)組對(duì)應(yīng)的bitmap中各個(gè)位的值確定第一個(gè)非空的空閑鏈表,因?yàn)槲粓D中的每個(gè)位標(biāo)示所述空閑鏈表頭數(shù)組中對(duì)應(yīng)的空閑鏈表是否為空。例如,可以從索引為(m+1)的空閑鏈表對(duì)應(yīng)的位圖中的位開(kāi)始確定第一個(gè)“1”,該取值為“I”的位所標(biāo)示的空閑鏈表就是確定的第一個(gè)非空的空閑鏈表。13,提取所述第一個(gè)非空的空閑鏈表中的第一個(gè)空閑內(nèi)存塊,按照所述申請(qǐng)的內(nèi)存的大小分配第一個(gè)空閑內(nèi)存塊。若所述第一個(gè)空閑內(nèi)存塊中存在未分配的剩余空閑內(nèi)存,根據(jù)所述剩余空閑內(nèi)存的大小將所述剩余空閑內(nèi)存對(duì)應(yīng)的空閑內(nèi)存塊串接到相應(yīng)的空閑鏈表中。例如,申請(qǐng)的內(nèi)存大小Y為10比特,由于10比特在23比特至23+1_1比特之間,即m為3。根據(jù)步驟12確定的方法,從索引為4的空閑鏈表開(kāi)始查找第一個(gè)非空的空閑鏈表。例如確定索引為4的空閑鏈表為空、索引為5的空閑鏈表為非空,則從索引為5的空閑鏈表中確定第一個(gè)空閑內(nèi)存塊,假設(shè)為32比特。于是,提取該32比特,將其中10比特分配給申請(qǐng)的內(nèi)容,此時(shí)剩余空閑內(nèi)存為22比特。該剩余空閑內(nèi)存作為新的空閑內(nèi)存塊串接到對(duì)應(yīng)的空閑鏈表中,例如22比特在24比特至24+1-1比特之間,即m為4,也就是說(shuō),該新的空閑內(nèi)存塊將串接到索引為4的空閑鏈表中。如前所述,由于該索引為4的空閑鏈表之前為空,當(dāng)插入該新的空閑內(nèi)存塊之后,該索引為4的空閑鏈表將不為空,因此對(duì)應(yīng)的位圖中的位將從“O”變?yōu)椤癐”??梢岳斫?,在分配完內(nèi)存之后形成的新的空閑內(nèi)存塊串接到對(duì)應(yīng)的空閑鏈表中時(shí),若該對(duì)應(yīng)的空閑鏈表原不為空(即存在空閑內(nèi)存塊),那么該新的空閑內(nèi)存塊就順序地串接到該對(duì)應(yīng)空閑鏈表的最后。此外,由于每個(gè)空閑內(nèi)存塊的控制頭中保存有該空閑內(nèi)存塊的起始地址以及前后緊鄰的空閑內(nèi)存塊的起始地址等信息,因此每次當(dāng)內(nèi)存釋放時(shí),地址相連的空閑內(nèi)存塊將合并為新的空閑內(nèi)存塊,并被串接到相應(yīng)的空閑鏈表中,此時(shí)合并前的空閑內(nèi)存塊將從原來(lái)所在的空閑鏈表中刪除。由此可見(jiàn),本發(fā)明實(shí)施例可以在短時(shí)間內(nèi)查找到滿(mǎn)足申請(qǐng)大小的空閑內(nèi)存塊,并且通過(guò)鏈表串接空閑內(nèi)存塊有利于提高性能。此外,本發(fā)明實(shí)施例能夠在具有高性能的同時(shí),兼具碎片少、可申請(qǐng)任意內(nèi)存大小的特點(diǎn)。下面以最大內(nèi)存為4G比特為例,對(duì)本發(fā)明實(shí)施例的內(nèi)存分配的方法進(jìn)行具體描述。一般地,采用二進(jìn)制表示申請(qǐng)的內(nèi)存的大小,例如Ob {0}1χχχ,其中{0}表示I前 面可能有O個(gè)或多個(gè)零。容易理解,無(wú)論I后面的XXX是何內(nèi)容,如果將I變成10, XXX全部變成O,則總有10yyy>lxxx (這里yyy表示xxx的對(duì)應(yīng)位全部變成O)。在最大內(nèi)存為4G比特的情況中,內(nèi)存的大小最多為32位二進(jìn)制數(shù)。通常,可以通過(guò)匯編指令直接得到所有空閑內(nèi)存塊的最左邊的I的下標(biāo)(例如,0-31)。在一個(gè)空閑鏈表頭數(shù)組中維護(hù)空閑鏈表的頭指針,以空閑內(nèi)存塊的最左邊的I的下標(biāo)(在匯編指令中從高位到低位依次為31-0)作為空閑鏈表頭數(shù)組中空閑鏈表的數(shù)組索引,即將所有最左邊的I的下標(biāo)相同的空閑內(nèi)存塊掛接在同一個(gè)空閑鏈表中。如圖2所示,索引為2的空閑鏈表可掛接的空閑內(nèi)存塊的大小為4比特至7比特;索引為η的空閑鏈表可掛接的空閑內(nèi)存塊的大小為2η比特到2η+1-1比特。當(dāng)申請(qǐng)大小為UiSize的內(nèi)存時(shí),首先利用匯編指令得到最左邊的I的下標(biāo),假定為m。為確??臻e鏈表中的第一個(gè)空閑內(nèi)存塊就滿(mǎn)足uiSize,則從索引為m+1開(kāi)始搜索。若索引為m+Ι的空閑鏈表不為空,貝U取該空閑鏈表中的第一個(gè)空閑內(nèi)存塊。若索引為m+Ι的空閑鏈表為空,則判斷索引為m+2的空閑鏈表,依次類(lèi)推,直到找到非空的空閑鏈表或索引達(dá)到31。這里,m小于或等于30。為避免逐級(jí)判斷空閑鏈表是否為空,考慮定義一個(gè)32位的位圖全局變量(例如,其下標(biāo)值從高位到低位依次為0-31)。若索引為m的空閑鏈表非空,則位圖的下標(biāo)為m的位被置“1”,否則置“O”。位圖的下標(biāo)為31的位在初始化時(shí)直接置I。于是從索引為m+Ι的空閑鏈表開(kāi)始查找第一個(gè)非空的空閑鏈表,例如可以首先將位圖的副本的O到m位均置“0”,然后獲取副本的最左邊的I的下標(biāo),若不等于31,即為第一個(gè)非空的空閑鏈表的數(shù)組索引。如果硬件支持,位圖也可按獲取最右邊的I的方式處理。所有的空閑內(nèi)存塊都以雙向鏈表形式串接在空閑鏈表中。若從空閑鏈表中獲取的第一個(gè)空閑內(nèi)存塊比較大,即分割出一個(gè)大小為UiSize的內(nèi)存塊后,剩下的剩余空閑內(nèi)存仍至少可做一次最小分配,如圖3所示,即剩余空閑內(nèi)存的大小大于控制頭(CtrlHead)的大小,則將剩余空閑內(nèi)存形成的新的空閑內(nèi)存塊調(diào)整串接到對(duì)應(yīng)的空閑鏈表中。一般而言,空閑內(nèi)存都攜帶控制頭,該控制頭可以是實(shí)際的內(nèi)存控制頭或者內(nèi)存控制頭的指針或索引。由于控制頭中存儲(chǔ)有本空閑內(nèi)存塊的起始地址和大小、本空閑內(nèi)存塊的狀態(tài)(例如占用或空閑)以及前后緊鄰的空閑內(nèi)存塊的地址等,因此可以在內(nèi)存釋放過(guò)程中,根據(jù)上述地址信息可以將空閑內(nèi)存塊進(jìn)行合并。下面將結(jié)合圖4描述根據(jù)本發(fā)明實(shí)施例的內(nèi)存分配的裝置。在圖4中,內(nèi)存分配的裝置40包括串接單元41、確定單元42和提取單元43。其中,串接單元41用于將空閑內(nèi)存塊串接到相應(yīng)的空閑鏈表中,所述空閑鏈表的頭指針維護(hù)在大小為N的空閑鏈表頭數(shù)組中,所述空閑鏈表頭數(shù)組中頭指針指向的相應(yīng)的空閑鏈表的索引為n,其中所述N為正整數(shù),所述η為O至N-I的整數(shù),索引為η的空閑鏈表用于串接大小為X的空閑內(nèi)存塊,其中X大于或等于2η且小于或等于2η+1-1。可選地,串接單元41還用于若所述第一個(gè)空閑內(nèi)存塊中存在未分配的剩余空閑內(nèi)存,根據(jù)所述剩余空閑內(nèi)存的大小將所述剩余空閑內(nèi)存對(duì)應(yīng)的空閑內(nèi)存塊串接到相應(yīng)的空閑鏈表中??蛇x地,串接單元41用于以雙向鏈表的形式將所述空閑內(nèi)存塊串接到空閑鏈表 中??蛇x地,串接單元41具體用于在內(nèi)存釋放時(shí),合并地址相連的空閑內(nèi)存塊為新的空閑內(nèi)存塊,將所述新的空閑內(nèi)存塊串接到相應(yīng)的空閑鏈表中,其中所述空閑內(nèi)存塊的地址存儲(chǔ)在空閑內(nèi)存塊的控制頭中。確定單元42用于當(dāng)申請(qǐng)的內(nèi)存的大小為Y時(shí),從索引為m+Ι的空閑鏈表開(kāi)始、在索引為m+Ι的空閑鏈表與索引為N的空閑鏈表之間確定第一個(gè)非空的空閑鏈表,其中所述m小于或等于N-I,Y大于或等于2m且小于或等于2m+1-l。進(jìn)一步地,確定單元42可以用于當(dāng)申請(qǐng)的內(nèi)存的大小為Y時(shí),從索引為m+1的空閑鏈表開(kāi)始、在索引為m+Ι的空閑鏈表與索引為η的空閑鏈表之間,通過(guò)與所述空閑鏈表頭數(shù)組對(duì)應(yīng)的位圖確定第一個(gè)非空的空閑鏈表,其中所述位圖中的每個(gè)位標(biāo)示所述空閑鏈表頭數(shù)組中對(duì)應(yīng)的空閑鏈表是否為空。提取單元43用于提取所述第一個(gè)非空的空閑鏈表中的第一個(gè)空閑內(nèi)存塊,按照所述申請(qǐng)的內(nèi)存的大小分配所述第一個(gè)空閑內(nèi)存塊。由此可見(jiàn),本發(fā)明實(shí)施例可以在短時(shí)間內(nèi)查找到滿(mǎn)足申請(qǐng)大小的空閑內(nèi)存塊,并且通過(guò)鏈表串接空閑內(nèi)存塊有利于提高性能。此外,本發(fā)明實(shí)施例能夠在具有高性能的同時(shí),兼具碎片少、可申請(qǐng)任意內(nèi)存大小的特點(diǎn)。圖5是本發(fā)明的內(nèi)存分配的裝置50另一個(gè)實(shí)施例的示意框圖。裝置50包括處理器51、存儲(chǔ)器52、輸入設(shè)備53和輸出設(shè)備54等,通過(guò)總線相互通信。其中,處理器51調(diào)用存儲(chǔ)器52存儲(chǔ)的程序,可以執(zhí)行上述內(nèi)存分配方法實(shí)施例的各個(gè)步驟。處理器51用于執(zhí)行存儲(chǔ)器52存儲(chǔ)的本發(fā)明實(shí)施例的程序,并通過(guò)總線與其他裝置雙向通信。存儲(chǔ)器52可以是包括隨機(jī)存取存儲(chǔ)器(RAM,Random Access Memory)和只讀存儲(chǔ)器(ROM, Read-Only Memory)、或任何固定的存儲(chǔ)介質(zhì)、或可移動(dòng)的存儲(chǔ)介質(zhì),用于存儲(chǔ)可以執(zhí)行本發(fā)明實(shí)施例的程序和/或本發(fā)明實(shí)施例中待處理的數(shù)據(jù)。存儲(chǔ)器52和處理器51也可以整合成應(yīng)用本發(fā)明實(shí)施例的物理模塊,在該物理模塊上存儲(chǔ)和運(yùn)行實(shí)現(xiàn)該本發(fā)明實(shí)施例的程序??蛇x地,內(nèi)存分配的裝置50還可以包括輸入設(shè)備53和輸出設(shè)備54。例如,輸入設(shè)備53可以包括鍵盤(pán)、鼠標(biāo)等任何合適的裝置,用于接收用戶(hù)的輸入或來(lái)自其他設(shè)備的輸入,并發(fā)送給處理器51。例如,輸出設(shè)備54用于將音頻 信號(hào)的比特分配的結(jié)果輸出,可以是顯示器、打印機(jī)等。應(yīng)理解,在本發(fā)明實(shí)施例中,術(shù)語(yǔ)“和/或”僅僅是一種描述關(guān)聯(lián)對(duì)象的關(guān)聯(lián)關(guān)系,表示可以存在三種關(guān)系。例如,A和/或B,可以表示單獨(dú)存在A,同時(shí)存在A和B,單獨(dú)存在B這三種情況。另外,本文中字符“/”,一般表示前后關(guān)聯(lián)對(duì)象是一種“或”的關(guān)系。本領(lǐng)域普通技術(shù)人員可以意識(shí)到,結(jié)合本文中所公開(kāi)的實(shí)施例描述的各示例的單元及算法步驟,能夠以電子硬件、或者計(jì)算機(jī)軟件和電子硬件的結(jié)合來(lái)實(shí)現(xiàn)。這些功能究竟以硬件還是軟件方式來(lái)執(zhí)行,取決于技術(shù)方案的特定應(yīng)用和設(shè)計(jì)約束條件。專(zhuān)業(yè)技術(shù)人員可以對(duì)每個(gè)特定的應(yīng)用來(lái)使用不同方法來(lái)實(shí)現(xiàn)所描述的功能,但是這種實(shí)現(xiàn)不應(yīng)認(rèn)為超出本發(fā)明的范圍。所屬領(lǐng)域的技術(shù)人員可以清楚地了解到,為描述的方便和簡(jiǎn)潔,上述描述的系統(tǒng)、裝置和單元的具體工作過(guò)程,可以參考前述方法實(shí)施例中的對(duì)應(yīng)過(guò)程,在此不再贅述。在本申請(qǐng)所提供的幾個(gè)實(shí)施例中,應(yīng)該理解到,所揭露的系統(tǒng)、裝置和方法,可以通過(guò)其它的方式實(shí)現(xiàn)。例如,以上所描述的裝置實(shí)施例僅僅是示意性的,例如,所述單元的劃分,僅僅為一種邏輯功能劃分,實(shí)際實(shí)現(xiàn)時(shí)可以有另外的劃分方式,例如多個(gè)單元或組件可以結(jié)合或者可以集成到另一個(gè)系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點(diǎn),所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過(guò)一些接口,裝置或單元的間接耦合或通信連接,可以是電性,機(jī)械或其它的形式。所述作為分離部件說(shuō)明的單元可以是或者也可以不是物理上分開(kāi)的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)網(wǎng)絡(luò)單元上??梢愿鶕?jù)實(shí)際的需要選擇其中的部分或者全部單元來(lái)實(shí)現(xiàn)本實(shí)施例方案的目的。另外,在本發(fā)明各個(gè)實(shí)施例中的各功能單元可以集成在一個(gè)處理單元中,也可以是各個(gè)單元單獨(dú)物理存在,也可以?xún)蓚€(gè)或兩個(gè)以上單元集成在一個(gè)單元中。所述功能如果以軟件功能單元的形式實(shí)現(xiàn)并作為獨(dú)立的產(chǎn)品銷(xiāo)售或使用時(shí),可以存儲(chǔ)在一個(gè)計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中?;谶@樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說(shuō)對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分或者該技術(shù)方案的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來(lái),該計(jì)算機(jī)軟件產(chǎn)品存儲(chǔ)在一個(gè)存儲(chǔ)介質(zhì)中,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可以是個(gè)人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個(gè)實(shí)施例所述方法的全部或部分步驟。而前述的存儲(chǔ)介質(zhì)包括u盤(pán)、移動(dòng)硬盤(pán)、ROM、RAM、磁碟或者光盤(pán)等各種可以存儲(chǔ)程序代碼的介質(zhì)。以上所述,僅為本發(fā)明的具體實(shí)施方式
,但本發(fā)明的保護(hù)范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。因此,本發(fā)明的保護(hù)范圍應(yīng)所述以權(quán)利要求的保護(hù)范圍為準(zhǔn)。
權(quán)利要求
1.一種內(nèi)存分配的方法,其特征在于,包括 將空閑內(nèi)存塊串接到相應(yīng)的空閑鏈表中,所述空閑鏈表的頭指針維護(hù)在大小為N的空閑鏈表頭數(shù)組中,所述空閑鏈表頭數(shù)組中頭指針指向的相應(yīng)的空閑鏈表的索引為n,其中所述N為正整數(shù),所述η為O至N-I的整數(shù),索引為N的空閑鏈表用于串接大小為X的空閑內(nèi)存塊,其中X大于或等于2η且小于或等于2η+1-1 ; 當(dāng)申請(qǐng)的內(nèi)存的大小為Y時(shí),從索引為m+1的空閑鏈表開(kāi)始、在索引為m+1的空閑鏈表與索引為η的空閑鏈表之間確定第一個(gè)非空的空閑鏈表,其中所述m小于或等于N-1,Y大于或等于2m且小于或等于2m+1-l ; 提取所述第一個(gè)非空的空閑鏈表中的第一個(gè)空閑內(nèi)存塊,按照所述申請(qǐng)的內(nèi)存的大小分配所述第一個(gè)空閑內(nèi)存塊。
2.根據(jù)權(quán)利要求I所述的方法,其特征在于,所述當(dāng)申請(qǐng)的內(nèi)存的大小為Y時(shí),從索引為m+1的空閑鏈表開(kāi)始、在索引為m+1的空閑鏈表與索引為η的空閑鏈表之間確定第一個(gè)非空的空閑鏈表包括 當(dāng)申請(qǐng)的內(nèi)存的大小為Y時(shí),從索引為m+1的空閑鏈表開(kāi)始、在索引為m+1的空閑鏈表與索引為η的空閑鏈表之間,通過(guò)與所述空閑鏈表頭數(shù)組對(duì)應(yīng)的位圖確定第一個(gè)非空的空閑鏈表,其中所述位圖中的每個(gè)位標(biāo)示所述空閑鏈表頭數(shù)組中對(duì)應(yīng)的空閑鏈表是否為空。
3.根據(jù)權(quán)利要求I或2所述的方法,其特征在于,還包括 若所述第一個(gè)空閑內(nèi)存塊中存在未分配的剩余空閑內(nèi)存,根據(jù)所述剩余空閑內(nèi)存的大小將所述剩余空閑內(nèi)存對(duì)應(yīng)的空閑內(nèi)存塊串接到相應(yīng)的空閑鏈表中。
4.根據(jù)權(quán)利要求I至3中任一項(xiàng)所述的方法,其特征在于,所述將空閑內(nèi)存塊串接到相應(yīng)的空閑鏈表中包括 以雙向鏈表的形式將所述空閑內(nèi)存塊串接到空閑鏈表中。
5.根據(jù)權(quán)利要求I至4中任一項(xiàng)所述的方法,其特征在于,所述將空閑內(nèi)存塊串接到相應(yīng)的空閑鏈表中包括 在內(nèi)存釋放時(shí),合并地址相連的空閑內(nèi)存塊為新的空閑內(nèi)存塊,將所述新的空閑內(nèi)存塊串接到相應(yīng)的空閑鏈表中,其中所述空閑內(nèi)存塊的地址存儲(chǔ)在空閑內(nèi)存塊的控制頭中。
6.一種內(nèi)存分配的裝置,其特征在于,包括 串接單元,用于將空閑內(nèi)存塊串接到相應(yīng)的空閑鏈表中,所述空閑鏈表的頭指針維護(hù)在大小為N的空閑鏈表頭數(shù)組中,所述空閑鏈表頭數(shù)組中頭指針指向的相應(yīng)的空閑鏈表的索引為η,其中所述N為正整數(shù),所述η為O至N-I的整數(shù),索引為η的空閑鏈表用于串接大小為X的空閑內(nèi)存塊,其中X大于或等于2η且小于或等于2η+1-1 ; 確定單元,用于當(dāng)申請(qǐng)的內(nèi)存的大小為Y時(shí),從索引為m+1的空閑鏈表開(kāi)始、在索引為m+1的空閑鏈表與索引為η的空閑鏈表之間確定第一個(gè)非空的空閑鏈表,其中所述m小于或等于N-I,Y大于或等于2m且小于或等于2m+1-l ; 提取單元,用于提取所述第一個(gè)非空的空閑鏈表中的第一個(gè)空閑內(nèi)存塊,按照所述申請(qǐng)的內(nèi)存的大小分配所述第一個(gè)空閑內(nèi)存塊。
7.根據(jù)權(quán)利要求6所述的裝置,其特征在于,所述確定單元具體用于 當(dāng)申請(qǐng)的內(nèi)存的大小為Y時(shí),從索引為m+1的空閑鏈表開(kāi)始、在索引為m+1的空閑鏈表與索引為η的空閑鏈表之間,通過(guò)與所述空閑鏈表頭數(shù)組對(duì)應(yīng)的位圖確定第一個(gè)非空的空閑鏈表,其中所述位圖中的每個(gè)位標(biāo)示所述空閑鏈表頭數(shù)組中對(duì)應(yīng)的空閑鏈表是否為空。
8.根據(jù)權(quán)利要求6或7所述的裝置,其特征在于,所述串接單元還用于 若所述第一個(gè)空閑內(nèi)存塊中存在未分配的剩余空閑內(nèi)存,根據(jù)所述剩余空閑內(nèi)存的大小將所述剩余空閑內(nèi)存對(duì)應(yīng)的空閑內(nèi)存塊串接到相應(yīng)的空閑鏈表中。
9.根據(jù)權(quán)利要求6至8中任一項(xiàng)所述的裝置,其特征在于,所述串接單元具體用于 以雙向鏈表的形式將所述空閑內(nèi)存塊串接到空閑鏈表中。
10.根據(jù)權(quán)利要求6至9中任一項(xiàng)所述的裝置,其特征在于,所述串接單元具體用于 在內(nèi)存釋放時(shí),合并地址相連的空閑內(nèi)存塊為新的空閑內(nèi)存塊,將所述新的空閑內(nèi)存塊串接到相應(yīng)的空閑鏈表中,其中所述空閑內(nèi)存塊的地址存儲(chǔ)在空閑內(nèi)存塊的控制頭中。
全文摘要
本發(fā)明實(shí)施例提供內(nèi)存分配的方法和裝置。其中,方法包括將空閑內(nèi)存塊串接到相應(yīng)的空閑鏈表中,空閑鏈表的頭指針維護(hù)在大小為N的空閑鏈表頭數(shù)組中,空閑鏈表頭數(shù)組中頭指針指向的相應(yīng)的空閑鏈表的索引為n,索引為n的空閑鏈表用于串接大小為X的空閑內(nèi)存塊;當(dāng)申請(qǐng)的內(nèi)存的大小為Y時(shí),從索引為m+1的空閑鏈表開(kāi)始、在索引為m+1的空閑鏈表與索引為n的空閑鏈表之間確定第一個(gè)非空的空閑鏈表;提取第一個(gè)非空的空閑鏈表中的第一個(gè)空閑內(nèi)存塊,按照申請(qǐng)的內(nèi)存的大小分配第一空閑內(nèi)存塊。本發(fā)明能夠在具有高性能的同時(shí),兼具碎片少、可申請(qǐng)任意內(nèi)存大小的特點(diǎn)。
文檔編號(hào)G06F12/06GK102866954SQ20121031694
公開(kāi)日2013年1月9日 申請(qǐng)日期2012年8月31日 優(yōu)先權(quán)日2012年8月31日
發(fā)明者雷鎮(zhèn) 申請(qǐng)人:華為技術(shù)有限公司
網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
沙洋县| 平乡县| 恭城| 荥阳市| 莱阳市| 南岸区| 金寨县| 策勒县| 永清县| 获嘉县| 梁河县| 柳河县| 黎川县| 长寿区| 遂川县| 安达市| 英超| 克山县| 邢台市| 吉隆县| 望谟县| 新建县| 镇坪县| 上蔡县| 文化| 三门峡市| 稷山县| 咸宁市| 三河市| 庆安县| 准格尔旗| 青阳县| 呼伦贝尔市| 金塔县| 九台市| 南安市| 甘德县| 安吉县| 当雄县| 崇仁县| 韶关市|