新聞中心
Linux是一種廣泛使用的操作系統(tǒng),在各個(gè)領(lǐng)域中都有很多的應(yīng)用,特別是在服務(wù)器領(lǐng)域,Linux更是被廣泛采用。而對(duì)于一款操作系統(tǒng)的核心功能——內(nèi)存管理,更是需要相當(dāng)高的技術(shù)含量,其中內(nèi)存空間的分配就是其中的一個(gè)關(guān)鍵問題。Linux中的malloc函數(shù)就是用于分配內(nèi)存的函數(shù),而其實(shí)現(xiàn)原理可以說是相當(dāng)復(fù)雜。

10年積累的網(wǎng)站設(shè)計(jì)、做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有海棠免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
1. Linux中的內(nèi)存管理機(jī)制
在Linux中,每個(gè)進(jìn)程都有獨(dú)立的虛擬地址空間,在程序運(yùn)行時(shí),每個(gè)進(jìn)程都可以訪問自己的虛擬地址空間中的數(shù)據(jù)和代碼。而在C語言中,程序員可以使用malloc函數(shù)動(dòng)態(tài)地分配內(nèi)存空間,這個(gè)函數(shù)會(huì)在進(jìn)程的虛擬地址空間中申請(qǐng)一塊連續(xù)的內(nèi)存空間,并返回該內(nèi)存空間的首地址。
Linux中的內(nèi)存管理機(jī)制是通過內(nèi)核對(duì)虛擬地址空間進(jìn)行管理,對(duì)于每個(gè)進(jìn)程中的每個(gè)頁面,內(nèi)核都會(huì)記錄該頁面的狀態(tài),例如是否為空閑、是否已占用等等。當(dāng)程序員調(diào)用malloc函數(shù)時(shí),內(nèi)核會(huì)按照一定的規(guī)則在內(nèi)存空間中尋找足夠大的空閑內(nèi)存塊,并將其分配給程序。這個(gè)規(guī)則主要依賴于malloc函數(shù)所使用的算法。
2. 算法分析
Malloc函數(shù)實(shí)現(xiàn)的主要算法有兩種:分別是“首次適配算法”和“更佳適配算法”。在實(shí)際的Linux內(nèi)存管理中,malloc函數(shù)一般采用的是“首次適配算法”,下面將詳細(xì)介紹該算法的具體實(shí)現(xiàn)過程。
首次適配算法的實(shí)現(xiàn)過程如下:當(dāng)調(diào)用malloc函數(shù)時(shí),內(nèi)存管理系統(tǒng)會(huì)搜索整個(gè)內(nèi)存空間,查找一塊足夠大的空閑內(nèi)存塊(大小與程序請(qǐng)求內(nèi)存的大小相等或稍大)。這個(gè)搜索過程是從虛擬地址空間的開始地址開始的,因此,被分配的內(nèi)存塊通常位于較低的內(nèi)存地址。程序員使用返回值指定的內(nèi)存塊來存儲(chǔ)程序的數(shù)據(jù)。如果一個(gè)相對(duì)較小的內(nèi)存塊與程序請(qǐng)求的相等,那么,未分配的余量將保留在這個(gè)內(nèi)存塊的末端。這個(gè)內(nèi)存空間不會(huì)再被分配,直到程序釋放它,并把這個(gè)空閑塊標(biāo)記為空閑。
每個(gè)內(nèi)存塊被記錄在一個(gè)鏈表的節(jié)點(diǎn)上。這個(gè)鏈表就是內(nèi)存管理系統(tǒng)跟蹤空閑塊和已分配塊的。當(dāng)一個(gè)新的內(nèi)存塊被分配時(shí),它將從空閑塊鏈表中刪除。而如果一塊已分配的內(nèi)存被釋放了,那么它將被放回空閑塊鏈表,成為空閑塊。
3. 實(shí)現(xiàn)細(xì)節(jié)
malloc函數(shù)的實(shí)現(xiàn)并不是一個(gè)簡(jiǎn)單的過程,它涉及到了很多復(fù)雜的細(xì)節(jié)。下面我們將對(duì)其實(shí)現(xiàn)細(xì)節(jié)進(jìn)行詳細(xì)的介紹。
(1)Chunk
在實(shí)現(xiàn)malloc函數(shù)時(shí),內(nèi)存塊是通過一個(gè)名為Chunk的結(jié)構(gòu)體來管理的。
“`
struct chunk_info{
size_t prev_size;
size_t size;
struct chunk_info *fd;
struct chunk_info *bk;
};
“`
在函數(shù)中,一個(gè)新的Chunk被創(chuàng)建時(shí),需要設(shè)置prev_size、size、fd和bk這四個(gè)成員變量的值。prev_size指向上一個(gè)Chunk的大小,size指的是當(dāng)前Chunk的大小,fd表示在空閑列表中的下一個(gè)Chunk,bk則表示在空閑列表中的上一個(gè)Chunk。
(2)Null Chunk
空閑列表中的鏈表是由多個(gè)Chunk組成的,而空閑列表中的最后一個(gè)Chunk稱為“Null Chunk”,其fd和bk的值為自身的地址,以此標(biāo)識(shí)該Chunk為鏈表的最后一個(gè)節(jié)點(diǎn)。
(3)Chunk大小
當(dāng)使用malloc函數(shù)創(chuàng)建內(nèi)存塊時(shí),需要指定一個(gè)大小。經(jīng)過實(shí)驗(yàn)發(fā)現(xiàn),當(dāng)Chunk的大小小于等于32KB時(shí),Chunk大小的計(jì)算方式如下:
“`
if (size
else if (size
else { size = (size + 31) & ~31; }
“`
當(dāng)Chunk的大小大于32KB時(shí),Chunk大小的計(jì)算方式如下:
“`
if (size
else { size = (size + 511) & ~511; }
“`
(4)Chunk分配策略
在調(diào)用malloc函數(shù)時(shí),需要指定需要分配的內(nèi)存大小,在實(shí)際分配中,會(huì)根據(jù)該大小搜索空閑列表,找到之一個(gè)滿足條件的Chunk,并將其用于分配所需內(nèi)存。如果剛好滿足要求,那么將直接返回該Chunk;如果不滿足,那么根據(jù)Chunk的大小分成兩個(gè)Chunk,一個(gè)用于分配內(nèi)存,另一個(gè)用于保存剩余的內(nèi)存。如果 Chunk 的大小足夠小,那么就不再分割。
(5)合并前后的Chunk
當(dāng)Chunk被釋放時(shí),會(huì)將空閑的Chunk加入到空閑列表中,并查看該Chunk前后是否也是空閑的Chunk,如果是,那么將前后的Chunk與當(dāng)前的Chunk合并為一個(gè)更大的Chunk,并更新鏈表的指向。
4. 小結(jié)
Linux系統(tǒng)的malloc函數(shù)是非常重要的內(nèi)存分配函數(shù),其實(shí)現(xiàn)也非常復(fù)雜。在其實(shí)現(xiàn)中,主要采用了首次適配算法,通過Chunk來管理內(nèi)存。除此之外,還有很多細(xì)節(jié)需要注意,例如Chunk的大小、分配策略和合并前后的Chunk等等。在實(shí)際工程應(yīng)用中,如果需要優(yōu)化Linux系統(tǒng)的內(nèi)存使用效率,就需要深入了解Linux的內(nèi)存分配機(jī)制,針對(duì)其實(shí)現(xiàn)原理展開針對(duì)性優(yōu)化,才能達(dá)到更優(yōu)結(jié)果。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗(yàn)豐富以策略為先導(dǎo)10多年以來專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),響應(yīng)式網(wǎng)站制作,設(shè)計(jì)師量身打造品牌風(fēng)格,熱線:028-86922220linux malloc內(nèi)存越界
很明顯,int *ab=new int;對(duì)ab只能操作下標(biāo)從到的,但你在for(int ks=0;ks,越界操作。在windows下運(yùn)行時(shí)沒有問題,只是碰巧越遲汪界操作的亂手內(nèi)存是沒用的內(nèi)存。嘩旦嫌關(guān)于linux malloc 實(shí)現(xiàn)的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都網(wǎng)站建設(shè)選創(chuàng)新互聯(lián)(?:028-86922220),專業(yè)從事成都網(wǎng)站制作設(shè)計(jì),高端小程序APP定制開發(fā),成都網(wǎng)絡(luò)營銷推廣等一站式服務(wù)。
分享文章:深入探究:Linuxmalloc內(nèi)存分配的實(shí)現(xiàn)原理(linuxmalloc實(shí)現(xiàn))
新聞來源:http://m.fisionsoft.com.cn/article/coighso.html


咨詢
建站咨詢
