malloc 的實現涉及物理記憶體,虛擬記憶體?

時間 2021-05-31 22:09:33

1樓:jiajiangfei

最近也看了一些記憶體管理的文章。malloc的實現我覺的題主不妨可以這樣理解。對於32位作業系統,每乙個程序都有32bit的虛擬位址空間。

當malloc的時候,隨便從自己的4G的虛擬位址空間裡面拿出來一塊這時候並沒有真的實體地址給分配出來,從上面Target的驗證結果來看也是這樣。然後當你拿到這個虛擬位址準備讀寫的時候就會產生缺頁中斷,然後系統呼叫缺頁中斷函式把你要訪問的虛擬位址給分配乙個物理記憶體位址,這樣你就可以使用了。

2樓:葉嘉誠

要回答這個問題,首先要介紹一點作業系統記憶體管理的基礎:

所有執行在現代作業系統上的應用程式所得到的記憶體位址都是虛擬位址,都需要通過作業系統和硬體層面的位址翻譯機制才能對應到物理記憶體的實際位址。物理記憶體實際被分為了若干區塊,被稱為「頁」。作業系統的任務是將這些頁分配給不同程序,而分配的方式就是在這些程序請求訪問和寫入某個虛擬位址的時候,把這個虛擬位址所屬的區域對應到實體地址裡的某一頁,以此完成位址翻譯。

基於上述事實,乙個典型的malloc函式實現通常包含乙個底部虛擬位址(可以使用系統呼叫mmap)和一小部分初始空間(可以使用系統呼叫sbrk獲得更多空間)。作業系統會負責這些虛擬位址到實體地址的對應。sbrk沒有辦法獲得連續空間?

其實這個問題不存在,虛擬位址裡兩個連續的區域可能已經被對映到了實體地址裡兩塊不連續的頁了。

虛擬記憶體是乙個需要幾十分鐘才能理解清楚的概念。其中的機制遠比「物理記憶體不夠了存到硬碟裡」複雜。詳情可以參考《深入理解計算機系統》。

3樓:

malloc的實現與物理記憶體自然是無關的,核心為每個程序維護一張頁表,頁表儲存程序空間內每頁的虛擬位址,頁表項中有的虛擬記憶體頁對應著某個物理記憶體頁面,也有的虛擬記憶體頁沒有實際的物理頁面對應。無論malloc通過sbrk還是mmap實現,分配到的記憶體只是虛擬記憶體,而且只是虛擬記憶體的頁號,代表這塊空間程序可以用,實際上還沒有分配到實際的物理頁面。等你的程序訪問到這個新分配的記憶體空間的時候,如果其還沒有對應的物理頁面分配,就會產生缺頁中斷,核心這個時候會給程序分配實際的物理頁面,以與這個未被對映的虛擬頁面對應起來,然後程式就可以歡快的繼續往下跑了。

4樓:子正

在設計乙個軟體系統的時候,要非常注意資訊隱藏。

在這方面的乙個例子就是解決方案的分層處理。

malloc就是乙個很好的例子。

1.malloc的演算法僅僅建立在應用程式編譯選項的全域性堆尺寸上,所以它的演算法應對的是乙個一維的連續記憶體區域。其他的細節對malloc函式都是透明的。

2.malloc與應用程式的介面僅僅是乙個void *指標,這同樣體現了資訊隱藏的原則。記憶體塊的大小是多少,並沒有體現出來,這些已經封裝在malloc與free的實現內部了。

3.使用者僅僅發出乙個記憶體分配請求,它不需要知道與記憶體分配相關的任何細節。

這是乙個非常好的設計。

c語言裡malloc的最優實現方式是什麼?

壓根不關心malloc critical path malloc free,非critical的你加鎖我都無所謂。其他情況我用go,python,nodejs. vibiu 讀過redis的原始碼會發現它自己實現了乙個zmalloc,允許使用google的tcmalloc和facebook的jema...

請問各位物理大神,這道題所涉及的物理情境下,帶電小球在轉動過程中可以實現加速,每轉一圈小球能量都增加?

阮之復興 重力勢能和靜電勢能都是狀態函式。也就是說,從A點到B點的勢能變化為E的話,那麼從B點到A點的勢能變化一定是 E。跟小球從什麼路徑走無關。還有,平行板之間的電場是均勻變化的直線電場這沒有錯,但這並不是說平行板的邊界以外沒有電場。平行板邊界之外也有電場線,只是畫出來就超綱了。 HumJ 不仔細...

中微子振盪對質量的起源及物理學未來有什麼啟示?

黑祭司 題主的問題應該更正為 中微子振盪對質量的起源及物理學未來有什麼啟示?為什麼這麼說呢?因為中微子有質量只是乙個理論推測,不是乙個觀測結果,它是根據中微子發生振盪推測出來的結論。按照現有理論,只有中微子有質量才會發生振盪,因為目前還沒觀測到中微子有其它引數可以影響味振盪 也沒有這方面的理論 因此...