內存使用場景
out of memory 的時代過去了嗎?no,內存再充足也不可任性使用。
1、內存的使用場景
page 管理
slab(kmalloc、內存池)
用戶態內存使用(malloc、relloc 文件映射、共享內存)
程序的內存 map(棧、堆、code、data)
內核和用戶態的數據傳遞(copy_from_user、copy_to_user)
DMA 內存
2、用戶態內存分配函數
alloca 是向棧申請內存,因此無需釋放
malloc 所分配的內存空間未被初始化,使用 malloc() 函數的程序開始時(內存空間還沒有被重新分配) 能正常運行,但經過一段時間后(內存空間已被重新分配) 可能會出現問題
calloc 會將所分配的內存空間中的每一位都初始化為零
realloc 擴展現有內存空間大小
a) 如果當前連續內存塊足夠 realloc 的話,只是將 p 所指向的空間擴大,并返回 p 的指針地址。這個時候 q 和 p 指向的地址是一樣的
b) 如果當前連續內存塊不夠長度,再找一個足夠長的地方,分配一塊新的內存,q,并將 p 指向的內容 copy 到 q,返回 q。并將 p 所指向的內存空間刪除
3、內核態內存分配函數
函數分配原理最大內存其他_get_free_pages直接對頁框進行操作4MB適用于分配較大量的連續物理內存kmem_cache_alloc基于 slab 機制實現128KB適合需要頻繁申請釋放相同大小內存塊時使用kmalloc基于 kmem_cache_alloc 實現128KB最常見的分配方式,需要小于頁框大小的內存時可以使用vmalloc建立非連續物理內存到虛擬地址的映射物理不連續,適合需要大內存,但是對地址連續性沒有要求的場合dma_alloc_coherent基于_alloc_pages 實現4MB適用于 DMA 操作ioremap實現已知物理地址到虛擬地址的映射適用于物理地址已知的場合,如設備驅動alloc_bootmem在啟動 kernel 時,預留一段內存,內核看不見小于物理內存大小,內存管理要求較高
4、malloc 申請內存
調用 malloc 函數時,它沿 free_chuck_list 連接表尋找一個大到足以滿足用戶請求所需要的內存塊
free_chuck_list 連接表的主要工作是維護一個空閑的堆空間緩沖區鏈表
如果空間緩沖區鏈表沒有找到對應的節點,需要通過系統調用 sys_brk 延伸進程的棧空間
5、缺頁異常
通過 get_free_pages 申請一個或多個物理頁面
換算 addr 在進程 pdg 映射中所在的 pte 地址
將 addr 對應的 pte 設置為物理頁面的首地址
系統調用:Brk—申請內存小于等于 128kb,do_map—申請內存大于 128kb
6、用戶進程訪問內存分析
用戶態進程獨占虛擬地址空間,兩個進程的虛擬地址可相同
在訪問用戶態虛擬地址空間時,如果沒有映射物理地址,通過系統調用發出缺頁異常
缺頁異常陷入內核,分配物理地址空間,與用戶態虛擬地址建立映射
7、共享內存
1) 原理
它允許多個不相關的進程去訪問同一部分邏輯內存
兩個運行中的進程之間傳輸數據,共享內存將是一種效率極高的解決方案
兩個運行中的進程共享數據,是進程間通信的高效方法,可有效減少數據拷貝的次數
2) shm 接口
shmget 創建共享內存
shmat 啟動對該共享內存的訪問,并把共享內存連接到當前進程的地址空間
shmdt 將共享內存從當前進程中分離
責編AJX
-
Linux
+關注
關注
87文章
11123瀏覽量
207882 -
內存
+關注
關注
8文章
2902瀏覽量
73530 -
操作系統
+關注
關注
37文章
6543瀏覽量
122724 -
DNA
+關注
關注
0文章
242瀏覽量
30959
發布評論請先 登錄
相關推薦
評論