fork疑問

看板C_and_CPP (C/C++)作者 (Triven)時間5年前 (2020/01/23 11:50), 5年前編輯推噓7(7036)
留言43則, 8人參與, 5年前最新討論串1/1
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

01/23 13:01, 5年前 , 1F
不同process各自看到的記憶體狀態是各自獨立的,這
01/23 13:01, 1F

01/23 13:01, 5年前 , 2F
叫virtual memory
01/23 13:01, 2F

01/23 13:13, 5年前 , 3F
那請問H大,C code看到的pointer都是看到
01/23 13:13, 3F

01/23 13:14, 5年前 , 4F
virtual address嗎?
01/23 13:14, 4F

01/23 13:15, 5年前 , 5F
OS處理掉COW的底層運作,我連addr都沒辦法看到不一致
01/23 13:15, 5F

01/23 13:17, 5年前 , 6F
對嗎? 雖然實際上透過MMU分配的physical addr不一樣
01/23 13:17, 6F

01/23 13:54, 5年前 , 7F
我覺得OS也沒理由讓你觀察到address不一致吧,一是
01/23 13:54, 7F

01/23 13:54, 5年前 , 8F
你看到的addr本來就是假的,二是對OS而言fork的時候
01/23 13:54, 8F

01/23 13:54, 5年前 , 9F
page table entry之類的東西當然是能不用改就不要改
01/23 13:54, 9F

01/23 13:54, 5年前 , 10F
比較方便。不過addr突然被改的話process大概也沒辦
01/23 13:54, 10F

01/23 13:54, 5年前 , 11F
法跑了就是。
01/23 13:54, 11F

01/23 13:57, 5年前 , 12F
看到的是不是virtual address跟程式語言無關 是跟你
01/23 13:57, 12F

01/23 13:57, 5年前 , 13F
的OS和硬體有關 首先硬體要支援 然後OS也要開
01/23 13:57, 13F

01/23 15:22, 5年前 , 14F
大概了解了,謝謝h大
01/23 15:22, 14F

01/23 20:50, 5年前 , 15F
看起來是考研的題目XD
01/23 20:50, 15F

01/23 20:52, 5年前 , 16F
我記得這種題目不會完全是C code 很多時候只是方便出
01/23 20:52, 16F

01/23 20:52, 5年前 , 17F
題才寫成這樣 真的跑code跟答案會不一樣
01/23 20:52, 17F

01/23 21:03, 5年前 , 18F
嗯,謝謝你的意見
01/23 21:03, 18F

01/23 21:03, 5年前 , 19F
我看題目的程式碼完整到可以直接編譯執行就手癢弄了一
01/23 21:03, 19F

01/23 21:03, 5年前 , 20F
01/23 21:03, 20F

01/24 04:10, 5年前 , 21F
你的parent先sleep(5) 怎麼是parent先print?
01/24 04:10, 21F

01/24 07:59, 5年前 , 22F
後面還有一點趣事,因為我的環境是virtualbox上的Ubunt
01/24 07:59, 22F

01/24 08:00, 5年前 , 23F
所以我找了一台mac來用,結果發現答案一樣
01/24 08:00, 23F

01/24 08:00, 5年前 , 24F

01/24 08:02, 5年前 , 25F
To m大我也不知道為甚麼耶...只關注地址而已 囧
01/24 08:02, 25F

01/24 08:03, 5年前 , 26F
以為使用VM會有差別,看起來是沒有?暫時想不通
01/24 08:03, 26F

01/24 08:15, 5年前 , 27F
你這個ptr只是個變數內容,印出來當然一樣啊
01/24 08:15, 27F

01/24 08:21, 5年前 , 28F
謝C大回覆,可以請問一下有哪些情況地址會不一樣嗎?
01/24 08:21, 28F

01/26 07:40, 5年前 , 29F
地址不一樣是什麼意思?代表 parent 原本建好的 tree
01/26 07:40, 29F

01/26 07:40, 5年前 , 30F
遺傳給 child 時整組壞光光嗎?
01/26 07:40, 30F

01/26 16:01, 5年前 , 31F
他倆 address space 不同,所以不會有共用之類問題
01/26 16:01, 31F

01/27 12:36, 5年前 , 32F
那個print不是印出值而已嗎 不是sharedval的address吧
01/27 12:36, 32F

01/27 12:36, 5年前 , 33F
(?
01/27 12:36, 33F

01/27 12:37, 5年前 , 34F
地址會不一樣
01/27 12:37, 34F

01/27 12:37, 5年前 , 35F
應該是指
01/27 12:37, 35F

01/27 12:37, 5年前 , 36F
print("%p",&ptrsharedval)?
01/27 12:37, 36F

01/27 12:50, 5年前 , 37F
還有就是fork是複製原本process的context, 所以位置會
01/27 12:50, 37F

01/27 12:50, 5年前 , 38F
一樣
01/27 12:50, 38F

01/27 12:55, 5年前 , 39F
asd, 樓主只是想問那個 char 的位置吧 所以就直接用pt
01/27 12:55, 39F

01/27 12:55, 5年前 , 40F
r內容看了。另外ptr的位置應該也是一樣的
01/27 12:55, 40F

01/27 18:31, 5年前 , 41F
ptr內容是copy的一定會一樣,至於address,就跟最上面說的
01/27 18:31, 41F

01/27 18:31, 5年前 , 42F
推文最上面說的是virtual address,copy on write只是決定要
01/27 18:31, 42F

01/27 18:32, 5年前 , 43F
不要真的建一個page table真的mapping到physical address
01/27 18:32, 43F
文章代碼(AID): #1UAHWOks (C_and_CPP)
文章代碼(AID): #1UAHWOks (C_and_CPP)