Linux記憶體管理 一

2021-08-30 22:07:39 字數 1468 閱讀 6800

linux記憶體管理

為什麼要有記憶體管理

如果沒有記憶體管理機制,那麼會使記憶體的使用效率非常低,必須要足夠大的儲存空間才可以滿足**的執行,如果稍有不勝就會引起程式的崩潰,對於作業系統而言,經常會需要對記憶體空間的切換和位址的大範圍的跳轉,比如**的重定向等,沒有mmu那麼是無法在處理器中跑像linux這些大型的作業系統的。舉個簡單的例子,如果現在一段程式執行在0~20m的儲存空間上,另一段程式執行在20~50m這段儲存空間上,如果執行在0~20m儲存空間的**需要訪問20~50m記憶體空間的資料,如果沒有mmu將會導致程式的崩潰,因此,記憶體管理對於作業系統而言是必須需要有的。

記憶體管理主要解決如下幾個問題

1.程序位址之間的隔離,即執行時相互不影響

2.提高記憶體的使用效率

3.執行時重定位

4.分段分頁機制

5.快取記憶體機制

6.虛擬記憶體機制

記憶體管理原理

linux記憶體管理的最小單位為乙個頁框,即4kb,linux使用頁描述來儲存頁框的狀態資訊,採用虛擬儲存器技術來管理記憶體,虛擬位址到實體地址通過一定的轉換可以得到,對於使用者而言,只需要關注虛擬位址即可,linux的mmu管理可以自動實現虛擬位址到實體地址的轉換。主要的方式就是分段和分頁機制:

分段機制:

就是每段程式所執行的虛擬位址時唯一的,而實體地址不去care,這樣可以保證不會引起重定位問題,但是效率還是很低下的,必須要以程式為單位進行記憶體的操作,當記憶體不足時,還是需要進行磁碟資料的交換和讀取,這樣的io操作是非常消耗時間的,因此需要更好的記憶體管理機制,不以程式為單位進行操作,而是以更小的單位進行記憶體的操作,因而有了著名的夥伴系統演算法和slab記憶體分配機制,這些演算法有效的解決了記憶體的碎片化問題。

夥伴系統原理就是把所有空閒頁框分組為11個塊鍊錶,每個塊鍊錶分別包含大小為1,2,4,8,16,32,64,128,256,512,1024個連續的頁框,演算法會根據申請的記憶體大小選擇合理的空閒塊,並且進行管理,比如現在要申請256個頁框的塊,首先會尋找是否有乙個256個頁框的空閒塊,如果沒有,則選擇512個頁框的空閒塊,一半用於滿足請求,一半插到256個頁框的鍊錶中,以此類推。

夥伴系統是採用頁框作為基本記憶體區,這適合於對大塊記憶體的請求,但是,核心如何處理對一些資料結構分配記憶體空間,大多數資料結構根本占用不到乙個頁框。我們如何處理對小記憶體區的請求呢,比如說幾十或幾百個位元組,因此又有了slab分配器,主要是解決小記憶體請求問題,避免碎片化。

記憶體管理區分為三種:

1.zone_dma

2.zone_normal

3.zone_highmem

zone_dma和zone_normal這兩個管理區對映到線性位址空間3gb以上,核心可以直接訪問,zone_highmem不能由核心直接訪問

Linux記憶體管理

本文首先介紹一下linux記憶體管理方式,著重說明一下使用者空間的記憶體管理,包括linux虛擬對映以及glibc中malloc的實現 然後簡要介紹單程序多執行緒的記憶體管理方式,主要涉及各執行緒堆疊空間的分配 linux 採用兩級保護機制,隔離核心空間和使用者程式空間,使使用者程式無法直接訪問核心...

Linux記憶體管理

本文首先介紹一下linux記憶體管理方式,著重說明一下使用者空間的記憶體管理,包括linux虛擬對映以及glibc中malloc的實現 然後簡要介紹單程序多執行緒的記憶體管理方式,主要涉及各執行緒堆疊空間的分配 linux採用兩級保護機制,隔離核心空間和使用者程式空間,使使用者程式無法直接訪問核心,...

Linux記憶體管理

首先我要說,我這是轉貼,轉的cu論壇上 nonameboy 的帖子,你可以連線過去看看。今天因為要解釋系統中可用記憶體的大小,用google看了半天,還有在cu上找了關天,竞然沒有發現有比較好的章,估計很多人都沒有注意到,懂了以後又沒有整理出來。在cu上看了很多文章說什麼memory leak和li...