iT邦幫忙

0

【小黑馬作業系統教室】(9) (Ch8) 記憶體管理,OS決定使用者寫程式的變數存在記憶體的哪個位置

大家好,我是心原一馬,
今天來說說OS中一個相當重要的章節-「記憶體管理」。

上一篇: 【小黑馬作業系統教室】(8) (Ch4) 幾種多線程模型介紹,認識user thread 與 kernel thread

動機-為什麼要記憶體管理?

先來說說為什麼要記憶體管理的動機。
「記憶體(memory)」-顧名思義,為電腦暫時存放資料的地方。
(關機後資料也不會不見的地方稱為「磁碟(disk)」,磁碟比記憶體大很多)
當你在電腦上執行程式時,
OS會將程式讀進記憶體中,
你的電腦必須知道你的資料存放在什麼位置,
大概可視為是記憶體管理的動機吧。

議題- 變數地址的綁定時機

當一個電腦使用者寫了一支程式,
要執行這支程式大致上有三個步驟:

  1. 由compiler編譯程式 (註:編譯指將人類可以看懂的程式碼轉為電腦看的懂的0101語言)
  2. 將程式讀進記憶體(memory)中
  3. 執行程式

一支程式裡會有許多變數,
變數放在記憶體的位置稱為變數的地址
決定變數地址的行為稱為綁定(address binding),
那麼可以綁定變數地址的時機也就是上述說的三個時間點了:

  1. Compile time (compiler編譯程式時即決定地址)
  2. Load time (將程式讀進記憶體(memory)時才決定地址)
  3. Execution time (程式的時間動態決定地址)

比喻: 自習教室

在不同的時機點綁定變數的地址有什麼差別嗎?
這邊小馬以生活化的例子來做比喻:
現在將記憶體想像成一間「大教室」,
開放給眾多學生自習,
這間教室有很多排,每排有許多位置,
再將程式內的變數想像成來教室自習的「學生」。

那麼-

  • 在Compile time 就綁定地址,
    猶如說一個學生在進教室自習前,
    就決定說「我想要坐在第n排的第m個位置」。
    當然這樣是不太明智的做法,
    有可能「第n排的第m個位置」上已經有人了,
    你根本沒辦法坐到這個位置上。

  • 在Load time 綁定地址,
    猶如一個學生在進教室自習前,
    只決定說「我想要坐在第m個位置」。
    這種做法比在Compile time就決定還要來的彈性,
    他可以在進入自習
    他可以看哪一排的位置的第m個位置是空的,
    就坐在那一排,
    但缺點是一旦學生坐定位置後,
    他就會得到一個確切的位置(比如說:「第2排的第m個位置」),
    坐定後便不能再動了(除非程式重新讀取)

  • 在Execution time綁定地址是最有彈性的做法,
    從頭到尾學生只會決定說「我想要坐在第m個位置」(m猶如是一個虛擬地址),
    即便在教室入座後,
    位置也不會就定下來了,
    有可能學生暫時去上廁所,
    回來後可以再找其它排第m個位置是空的地方就座。

因為在「Compile time」和「Load time」綁定地址是沒有彈性的做法,
現在的OS幾乎是採用在Execution time綁定地址的做法。

虛擬地址的產生

因為OS是採用在Execution time綁定地址的做法,
所以使用者在寫程式時所看到的地址也僅僅是「虛擬地址」,
並不會看到變數真正放在記憶體的位置。

實際看一段C語言的程式碼,
程式碼相當簡單,
查看變數b的值和變數b的地址:

#include <stdio.h>

int main()
{
    int b = 2;

    printf("變數 b 的值:%d\n", b);
    printf("變數 b 的記憶體位址:%p\n", &b); //%p為印出地址的16進位表示法

    return 0;
}

例如結果印出:
變數 b 的值:2
變數 b 的記憶體位址:0060FEFC

但使用者看到的地址0060FEFC僅僅是虛擬地址,
說不定b放在真實記憶體可能放在1160FEFC的位置,
或放在2160FEFC的位置(前兩碼數字我隨便打的),
我們無從得知變數b實際放在哪裡。

使用者視角所看到變數b的記憶體位置我們稱為「logical address」,
該變數存放的真實記憶體位置為「physical address」。

Paging- 連結logical memory與physical memory的機制

那對於作業系統來說,
怎麼知道在使用者程式在「logical memory」實際上放在「physical memory」哪裡呢?

  • OS將logical memory的空間切成相同大小的空間,稱為「page」
  • OS將physical memory的空間切成相同大小的空間,稱為「frame」

OS會有一張「page table」,
用來將logical memory和physical memory做對應的關係,
這邊我引用上課投影片的講解圖:

https://ithelp.ithome.com.tw/upload/images/20191031/20117114iC4E1K3Mfv.png

譬如說PageTable說Page0實際對應到frame編號1的位置,
那麼使用者在logical memory看到的page0實際上便放在physical memory的frame1上了。

logical address的表示方法

一張page的大小可能很大,
裡面不會只有存一個地址,
所以光是知道Page對應到哪個frame還不足以得到完整的地址。

事實上,logical address由兩個部分組成:

  • page number(p):表示第幾個page
  • page offset(d):有點像是變數放在這個page的第幾個字的感覺,若d有n個bit表示page size為2的n次方個byte這麼大。(因為address用二進位來表示)

好比說你在看一本書好了,這本書有100頁,每一頁上面可以寫2000個字。
那麼你想要描述這本書的某個精確位置你可以說「第p頁的第d個字」。

剛剛看到的那張page table,
實際上查的便是page number(p)對應到哪一個frame number(f)
那麼真實記憶體位置(physical address)即是f串接d得到的值。

例題: 地址轉換

這邊解一下上課投影片的例題:

If Page size is 1KB(2^10 bytes) and Page 2 map to frame 5. Given 13 bits logical address: p=2, d=20 (in decimal), how to translate it to physical address?

根據題目,地址在二進位底下有13個bits。
因為page大小占10個bits,表示前三個bits 用來存page number(p),後十個bits用來存page offset(d)。
題目說Page 2 對應到 frame 5,因此真實記憶體位置(physical address)就是5串接上20了(記得把5和20轉換成二進位)。

5 = 101 (in binary for 3 bits)
20 = 0,000,010,100 (in binary for 10 bits)
故答案為: 1,010,000,010,100

今天先整理到這邊吧。


尚未有邦友留言

立即登入留言