7 記憶體管理

2021-05-25 19:50:05 字數 2979 閱讀 2727

0xc0000000

128mb

8mbpagetable_init()

ram896mb

0xc0000000

1g,送去最後的

128mb

剩下896mb

ramram

大小在896~4096mb

之間時,核心只能根據頁表定址到其中的

896mb

,初始化階段就將

896mb

ram128m

0xc0000000

,而可以任意建立。不論如何

ram某些部分已永久給核心,剩下的叫動態記憶體。

80x86

dram

sram

間傳送資料以實現調整快取。直接對映時,主存的一行就是

cache

中相同位置的一行,充分關聯時,主存中一行可存於

cache

中任意一行,

ncache

n行中任一行。

cache

控制器的表項陣列中的表項有一標籤,通過這若干位的標籤識別物理記憶體單元。實體地址的高幾位用於標籤,中間用作

cache

控制器的子集索引,低幾位用於提出行內偏移量。訪問一

ram時,

cpucache

dram

位址中根據規則提出資訊,根據資訊去

sram

中找資料,免得每次對

dram

page

mem_map

32cpu

訪問不同記憶體是否花時間不同決定。若是非一致的情況,則將物理記憶體分為若干節點,節點範圍內部訪問時間相同。每節點在核心中有對應的資料結構

pg_data_t

描述符。但它們不以陣列組織,以煉表串起來。雖然

80x86

體系結構使用一致訪問,但

linux

80x86

1.isa

dma處理器只可對

ram前

16mb

i/o24

位);2.

大容量ram

4g的線性空間使得不可直接訪問所有

ram,為解決這問題,

linux

380x86

zone_dma

16mbram

zone_highmem

896mb

zone_normal

>128&&<65535

。zone_dma

與zone_normal

區各將一定數量頁框獻出來作保留頁框。對於每個記憶體管理區,有三種主要的記憶體分配形式:

一、它由核心子系統「分割槽頁框分配器」處理。其中的「管理區分配器」完成動態記憶體的分配與釋放。請求頁框有適當的函式與巨集,它們的引數可指出搜尋管理區的順序。請求成功則返回對應的線性位址,問題來了,對

zone_highmem

的請求成功如何返回呢?線性位址對映前

896m

128m

128mb

)的關係。分配成功後返回的是頁描述符的指標,根據它到乙個

hash

表中,找出最終的對映結果,即線性位址。如果其它情況的對映,但在高階記憶體已無空頁時會引起阻塞,所以在軟硬中斷中不可行。臨時對映,不會要求阻塞,相反它要求不能阻塞,因為怕其它核心控制路徑用同一視窗來對映其它高階記憶體。不論哪種技術都不可同時對整個

ram定址。對於臨時核心對映,高階記憶體任一頁框可以通過乙個「視窗」(為此保留的乙個頁表項)對映到核心位址空間。每個

cpu都有自己的

13解決了怎麼分配,接下來考慮分配策略。由於分配連續的頁框,若策略不好會產生大量外碎片。解決外碎片的常見兩種思路是將不連續的空頁框對映到連續的線性位址或允許一種技術盡量提高分配效率。考慮到如老式

dma等服務需要連續頁框且連續的頁框可提高牛快表特性,一般都會第二種方法。

linux

用夥伴系統來解決外碎片。它將所有空閒頁框分為

11個塊鍊錶,每個鍊錶串起12

、4……1024

1024

個頁框充滿了乙個頁表(

1024

c++中

stlvector

所有核心申請頁框操作的最上層是「管理區分配器」,它負責保護保留的頁框池,記憶體不足且允許阻塞時引發頁框**演算法,並盡可能儲存小而珍貴的

dma區。

二、linux

使用的是返回記憶體大小是

250%

sunsolaris2.4

slab

object

slab

slab

分配器把那個頁框存在快取記憶體中。

slab

分配器將物件分組放入調整快取,包含調整快取的主存分為多個

slab

,每slab

slab

slab

slab

slab

描述符之後(如果

slab

描述符本身存在

slab

slab

三、0xc0000000

開始的1g

896m

的對映,最後是固定對映與永久核心對映的線性位址。它們中間的可用於非連續記憶體。在物理對映末與第一記憶體之間加入

8mb的安全區用於捕獲越界訪問。同樣,在區與區之間插入

4k大小安全隔離帶。非連續記憶體區也有對應的描述符。分配時先分描述符,找線性位址區間。之後再分頁框,將分得的不連續頁框的頁描述符存在

area->pages

陣列中,最後再更新核心使用的頁表項。

__get_free_pages()

alloc_pages()

kmem_cache_alloc()

kmalloc()

slab

分配器為專用或通用物件分配塊;

vmalloc()

或vmalloc_32

()獲得非連續記憶體區。可使用如此直接的步驟是因為核心是

os中優先順序最高的部分。若某核心函式請求動態記憶體,不會推遲,且核心函式被認為是正確的,這就不用出錯處理了。

記憶體管理 7

支援smp的現代作業系統使用每個cpu上的資料,對於給定的處理器其資料是唯一的。一般來說,每個cpu的資料存放在乙個陣列中。陣列中的每一項對應著系統上乙個存在的處理器。當預處理器號確定這個陣列的當前元素 unsigned long my percpu nr cpus 然後按如下方式訪問它 int c...

7記憶體管理 MRC

記憶體管理,即記憶體裡各個物件的管理,即記憶體裡各個物件的生命週期的管理,從物件導向的角度看 預設為1,即有一滴的生命血液,若為0就會死去 自己管理自己,自己在方法最後,要給自己release一下,不然自己死不了 1重寫遺書方法 在裡面把屬性物件釋放,2重寫set方法,裡面若前後值不同,就釋放舊值,...

7 php 記憶體洩漏 PHP 記憶體管理

php 的記憶體管理來自於 zend 引擎。php 的記憶體管理與預防記憶體洩漏緊密關聯。有關執行緒內全域性資料處理的資訊請參見作為執行緒隔離設施的執行緒安全的資源管理器。此外,zend 引擎要面對乙個十分特殊的使用模式 在一段比較短的時間內,許多 zval 結構大小的記憶體塊和其他的小記憶體塊被申...