為什么需要虛擬內存?虛擬內存的概念與實現(xiàn)_第1頁
為什么需要虛擬內存?虛擬內存的概念與實現(xiàn)_第2頁
為什么需要虛擬內存?虛擬內存的概念與實現(xiàn)_第3頁
為什么需要虛擬內存?虛擬內存的概念與實現(xiàn)_第4頁
為什么需要虛擬內存?虛擬內存的概念與實現(xiàn)_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第第頁為什么需要虛擬內存?虛擬內存的概念與實現(xiàn)面試的時候經(jīng)常會被問到malloc的實現(xiàn)。從(操作系統(tǒng))層面來說,malloc確實是考察面試者對操作系統(tǒng)底層的存儲管理理解的一個很好的方式,涉及到虛擬內存、分頁/分段等。下面逐個細說。

1.虛擬內存

首先需要知道的是程序運行起來的話需要被加載的物理內存中,具體到計算機(硬件)就是內存條。操作系統(tǒng)啟動的時候先把自己加載到物理內存的固定位置(一般為底部),物理內存的其他位置就用來運行用戶程序。程序就是一堆指令,程序運行可以簡單抽象為把指令加載到內存中,然后(CPU)將指令從內存載入執(zhí)行。

1.為什么需要虛擬內存?

CPU對內存的尋址最簡單的方式就是直接使用物理內存地址,這種方式一般叫做物理尋址。早期的PC使用物理尋址,而且像(數(shù)字信號)(處理器)、(嵌入式)(微控制器)也使用物理尋址。物理尋址的好處是簡單,壞處也有很多,比如:

不安全:操作系統(tǒng)的地址直接暴露給用戶程序,用戶程序可以破壞操作系統(tǒng)。這種解決方案是采用特殊的硬件保護。

同時運行多個程序比較困難:多個用戶程序如果都直接引用物理地址,很容易互相干擾。那么是不是可以通過不斷交換物理內存和磁盤來保證物理內存某一時間自由一個程序在運行呢?當時是可以的,但是這引入很多不必要和復雜的工作。

用戶程序大小受限:受制于物理內存大小。我們現(xiàn)在的錯覺是應用程序大小都小于物理內存,這主要是因為現(xiàn)在PC的物理內存都比較大。實際上只有1G物理內存的PC是可以運行2G的應用程序的。

說明:

1、chunk指針指向chunk開始的地址;mem指針指向用戶內存塊開始的地址。

2、p=0時,表示前一個chunk為空閑,prev_size才有效

3、p=1時,表示前一個chunk正在使用,prev_size無效p主要用于內存塊的合并操作;ptmalloc分配的第一個塊總是將p設為1,以防止程序引用到不存在的區(qū)域

4、M=1為mmap映射區(qū)域分配;M=0為heap區(qū)域分配

5、A=0為主分配區(qū)分配;A=1為非主分配區(qū)分配。

空閑的chunk:

1.fastbins。

程序在運行時會經(jīng)常需要申請和釋放一些較小的內存空間。當分配器合并了相鄰的幾個小的chunk之后,也許馬上就會有另一個小塊內存的請求,這樣分配器又需要從大的空閑內存中切分出一塊,這樣無疑是比較低效的,故而,malloc中在分配過程中引入了fastbins,

fastbins是bins的高速緩沖區(qū),大約有10個定長隊列。每個fastbin都記錄著一條freechunk的單鏈表(稱為binlist,采用單鏈表是出于fastbin中鏈表中部的chunk不會被摘除的特點),增刪chunk都發(fā)生在鏈表的前端。fastbins記錄著大小以8字節(jié)遞增的bin鏈表。

當用戶釋放一塊不大于max_fast(默認值64B)的chunk的時候,會默認會被放到fastbins上。當需要給用戶分配的chunk小于或等于max_fast時,malloc首先會到fastbins上尋找是否有合適的chunk,

除非特定情況,兩個毗連的空閑chunk并不會被合并成一個空閑chunk。不合并可能會導致碎片化問題,但是卻可以大大加速釋放的過程!

分配時,binlist中被檢索的第一個chunk將被摘除并返回給用戶。free掉的chunk將被添加在索引到的binlist的前端。

fastbin–>unsortedbin–>smallbin–>largebin–>topchunk–>擴展堆

內存回收流程

獲取分配區(qū)的鎖,保證線程安全。

如果free的是空指針,則返回,什么都不做。

判斷當前chunk是否是mmap映射區(qū)域映射的內存,如果是,則直接munmap()釋放這塊內存。前面的已使用chunk的數(shù)據(jù)結構中,我們可以看到有M來標識是否是mmap映射的內存。

判斷chunk是否與topchunk相鄰,如果相鄰,則直接和topchunk合并(和topchunk相鄰相當于和分配區(qū)中的空閑內存塊相鄰)。轉到步驟8

如果chunk的大小大于max_fast(64b),則放入unsortedbin,并且檢查是否有合并,有合并情況并且和topchunk相鄰,則轉到步驟8;沒有合并情況則free。

如果chunk的大小小于max_fast(64b),則直接放入fastbin,fastbin并沒有改變chunk的狀態(tài)。沒有合并情況,則free;有合并情況,轉到步驟7

在fastbin,如果當前chunk的下一個chunk也是空閑的,則將這兩個chunk合并,放入unsortedbin上面。合并后的大小如果大于64B,會觸發(fā)進行fastbins的合并操作,fastbins中的chunk將被遍歷,并與相鄰的空閑chunk進行合并,合并后的chunk會被放到unsortedbin中,fastbin會變?yōu)榭?。合并后的chunk和topchunk相鄰,則會合并到topchunk中。轉到步驟8

判斷topchunk的大小是否大于mmap收縮閾值(默認為128KB),如果是的話,對于主分配區(qū),則會試圖歸還topchunk中的一部分給操作系統(tǒng)。free結束。

使用注意事項

為了避免Glibc內存暴增,需要注意:

1.后分配的內存先釋放,因為ptmalloc收縮內存是從topchunk開始,如果與topchunk相鄰的chunk不能釋放,topchunk以下的chunk都無法釋放。

2.Ptmalloc不適合用于管理長生命周期的內存,特別是持續(xù)不定期分配和釋放長生命周期的內存,這將導致ptmalloc內存暴增。

3.不要關閉ptmalloc的mmap分配閾值動態(tài)調整機制,因為這種機制保證了短生命周期的內存分配盡量從ptmalloc緩存的內存chunk中分配,更高效,浪費更少的內存。

4.多線程分階段執(zhí)行的程序不適合用ptmalloc,這種程序的內存更適合用內存池管理

5.盡量減少程序的線程數(shù)量和避免頻繁分配/釋放內存。頻繁分配,會導致鎖的競爭,最終導致非主分配區(qū)增加,內存碎片增高,并且性能降低。

6.防止內存泄露,ptmalloc對內存泄露是相當敏感的,根據(jù)它的內存收縮機制,如果與topchunk相鄰的那個chunk沒有回收,將導致topchunk一下很多的空閑內存都無法返回給操作系統(tǒng)。

7.防止程序分配過多的內存,或是由于glibc內存暴增,導致

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論