glibc記憶體管理方式

2022-07-18 04:21:10 字數 1693 閱讀 1708

程式設計師接觸的記憶體空間和系統接觸的物理記憶體空間是有所區別的。對於一般程序來講,他面對的是乙個線性虛擬記憶體空間:位址從0到最大值。每乙個程序面對的虛擬記憶體空間都是一樣的,都享有全部的記憶體位址。虛擬記憶體空間是線性的,但並不意味著是連續的。部分位址段的虛擬空間可以是缺失的(不是所有位址都可以用來儲存資料)。

虛擬記憶體可以按頁管理,每一頁大小一般為4kb。每一頁背後都有乙個實際物理記憶體(可以是主存也可以是輔存)與之對應。在物理記憶體中我們不叫頁,而稱之為幀。分頁的好處就是可以在主存不夠的情況下把輔存給利用上。我們可以將暫時不用的主存頁儲存到輔存中,這樣時候這塊主存頁便可以被我們覆寫,需要的時候還可以從輔存中恢復。在安裝linux系統的時候,如果記憶體偏小我們時常通過啟用swap分割槽,增加虛擬記憶體空間。由區域性性原理,速度上並不會差別太大。

並不是每乙個虛擬記憶體頁都有實際記憶體幀作為其後盾。如果沒有對應的實際記憶體,便是缺頁的情況。有個列外:虛擬頁的資料全為0時,並不需要記憶體幀。只要有乙個標記就可以了。

記憶體頁和記憶體幀不一定是一對一關係,剛才說了有些記憶體頁可能沒有記憶體幀,有些記憶體幀可能會被多個記憶體頁使用(多個記憶體頁一般分屬於多個程序,上面提到了一般程序面對的空間都是一樣的)。換句話將,乙個記憶體幀可以被多個記憶體頁共享,再進一步可以被多個程序共享。典型的例子是庫函式printf函式。每乙個程序都會共享庫函式printf(動態鏈結庫),所以printf實際只有乙個例項,每個程序的printf函式都在相同的記憶體幀中。

雖說記憶體頁可以有記憶體幀作為其後盾也可以沒有,但程序要想有效的訪問記憶體頁,該記憶體頁必須要對應乙個記憶體幀。實際情況是記憶體頁的需求大於記憶體幀的實際大小。需求太大的實際原因——每乙個程序都想獨佔整個物理記憶體。那該怎麼解決這個問題呢?聯想以下實際生活中的電梯。乙個電梯最多容納10人,而一棟樓有200號人。那我們是不是需要20個電梯才夠?其實不然,或許兩三個電梯就可以了。理由是:人不會總呆在電梯裡面。再來看看我們的記憶體,記憶體頁相當與人,記憶體幀則相當於電梯。幀不夠了,頁出來就行。記憶體頁我們可以放到輔存中,比如磁碟。如果我們突然需要儲存在輔存上的記憶體頁時,再將輔存上的記憶體頁與實際記憶體幀對應。這一行為可以叫做換頁。

前面提到了缺頁。缺頁更嚴謹的講是程序嘗試訪問乙個沒有記憶體幀對應的記憶體頁時發生的一種錯誤。這是候核心會掛起該程序,進行一些排程把記憶體頁和記憶體幀連線起來,然後再恢復程序。這被稱為換進/faulting in。值得注意的是,這種情況並不是什麼好事,會減慢程式的執行。頁的換進換出做的操作是io操作。

記憶體申請,很多人可能認為只有記憶體不夠的時候才需要該操作。但反問一句,記憶體已經不夠了,你上哪兒獲取?實際上記憶體申請會追蹤乙個程序的資料的位址,確保相同位址的記憶體不會存進兩個完全不同的資料。

程序申請記憶體有兩種方式:exec、程式設計方式、[fork]。

記憶體對映i/o是一種動態虛擬記憶體申請方式。將虛擬記憶體的內容對映到io裝置上的常規檔案。虛擬記憶體的任何修改都可以同步到io上的常規檔案。只有當我們訪問到了該位址段的虛擬記憶體,我們才需要做io讀寫、訪問實際記憶體位址。所以這是一種非常有效率的讀寫方式。

程序可以用程式設計的方式申請記憶體,也可以釋放記憶體,但是你無法釋放以exec方式申請的記憶體。

1、text segment:包含了程式的指令、字面值、還有靜態常量。由exec申請,並在整個生命週期中保持相同的大小。

2、data segment:資料段作為程式的工作空間。可以事先有exec申**載,也可以由程序以程式設計的方式擴充套件或縮小其空間大小。但不管你怎麼擴大或縮小,本段都有乙個固定的最小空間。

3、stack segment:棧段包含乙個程式的棧空間。隨著程式棧的擴大而擴大,但不會隨其縮小而縮小。

記憶體管理方式

記憶體管理方式 塊 段 頁 段頁 頁式管理 頁式管理的基本原理將各程序的虛擬空間劃分成若干個長度相等的頁 page 頁式管理把記憶體空間按頁的大小劃分成片或者頁面 page frame 然後把頁式虛擬位址與記憶體位址建立一一對應頁表,並用相應的硬體位址變換機構,來解決離散位址變換問題。頁式管理採用請...

WINDOWS記憶體管理方式

windows記憶體管理方式主要分為 段式管理 頁式管理 段頁式管理。頁式管理 頁式管理的基本原理將各程序的虛擬空間劃分成若干個長度相等的頁 page 頁式管理把記憶體空間按頁的大小劃分成片或者頁面 page frame 然後把頁式虛擬位址與記憶體位址建立一一對應頁表,並用相應的硬體位址變換機構,來...

autoRelease記憶體管理方式

autorelease實際是把release的呼叫延遲了,對於每乙個autorelease,系統只是把該object放入了當 前的autorelease pool中,當該pool被釋放時,該pool中的所有object會被呼叫release。autorelease pool釋放條件 1,手動,2,引...