1. 程式人生 > >12---記憶體管理

12---記憶體管理

記憶體管理的基本單位是什麼?

什麼是記憶體管理單元(MMU)

管理記憶體並把虛擬地址轉化為實體地址的硬體

核心怎樣表示每個物理頁?

用struct page結構體來短暫描述當前時刻在相關物理頁記憶體本身,而不是存放在其中的資料。由於頁交換等原因,頁中包含的資料就不再與struct page結構體關聯。

核心怎樣管理系統中的物理頁?

核心利用struct page結構體來獲知頁是否被分配,分配給了誰。

頁的擁有者有哪些?

使用者空間程序、動態分配的核心資料、靜態核心程式碼和頁快取記憶體。

什麼是區?

具有相似特性的頁稱為區

核心為什麼要分割槽?

位於記憶體中特定實體地址上的頁不能用來處理一些特定任務,以及硬體的限制等原因,需要對頁進行分割槽處理

Linux中有哪些記憶體定址問題?

  • 一些硬體只能用特定的記憶體地址來執行DMA(直接記憶體訪問)
  • 一些體系結構記憶體的物理定址範圍大於虛擬定址範圍,導致一些記憶體不能永久的對映到核心空間。

針對硬體缺陷引起的記憶體定址問題,Linux怎樣分割槽來解決?

  • ZONE_DMA-------這個區包含的頁可以用來執行DMA操作
  • ZONE_DMA32-------這個區包含的頁只能被32位裝置訪問執行DMA操作
  • ZONE_NORMAL-------這個區包含的頁可以正常對映
  • ZONE_HIGHEM-------這個區包含的頁不能永久的對映到核心地址空間

記憶體分配有哪些識別符號,各是什麼作用?

  • 行為修飾符:核心應當如何分配所需記憶體
  • 區修飾符:從哪個區分配記憶體
  • 型別識別符號:對行為修飾符和區修飾符進行不同的組合,簡化使用操作

各種型別識別符號的使用情形是什麼?

  • GFP_KERNEL------程序上下文,可以睡眠
  • GFP_ATOMIC------程序上下文,中斷處理程式、軟中斷和tasklet,不可以睡眠
  • GFP_DMA|GFP_KERNEL------DMA記憶體,可以睡眠
  • GFP_DMA|GFP_ATOMIC-------DMA記憶體,不可以睡眠

什麼是空閒連結串列?

空閒連結串列包含可供使用、已經分配好的資料結構塊。當代碼需要一個新的資料結構例項時,從空閒連結串列中取出一個數據結構塊,再填入資料,不必分配記憶體。使用後,將資料結構塊在放回空閒連結串列,不必釋放記憶體。

什麼情況下使用slab快取記憶體?

頻繁的建立很多相同型別的資料結構使用slab快取記憶體比空閒連結串列更方便

slab層的作用是什麼?

通過slab層為核心提供的介面建立和撤銷新的快取記憶體,為具體的物件型別分配和釋放快取記憶體,提高物件分配和回收的效能。

slab層是如何設計實現的?

slab層把不同型別的資料結構分為不同的快取記憶體組,一個快取記憶體可能包含著多個slab,每種資料型別對應一個快取記憶體。把事先分配好的物件存放到快取記憶體中,當需要新的記憶體存放資料結構時,slabc層從快取記憶體中得到一個物件來使用。

使用者空間和核心空間中怎樣分配棧空間大小?

  • 使用者空間棧的大小可以動態增長而且棧空間很大
  • 核心空間棧的大小是固定的而且棧的空間很小

如何給程序分配記憶體空間?

根據體系結構和編譯需求,給每個程序分配固定大小的棧,一般每個程序有兩頁的核心棧。32位和64位體系結構頁面大小位4KB和8KB,相應核心棧的大小位8KB和16KB。

什麼是高階記憶體?

高於896MB所有實體記憶體大小的範圍,不能永久的對映到核心地址空間。

有哪些記憶體分配方法,應用場景是什麼?

  • kmalloc()------分配連續的實體記憶體,根據應用情形選擇不同的型別識別符號
  • alloc_pages()------從高階記憶體分配
  • vmalloc()--------分配連續的記憶體虛擬地址(邏輯地址),實體地址不連續。
  • slab--------需要建立和撤銷很多的資料結構