日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

malloc 两种实现方式:brk 和 mmap

發(fā)布時間:2024/10/14 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 malloc 两种实现方式:brk 和 mmap 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

答案

從操作系統(tǒng)角度來看,進程分配內(nèi)存有兩種方式,分別由兩個系統(tǒng)調(diào)用完成:brk mmap(不考慮共享內(nèi)存)。

  • brk 的實現(xiàn)方式是將 Data Segment 的最高地址指針 _edata 往高地址推(分配的內(nèi)存小于 128k )。
  • mmap 的實現(xiàn)方式是在 Memory Mapping Segment 找一塊空閑的虛擬內(nèi)存(分配的內(nèi)存大于 128k )。
  • (Data segment 和 Memory Mapping Segment 的相關(guān)內(nèi)容查看這里。)

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

    在標準 C 庫中,提供了 malloc / free 函數(shù)分配釋放內(nèi)存,這兩個函數(shù)底層是由 brk,mmap,munmap 這些系統(tǒng)調(diào)用實現(xiàn)的。

    栗子

    1、進程調(diào)用 A = malloc ( 30k ) 以后,內(nèi)存空間如下圖所示。malloc 函數(shù)會調(diào)用 brk 系統(tǒng)調(diào)用,將 _edata 指針往高地址推 30K,就完成虛擬內(nèi)存分配。

    你可能會問:只要把_edata + 30K 就完成內(nèi)存分配了?

    事實是這樣的,_edata + 30K 只是完成虛擬地址的分配,A 這塊內(nèi)存現(xiàn)在還是沒有物理頁與之對應(yīng)的,等到進程第一次讀寫 A 這塊內(nèi)存的時候,發(fā)生缺頁中斷,這個時候,內(nèi)核才分配 A 這塊內(nèi)存對應(yīng)的物理頁。也就是說,如果用 malloc 分配了 A 這塊內(nèi)容,然后從來不訪問它,那么,A 對應(yīng)的物理頁是不會被分配的。?

    ?

    2、進程調(diào)用 B = malloc(40K) 以后,內(nèi)存空間如下圖所示。

    3、當?malloc 分配大于 128k 的內(nèi)存時,使用 mmap 分配內(nèi)存。在堆和棧之間找一塊空閑內(nèi)存分配(對應(yīng)獨立內(nèi)存,而且初始化為 0 )。

    這么做的原因是 brk 分配的內(nèi)存需要等到高地址內(nèi)存釋放以后才能釋放(例如,在 B 釋放之前,A 是不可能釋放的,這就是內(nèi)存碎片產(chǎn)生的原因,什么時候收縮看下面),而 mmap 分配的內(nèi)存可以單獨釋放。,如下圖所示,這里分配 200k 。

    4、進程調(diào)用 D = malloc(100k) 以后,內(nèi)存空間如下圖所示。

    5、進程調(diào)用 free(C) 以后,C 對應(yīng)的虛擬內(nèi)存和物理內(nèi)存一起釋放

    6、進程調(diào)用 free(B) 以后,如下圖所示,B 對應(yīng)的虛擬內(nèi)存和物理內(nèi)存都沒有釋放,因為只有一個 _edata 指針,如果往回推,那么 D 這塊內(nèi)存怎么辦呢?當然,B 這塊內(nèi)存是可以重用的,如果這個時候再來一個 40K 的請求,那么 malloc 很可能就將?B 這塊內(nèi)存返回的。?

    7、進程調(diào)用 free(D) 以后,如下圖所示,B 和 D 連接起來變成一塊 140K 的空閑內(nèi)存。當最高地址空間的空閑內(nèi)存超過128K(可由 M_TRIM_THRESHOLD 選項調(diào)節(jié))時,執(zhí)行內(nèi)存緊縮操作(trim)。在上一個步驟 free 的時候,發(fā)現(xiàn)最高地址空閑內(nèi)存超過 128 K,于是內(nèi)存緊縮,如下圖所示。

    ?

    ?

    (SAW:Game Over!)

    總結(jié)

    以上是生活随笔為你收集整理的malloc 两种实现方式:brk 和 mmap的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。