---
# System prepended metadata

title: CH8 Memory Management
tags: [Operating System]

---

---

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 裡面)
