核心頁表和linux的夥伴系統是不是有衝突?

時間 2021-05-07 03:12:03

1樓:吉公尺

LINUX每個程序的位址空間是虛擬的,也就是說,,因此Linux程序記憶體的劃分實際上是基於0-4gb虛擬位址的。如果乙個程式大於128mb而記憶體不夠用時,作業系統會通過缺頁機制將不在記憶體中的頁面通過記憶體管理單元(mmu)將虛擬位址轉換成實體地址並將其從外存載入進來,並且把記憶體中不需要的頁面給置換出去(由作業系統的頁面置換演算法決定)。因此就能做到程序的能使用的位址比實際記憶體大這一種「假象」了。

能做到這一點的原因是因為一般的高效能cpu上有乙個記憶體管理單元(mmu),這個硬體模組儲存了作業系統給它設定的頁表和頁目錄表(TLB)並且記錄頁面使用情況,而頁表的作用就是進行程序虛擬位址到記憶體實體地址的轉換。MMU會把把程序給出的虛擬位址在TLB(裡面儲存了頁表)中進行查詢,如果找到頁面在記憶體中,則直接將頁面從記憶體(或快取記憶體)中取出。如果找到頁面不在記憶體中,則發生缺頁,將外存中的頁面置換到記憶體中。

在老的CPU裡,可能會因為TLB不夠大而只能起到頁表快取作用。現代計算機由於記憶體足夠大,作業系統一般會更多的在記憶體中cache頁面,而不是指望缺頁機制進行置換。

夥伴系統是一種記憶體頁面管理方法,為的是減小動態分配記憶體所造成的記憶體碎片化,提高記憶體利用率。因為作業系統管理物理記憶體本質上是以頁面的形式進行管理的,當記憶體中有足夠空閒多的頁面時(記憶體有空間),它就用夥伴系統管理這些空閒的頁面,當應用程式進行malloc,free時,實質上是要通過系統呼叫來申請/釋放記憶體頁面的,這時候作業系統就通過夥伴演算法來進行頁面的分配和釋放。你如果非要malloc乙個非常大的空間,導致記憶體不夠了,那就只好觸發缺頁機制將暫時用不到的頁面置換出去咯。

還有,Linux在管理更大塊的記憶體的時候實際上是用slab的方法進行管理的,這個就不多說了

2樓:崔永明

不懂就別裝,你知不知道android的核心也是linux?ios的核心和android的核心也是同源於unix?他們是不是也不好意思說自己是兩個作業系統?

Linux中核心頁表是幹嘛用的,為什麼要有核心頁表?

Rivalak 核心頁表同樣也是用作位址翻譯的,不過是作用在核心態下。核心頁表在記憶體申請的時候就會被設定好,這也是為什麼說虛擬位址空間只適用於使用者態的原因。不過核心空間的動態對映區的 vmalloc 區是例外,其工作原理和使用者態 malloc 申請記憶體時的工作原理一致。 詳細內容請參考 深入...

linux 核心的list和STL的list的區別是什麼?兩個的效率哪個更高?

吳詠煒 本質上,std list 幫你做的事情就是把你的物件加上前後向指標存放到容器裡,幫你做生命週期管理。如果你的結點就只存在於乙個鍊錶之中,兩者的效率沒有任何區別,且 std list 使用起來更加方便。std list 的優點在於,標準庫幫你維護物件的生命週期,而且你自己不需要維護前向和後向指...

華為的Harmony系統和Linux的區別是什麼?

dc lin Martin D ck,乙個捷克人,長期從事HelenOS的開發,其簡歷是 Martin is a life long operating systems enthusiast and a passionate programmer,enjoying everything from b...