--- tags: Operating System --- [toc] # CH8 Memory Management ## Somthing about Memory ![](https://i.imgur.com/IOlBHBS.png) ### Memory layout (stack & heap) 1. Text/Code: 存放 program 的組語 2. **Data**: 存放已初始化之 static, global variable 3. Uninitialized data: 未使用之全局區域 4. **Heap**: - 其實為一個 link list,故位址並**不連續** (頻繁 new/delete 會造成 memory leak) - 每個節點記錄空閒記憶體區塊的起始位址及大小 - 存放 malloc, new 等**動態分配**產生之 variable 5. **Stack**: - **連續**記憶體 - 存放 local variable - **靜態或動態**分配。靜態分配由編譯器完成 (local variable),動態分配由 alloca 函式分配,但動態分配的資源由編譯器進行釋放,無需程式設計師實現 ```c #include <alloca.h> // 很不安全,不受任何標準保護 // C_version >= C99 皆可使用 VLA (Variable Length Array) // glibc version of stdlib.h include alloca.h by default void foo(int size) { // alloca version char *data = alloca(size); // VLA version char vla[size]; // data is automatically freed } ``` ### Management - 一些先備知識 - MMU(Memory-Management Unit) ![](https://i.imgur.com/G1mUOcz.png) - Logical address(Virtual address): CPU 產生的位置 - Physical address: 記憶體實際的位置(經 MMU 處理過) - Memory fragmentation (以 Process 內外來區分) 1. Internal fragmentation 因記憶體會以 page 為單位分配,所以有時 Process 實際佔據的記憶體會略小於被分配之記憶體,而造成記憶體碎片 ![](https://i.imgur.com/PNEIpeH.png) 2. External fragmentation 當 Process 因時間先後結束時,會造成 Process 間有記憶體碎片 ![](https://i.imgur.com/AhzwAh4.png) - Frame & Page (兩者大小相同) - Frame: 實體記憶體切割成數個 block - Page: 虛擬記憶體切割成數個 block - Swapping - 特性:Process 爭搶資源時,搶輸的程式有時需**移動記憶體位置**或**暫時離開記憶體**,之後會再搬回來執行,這就叫做 swapping - Memory allocation 當 OS 在分配給 Process memory 時,會產生碎片(fragmentation),此時有兩種解法: **Compaction**, **Virtual Memory** 1. Compaction - 移動 Process 的記憶體位置,以將碎片消除 2. Virtual Memory - CPU 透過 Virtual Memory 使 Process 在使用記憶體時是連續的,但其實是透過 Page tabel 將 memory segment 串起來,進行有效的利用以解決 External Fragmentation 問題 ![](https://i.imgur.com/tJoYWFx.png) - Demand paging Process 執行前,pager 先猜測會用到哪些 page,並載入那些page ![](https://i.imgur.com/S6yGg9k.png) - COP(Copy-On-Write) - parent 和 child process 共用一個 page,child 要寫入資料時才會開始進行複製,首先會往 page pool 尋找 free page,若找到 free page 則直接填充進去,若無則進行 Swapping (把一些 page 的內容放到 disk 裡面)