linux 記憶體管理

2021-05-24 03:08:16 字數 1130 閱讀 4723

只是大概謝謝,筆記型別的。

1. 以頁位單位

這個結構體是定義物理記憶體的,不是虛擬記憶體,因此這個結構體對應用程式來講是透明的。

核心用這個結構體來記錄和保持所有頁的狀態。

對每乙個頁都會分配這樣的乙個結構體,因此會有記憶體使用方面的問題,但也不大,差不多百分之一,1g會佔據10m

2. 記憶體區域

由於硬體的限制,所有記憶體不能同等的對待,例如dma只能使用某些記憶體,為了便於管理,核心將記憶體劃分為三個區域

a. dma 區域

b. 普通區域

c. 高記憶體區域

具體就不在討論

3. 記憶體分配

以頁為單位 和 以byte為單位的兩種介面

options:

a. gfp_io: 是否可以進行io,例如發現記憶體不夠,是否可以將dirty page寫回來釋放記憶體

b. gfp_wait: 是否可以sleep,例如是否可以被重新排程,在中斷處理器裡不能設定,不能再中斷

c. gfp_fs: 是否可以進行檔案系統io操作

4. vmalloc:

分配虛擬位址連續的記憶體,不需要實體地址連續,user空間使用這個分配器,當實體地址不連續時,在tlb中需要額外的對映,因此會有效能方面的損耗

5. slab 記憶體分配

一些基本原則:

a. 經常使用到的資料物件會被頻繁地分配和釋放,所以需要cache他們

b. 頻繁地分配和釋放會導致記憶體碎片,為了避免這個問題,快取的空閒列表應該被組織為連續的

c. 使用空閒列表,分配和釋放都變得非常簡單,只需要拿走或者返還物件就可以

d. 如果cache能夠事先知道物件大小,頁大小,以及總的cache大小,就有可能做更多的優化

e. 在smp下,可以每個cpu乙個cache,這樣就不存在鎖的情況,在多執行緒的程式中,可以每個執行緒乙個cache,這樣也不就存在鎖的問題

linux的實現:

不同大小的物件叫做caches,例如程序描述符cache,inode cache。 cache被組織為slab,乙個slab包含乙個或者多個連續的頁,每個slab都包含多個物件,每個slab有三種狀態,full,partial,empty

6 從棧上分配記憶體

1. 每個程序的棧大小有限制,ulimit -s, 一般為10m

Linux記憶體管理

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

Linux記憶體管理

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

Linux記憶體管理

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