※ 引述《kyuudonut (善良老百姓)》之銘言:
: 最近在研讀virtual memory相關知識,大致上了解paging的運作模式
: [問題二] 如果有多個 process 同時運作,各自 stack 的起始位置又是如何分配呢?
: (一直往下長不會撞到嗎@@)
: (當某 process 需要的 stack 大小超過兩個 page 又是如何維護?
: page 如果不連續怎麼辦?)
你既然是在讀 virtual memeory,應該知道每個 process 都有自己一塊虛擬位址空間。
以 32-bit 系統來說,就是每個 process 各自有 4GB 的定址空間。
這 4GB 的定址空間,再細一點的分法是再區分成 user space 跟 kernel space。
預設的狀況下,Windows 是 2GB/2GB,Linux 則是 3GB/1GB。
有些人在 32-bit 的 XP 插了很大記憶體的顯示卡,結果記憶體剩下 2.xx GB,
原因就是這樣來的,因為 kernel space 要劃一塊去映射,細節要問熟微軟系統的。
stack 和 heap 這些東西都在 user space,user space 是各 process 之間獨立的。
換句話說對每個 32-bit Linux process 而言,那 3GB 裡不會有其它 process 的資料。
所以沒有什麼撞到的問題,兩個平行世界的東西你要怎麼讓它們相撞?
如果要 programmer 去擔心這種事,那 virtual memory 存在的意義就沒有了。
你沒特別設定的話,同個編譯系統生出來的執行檔,在同個 OS 執行,
每個 process 的 stack 起始位址都是一模一樣的,當然這不會是實體位址。
stack 的 page 當然是連續的。
在每個 process 各自獨立的虛擬 3GB 定址空間裡,有什麼理由劃不出連續空間?
你 C 程式裡 pointer 看到的記憶體位址都是這些虛擬位址,並不是實體的。
至於這些 page 怎麼對應到實體記憶體的 frame,我想書上應該都寫得很清楚了。