作者b10007034 (Triven)
看板C_and_CPP
标题fork疑问
时间Thu Jan 23 11:50:46 2020
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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1579751448.A.BB6.html
※ 编辑: b10007034 (111.249.5.32 台湾), 01/23/2020 11:54:28
1F:→ harryooooooo: 不同process各自看到的记忆体状态是各自独立的,这 01/23 13:01
2F:→ harryooooooo: 叫virtual memory 01/23 13:01
3F:→ b10007034: 那请问H大,C code看到的pointer都是看到 01/23 13:13
4F:→ b10007034: virtual address吗? 01/23 13:14
5F:→ b10007034: OS处理掉COW的底层运作,我连addr都没办法看到不一致 01/23 13:15
6F:→ b10007034: 对吗? 虽然实际上透过MMU分配的physical addr不一样 01/23 13:17
7F:→ harryooooooo: 我觉得OS也没理由让你观察到address不一致吧,一是 01/23 13:54
8F:→ harryooooooo: 你看到的addr本来就是假的,二是对OS而言fork的时候 01/23 13:54
9F:→ harryooooooo: page table entry之类的东西当然是能不用改就不要改 01/23 13:54
10F:→ harryooooooo: 比较方便。不过addr突然被改的话process大概也没办 01/23 13:54
11F:→ harryooooooo: 法跑了就是。 01/23 13:54
12F:→ harryooooooo: 看到的是不是virtual address跟程式语言无关 是跟你 01/23 13:57
13F:→ harryooooooo: 的OS和硬体有关 首先硬体要支援 然後OS也要开 01/23 13:57
14F:→ b10007034: 大概了解了,谢谢h大 01/23 15:22
15F:→ school4303: 看起来是考研的题目XD 01/23 20:50
16F:→ school4303: 我记得这种题目不会完全是C code 很多时候只是方便出 01/23 20:52
17F:→ school4303: 题才写成这样 真的跑code跟答案会不一样 01/23 20:52
18F:→ b10007034: 嗯,谢谢你的意见 01/23 21:03
19F:→ b10007034: 我看题目的程式码完整到可以直接编译执行就手痒弄了一 01/23 21:03
20F:→ b10007034: 下 01/23 21:03
21F:推 mmmmei: 你的parent先sleep(5) 怎麽是parent先print? 01/24 04:10
22F:→ b10007034: 後面还有一点趣事,因为我的环境是virtualbox上的Ubunt 01/24 07:59
23F:→ b10007034: 所以我找了一台mac来用,结果发现答案一样 01/24 08:00
25F:→ b10007034: To m大我也不知道为甚麽耶...只关注地址而已 囧 01/24 08:02
26F:→ b10007034: 以为使用VM会有差别,看起来是没有?暂时想不通 01/24 08:03
27F:推 cphe: 你这个ptr只是个变数内容,印出来当然一样啊 01/24 08:15
28F:→ b10007034: 谢C大回覆,可以请问一下有哪些情况地址会不一样吗? 01/24 08:21
29F:推 Schottky: 地址不一样是什麽意思?代表 parent 原本建好的 tree 01/26 07:40
30F:→ Schottky: 遗传给 child 时整组坏光光吗? 01/26 07:40
31F:推 dces4212: 他俩 address space 不同,所以不会有共用之类问题 01/26 16:01
32F:推 asd15723: 那个print不是印出值而已吗 不是sharedval的address吧 01/27 12:36
33F:→ asd15723: (? 01/27 12:36
34F:→ asd15723: 地址会不一样 01/27 12:37
35F:→ asd15723: 应该是指 01/27 12:37
36F:→ asd15723: print("%p",&ptrsharedval)? 01/27 12:37
37F:推 dces4212: 还有就是fork是复制原本process的context, 所以位置会 01/27 12:50
38F:→ dces4212: 一样 01/27 12:50
39F:推 dces4212: asd, 楼主只是想问那个 char 的位置吧 所以就直接用pt 01/27 12:55
40F:→ dces4212: r内容看了。另外ptr的位置应该也是一样的 01/27 12:55
41F:→ cphe: ptr内容是copy的一定会一样,至於address,就跟最上面说的 01/27 18:31
42F:→ cphe: 推文最上面说的是virtual address,copy on write只是决定要 01/27 18:31
43F:→ cphe: 不要真的建一个page table真的mapping到physical address 01/27 18:32