Re: [問題] memory stack 的問題

作者: tinlans ( )   2016-08-29 13:36:39
※ 引述《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,我想書上應該都寫得很清楚了。
作者: tjjh89017 (伊達政宗)   2016-08-29 16:53:00
你沒有假設ASLR disable的情況不能說「stack 起始位址都是一模一樣的」
作者: tinlans ( )   2016-08-29 21:14:00
確實現在的系統 ASLR 預設都打開了,但會把他的問題更複雜化。不過還是感謝補充 XD
作者: wtchen (沒有存在感的人)   2016-08-29 23:15:00
請問個問題,32bit一個process就4GB,64bit應該就unlimit那系統要怎麼判斷有無out-of-memory?
作者: suhorng ( )   2016-08-29 23:40:00
4GB 是 memory address space, 要用記憶體要配置才有作業系統管理記憶體的分配跟 mapping, 會知道有沒有 OOM
作者: ah7675 (阿毛)   2016-08-29 23:43:00
address space跟使用多少是兩回事啊啊啊
作者: lsc36 (lsc36)   2016-08-29 23:45:00
指標有32/64bit這麼長可是還是要跟OS拿page來用啊
作者: kyuudonut (善良老百姓)   2016-08-30 00:21:00
謝謝前輩回答,所以kernel在切換process的時候,會再依另外依各自的page table做映射的意思嗎?
作者: wtchen (沒有存在感的人)   2016-08-30 01:09:00
那請問一個process裡的不同thread的stack要怎麼劃?據我所知Linux預設的stack size limit是8MiB遠小於user space的3GB...其實我很不懂heap是往下延伸stack往上直到兩者相撞的話為啥heap還是可以無限增加(看OS支援大小)而stack不行
作者: PkmX (阿貓)   2016-08-30 02:03:00
linux的話thread的stack是userspace自己allocate然後pass給clone(2)8MB是預設的softlimit 你爽的話也可以ulimit -s去加大它其實我很討厭往上/下長的說法 說往0或無限大長不是很好嗎XD
作者: kdjf (我抓得到什麼呢?)   2016-08-30 02:10:00
stack也可以無限加,只是OS申請要先跟OS申請heap要用brk跟系統要空間一樣
作者: wtchen (沒有存在感的人)   2016-08-30 02:13:00
感謝說明,受教了
作者: kdjf (我抓得到什麼呢?)   2016-08-30 02:13:00
只是習慣上把已知一定連續又可預測生命的資料放在自然連續的stack裡方便又快剛剛google到setrlimit,可能是他吧不過stack叫做stack&他的用法可能是古老的hardware stack時留下來的?
作者: tjjh89017 (伊達政宗)   2016-08-30 02:24:00
是說,64bit還有實體定址的問題,不是真的一定有2^64
作者: kyuudonut (善良老百姓)   2016-08-30 15:21:00
謝謝前輩指點! 難怪每次看到memory的記憶體分配圖有些都會稱為 process memory
作者: CaptainH (Cannon)   2016-08-30 22:38:00
作者: askacis (ASKA)   2016-08-31 18:19:00
linux下setrlimit()也是可以用來調Stack sizepthread_attr_setstacksize()可以拿來調整thread

Links booklink

Contact Us: admin [ a t ] ucptt.com