進程的內(nèi)存布局

進程的內(nèi)存布局

內(nèi)存地址由高到低依次是:

  • kernel space
  • stack:向下增長
  • dynamic libraries:共享庫載入的空間
  • heap:向上增長
  • read/write sections(.data .bss):屬于可執(zhí)行文件映像
  • readonly sections(.init .rodata .text):屬于可執(zhí)行文件映像
  • reserved:內(nèi)存中受到保護而禁止訪問的內(nèi)存區(qū)域

動態(tài)庫和棧之間扬虚,動態(tài)庫和堆之間仍有可使用的空間肝匆,因此棧和堆才能增長。此外,其他區(qū)域之間也并不是一定是連續(xù)的拉盾。

段錯誤(segment default):非法指針解引用所引起的錯誤鲫凶。例如座哩,指針指向不允許讀寫的地址聂使,或者指針指向的地址并沒有映射到實際的物理內(nèi)存。

多線程下的內(nèi)存布局

上面所說的內(nèi)存布局是《程序員的自我修養(yǎng)》上講的汰规,在《Linux環(huán)境編程》上提到了多線程進程的內(nèi)存布局:


《Linux環(huán)境編程》插圖7-7

mmap區(qū)域指的是執(zhí)行系統(tǒng)調(diào)用mmap()所分配出來的區(qū)域汤功,這塊區(qū)域又稱為文件映射區(qū)。mmap()的作用是向操作系統(tǒng)申請一塊虛擬地址空間溜哮√辖穑可以指定某個文件來填充這塊空間(文件映射),也可以不指定(分配匿名空間)茂嗓。

mmap()調(diào)用后餐茵,僅僅是消耗了虛擬地址空間,創(chuàng)建/更改了內(nèi)存映射所需的數(shù)據(jù)結(jié)構(gòu)(頁表)述吸,并沒有映射到物理頁忿族。當進程后續(xù)訪問這些虛擬地址的時候,會發(fā)現(xiàn)這些虛擬內(nèi)存頁沒有對應(yīng)的物理頁,然后發(fā)生頁錯誤(Page Default)道批。在處理頁錯誤的過程中才分配物理頁(如果調(diào)用mmap時指定了文件错英,就把磁盤中的文件拷貝到物理頁中),并建立映射屹徘。此時分配的虛擬內(nèi)存才變得真正可用走趋。

頁錯誤也是缺頁中斷衅金。除了第一次訪問mmap分配的頁(因為沒有映射到物理頁)會引發(fā)頁錯誤外噪伊,后續(xù)訪問時,如果物理頁已經(jīng)換出到外存氮唯,也會引發(fā)頁錯誤鉴吹。

glibc中malloc的實現(xiàn)

在標準C庫中,提供了malloc函數(shù)來分配一塊虛擬內(nèi)存空間惩琉。

glibc下malloc獲取的空間的來源有兩個:brk系統(tǒng)調(diào)用豆励,mmap系統(tǒng)調(diào)用。
(有人把malloc管理的空間統(tǒng)稱為堆瞒渠,也有人只把brk系統(tǒng)調(diào)用分配的空間稱之為堆良蒸,下面說的都取前者的含義)

  1. brk的作用是設(shè)置進程數(shù)據(jù)段的結(jié)束地址。如果把數(shù)據(jù)段的結(jié)束地址向高地址移動伍玖,那么擴大的那部分空間就可以拿來作為堆空間使用嫩痰。
  2. mmap是在進程的虛擬地址空間中(brk分配的空間和棧之間的一塊內(nèi)存,稱為文件映射區(qū))分配一塊空閑的虛擬內(nèi)存窍箍。

對于小于128KB的請求串纺,malloc會在現(xiàn)有的堆空間里面,按照堆分配算法分配一塊空間并返回椰棘;對于大于128KB的請求纺棺,malloc會使用mmap系統(tǒng)調(diào)用分配一塊匿名空間,然后在這塊匿名空間中為用戶分配空間邪狞。

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

Reference

  1. Does mmap really copy data to the memory?
  2. Does Malloc only use the heap if requested memory space is large?
  3. http://man7.org/linux/man-pages/man2/mmap.2.html
  4. https://blog.csdn.net/gfgdsg/article/details/42709943
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罪郊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子尚洽,更是在濱河造成了極大的恐慌悔橄,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異癣疟,居然都是意外死亡挣柬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門睛挚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邪蛔,“玉大人,你說我怎么就攤上這事扎狱〔嗟剑” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵淤击,是天一觀的道長匠抗。 經(jīng)常有香客問我,道長污抬,這世上最難降的妖魔是什么汞贸? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮印机,結(jié)果婚禮上矢腻,老公的妹妹穿的比我還像新娘。我一直安慰自己射赛,他們只是感情好多柑,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咒劲,像睡著了一般顷蟆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腐魂,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天帐偎,我揣著相機與錄音,去河邊找鬼蛔屹。 笑死削樊,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的兔毒。 我是一名探鬼主播漫贞,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼育叁!你這毒婦竟也來了迅脐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤豪嗽,失蹤者是張志新(化名)和其女友劉穎谴蔑,沒想到半個月后豌骏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡隐锭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年窃躲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钦睡。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蒂窒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出荞怒,到底是詐尸還是另有隱情洒琢,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布挣输,位于F島的核電站纬凤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏撩嚼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一挖帘、第九天 我趴在偏房一處隱蔽的房頂上張望完丽。 院中可真熱鬧,春花似錦拇舀、人聲如沸逻族。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽聘鳞。三九已至,卻和暖如春要拂,著一層夾襖步出監(jiān)牢的瞬間抠璃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工脱惰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留搏嗡,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓拉一,卻偏偏與公主長得像采盒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蔚润,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355