日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

malloc原理和内存碎片

發布時間:2025/3/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 malloc原理和内存碎片 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

當一個進程發生缺頁中斷的時候,進程會陷入內核態,執行以下操作:?
1、檢查要訪問的虛擬地址是否合法?
2、查找/分配一個物理頁?
3、填充物理頁內容(讀取磁盤,或者直接置0,或者啥也不干)?
4、建立映射關系(虛擬地址到物理地址)?
重新執行發生缺頁中斷的那條指令?
如果第3步,需要讀取磁盤,那么這次缺頁中斷就是majflt,否則就是minflt。?

內存分配的原理

從操作系統角度來看,進程分配內存有兩種方式,分別由兩個系統調用完成:brk和mmap(不考慮共享內存)。

1、brk是將數據段(.data)的最高地址指針_edata往高地址推;

2、mmap是在進程的虛擬地址空間中(堆和棧中間,稱為文件映射區域的地方)找一塊空閑的虛擬內存

?????這兩種方式分配的都是虛擬內存,沒有分配物理內存在第一次訪問已分配的虛擬地址空間的時候,發生缺頁中斷,操作系統負責分配物理內存,然后建立虛擬內存和物理內存之間的映射關系。


在標準C庫中,提供了malloc/free函數分配釋放內存,這兩個函數底層是由brk,mmap,munmap這些系統調用實現的。


下面以一個例子來說明內存分配的原理:

情況一、malloc小于128k的內存,使用brk分配內存,將_edata往高地址推(只分配虛擬空間,不對應物理內存(因此沒有初始化),第一次讀/寫數據時,引起內核缺頁中斷,內核才分配對應的物理內存,然后虛擬地址空間建立映射關系),如下圖:


?

1、進程啟動的時候,其(虛擬)內存空間的初始布局如圖1所示。 其中,mmap內存映射文件是在堆和棧的中間(例如libc-2.2.93.so,其它數據文件等),為了簡單起見,省略了內存映射文件。 _edata指針(glibc里面定義)指向數據段的最高地址。?
2、
進程調用A=malloc(30K)以后,內存空間如圖2: malloc函數會調用brk系統調用,將_edata指針往高地址推30K,就完成虛擬內存分配。 ????? 你可能會問:只要把_edata+30K就完成內存分配了? 事實是這樣的,_edata+30K只是完成虛擬地址的分配,A這塊內存現在還是沒有物理頁與之對應的,等到進程第一次讀寫A這塊內存的時候,發生缺頁中斷,這個時候,內核才分配A這塊內存對應的物理頁。也就是說,如果用malloc分配了A這塊內容,然后從來不訪問它,那么,A對應的物理頁是不會被分配的。?
3、
進程調用B=malloc(40K)以后,內存空間如圖3。

?

情況二、malloc大于128k的內存,使用mmap分配內存,在堆和棧之間找一塊空閑內存分配(對應獨立內存,而且初始化為0),如下圖:

?

4、進程調用C=malloc(200K)以后,內存空間如圖4: 默認情況下,malloc函數分配內存,如果請求內存大于128K(可由M_MMAP_THRESHOLD選項調節),那就不是去推_edata指針了,而是利用mmap系統調用,從堆和棧的中間分配一塊虛擬內存。 ????? 這樣子做主要是因為:: ??????brk分配的內存需要等到高地址內存釋放以后才能釋放(例如,在B釋放之前,A是不可能釋放的,這就是內存碎片產生的原因,什么時候緊縮看下面),而mmap分配的內存可以單獨釋放。 ??????當然,還有其它的好處,也有壞處,再具體下去,有興趣的同學可以去看glibc里面malloc的代碼了。?
5、進程調用D=malloc(100K)以后,內存空間如圖5;
6、進程調用free(C)以后,C對應的虛擬內存和物理內存一起釋放。

?

?

7、進程調用free(B)以后,如圖7所示: ??????? B對應的虛擬內存和物理內存都沒有釋放,因為只有一個_edata指針,如果往回推,那么D這塊內存怎么辦呢當然,B這塊內存,是可以重用的,如果這個時候再來一個40K的請求,那么malloc很可能就把B這塊內存返回回去了。?
8、進程調用free(D)以后,如圖8所示: ??????? B和D連接起來,變成一塊140K的空閑內存。 9、默認情況下: ?????? 當最高地址空間的空閑內存超過128K(可由M_TRIM_THRESHOLD選項調節)時,執行內存緊縮操作(trim)。在上一個步驟free的時候,發現最高地址空閑內存超過128K,于是內存緊縮,變成圖9所示。

總結

以上是生活随笔為你收集整理的malloc原理和内存碎片的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。