[問題]fork疑問

作者: b10007034 (Warren)   2020-01-23 11:50:46
https://i.imgur.com/MjKHbOu.png
https://i.imgur.com/iUkvs5x.png
我照著圖中程式在Ubuntu 18.04.3執行,有幾個疑問想請教
為什麼child跟parent 的variable’s address一致呢?我以為copy on write會使得它們不
一樣
承上題,一樣的address不會造成它們aliasing嗎?
謝謝看完!
作者: harryooooooo (真_終極蘿莉控Ecstasy_)   2020-01-23 13:01:00
不同process各自看到的記憶體狀態是各自獨立的,這叫virtual memory
作者: b10007034 (Warren)   2020-01-23 13:13:00
那請問H大,C code看到的pointer都是看到virtual address嗎?OS處理掉COW的底層運作,我連addr都沒辦法看到不一致對嗎? 雖然實際上透過MMU分配的physical addr不一樣
作者: harryooooooo (真_終極蘿莉控Ecstasy_)   2020-01-23 13:54:00
我覺得OS也沒理由讓你觀察到address不一致吧,一是你看到的addr本來就是假的,二是對OS而言fork的時候page table entry之類的東西當然是能不用改就不要改比較方便。不過addr突然被改的話process大概也沒辦法跑了就是。看到的是不是virtual address跟程式語言無關 是跟你的OS和硬體有關 首先硬體要支援 然後OS也要開
作者: b10007034 (Warren)   2020-01-23 15:22:00
大概了解了,謝謝h大
作者: school4303 (某爬蟲類)   2020-01-23 20:50:00
看起來是考研的題目XD我記得這種題目不會完全是C code 很多時候只是方便出題才寫成這樣 真的跑code跟答案會不一樣
作者: b10007034 (Warren)   2020-01-23 21:03:00
嗯,謝謝你的意見我看題目的程式碼完整到可以直接編譯執行就手癢弄了一下
作者: mmmmei (mmm煤)   2020-01-24 04:10:00
你的parent先sleep(5) 怎麼是parent先print?
作者: b10007034 (Warren)   2020-01-24 07:59:00
後面還有一點趣事,因為我的環境是virtualbox上的Ubunt所以我找了一台mac來用,結果發現答案一樣https://imgur.com/aJ2HKUcTo m大我也不知道為甚麼耶...只關注地址而已 囧以為使用VM會有差別,看起來是沒有?暫時想不通
作者: cphe (魔鬼藏在垃圾筒裡)   2020-01-24 08:15:00
你這個ptr只是個變數內容,印出來當然一樣啊
作者: b10007034 (Warren)   2020-01-24 08:21:00
謝C大回覆,可以請問一下有哪些情況地址會不一樣嗎?
作者: Schottky (順風相送)   2020-01-26 07:40:00
地址不一樣是什麼意思?代表 parent 原本建好的 tree遺傳給 child 時整組壞光光嗎?
作者: dces4212 (flawless)   2020-01-26 16:01:00
他倆 address space 不同,所以不會有共用之類問題
作者: asd15723 (asd15723)   2020-01-27 12:36:00
那個print不是印出值而已嗎 不是sharedval的address吧(?地址會不一樣應該是指print("%p",&ptrsharedval)?
作者: dces4212 (flawless)   2020-01-27 12:50:00
還有就是fork是複製原本process的context, 所以位置會一樣asd, 樓主只是想問那個 char 的位置吧 所以就直接用ptr內容看了。另外ptr的位置應該也是一樣的
作者: cphe (魔鬼藏在垃圾筒裡)   2020-01-27 18:31:00
ptr內容是copy的一定會一樣,至於address,就跟最上面說的推文最上面說的是virtual address,copy on write只是決定要不要真的建一個page table真的mapping到physical address

Links booklink

Contact Us: admin [ a t ] ucptt.com