看板 C_and_CPP 關於我們 聯絡資訊
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嗎? 謝謝看完! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.249.5.32 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1579751448.A.BB6.html ※ 編輯: b10007034 (111.249.5.32 臺灣), 01/23/2020 11:54:28
harryooooooo: 不同process各自看到的記憶體狀態是各自獨立的,這 01/23 13:01
harryooooooo: 叫virtual memory 01/23 13:01
b10007034: 那請問H大,C code看到的pointer都是看到 01/23 13:13
b10007034: virtual address嗎? 01/23 13:14
b10007034: OS處理掉COW的底層運作,我連addr都沒辦法看到不一致 01/23 13:15
b10007034: 對嗎? 雖然實際上透過MMU分配的physical addr不一樣 01/23 13:17
harryooooooo: 我覺得OS也沒理由讓你觀察到address不一致吧,一是 01/23 13:54
harryooooooo: 你看到的addr本來就是假的,二是對OS而言fork的時候 01/23 13:54
harryooooooo: page table entry之類的東西當然是能不用改就不要改 01/23 13:54
harryooooooo: 比較方便。不過addr突然被改的話process大概也沒辦 01/23 13:54
harryooooooo: 法跑了就是。 01/23 13:54
harryooooooo: 看到的是不是virtual address跟程式語言無關 是跟你 01/23 13:57
harryooooooo: 的OS和硬體有關 首先硬體要支援 然後OS也要開 01/23 13:57
b10007034: 大概了解了,謝謝h大 01/23 15:22
school4303: 看起來是考研的題目XD 01/23 20:50
school4303: 我記得這種題目不會完全是C code 很多時候只是方便出 01/23 20:52
school4303: 題才寫成這樣 真的跑code跟答案會不一樣 01/23 20:52
b10007034: 嗯,謝謝你的意見 01/23 21:03
b10007034: 我看題目的程式碼完整到可以直接編譯執行就手癢弄了一 01/23 21:03
b10007034: 下 01/23 21:03
mmmmei: 你的parent先sleep(5) 怎麼是parent先print? 01/24 04:10
b10007034: 後面還有一點趣事,因為我的環境是virtualbox上的Ubunt 01/24 07:59
b10007034: 所以我找了一台mac來用,結果發現答案一樣 01/24 08:00
b10007034: https://imgur.com/aJ2HKUc 01/24 08:00
b10007034: To m大我也不知道為甚麼耶...只關注地址而已 囧 01/24 08:02
b10007034: 以為使用VM會有差別,看起來是沒有?暫時想不通 01/24 08:03
cphe: 你這個ptr只是個變數內容,印出來當然一樣啊 01/24 08:15
b10007034: 謝C大回覆,可以請問一下有哪些情況地址會不一樣嗎? 01/24 08:21
Schottky: 地址不一樣是什麼意思?代表 parent 原本建好的 tree 01/26 07:40
Schottky: 遺傳給 child 時整組壞光光嗎? 01/26 07:40
dces4212: 他倆 address space 不同,所以不會有共用之類問題 01/26 16:01
asd15723: 那個print不是印出值而已嗎 不是sharedval的address吧 01/27 12:36
asd15723: (? 01/27 12:36
asd15723: 地址會不一樣 01/27 12:37
asd15723: 應該是指 01/27 12:37
asd15723: print("%p",&ptrsharedval)? 01/27 12:37
dces4212: 還有就是fork是複製原本process的context, 所以位置會 01/27 12:50
dces4212: 一樣 01/27 12:50
dces4212: asd, 樓主只是想問那個 char 的位置吧 所以就直接用pt 01/27 12:55
dces4212: r內容看了。另外ptr的位置應該也是一樣的 01/27 12:55
cphe: ptr內容是copy的一定會一樣,至於address,就跟最上面說的 01/27 18:31
cphe: 推文最上面說的是virtual address,copy on write只是決定要 01/27 18:31
cphe: 不要真的建一個page table真的mapping到physical address 01/27 18:32