[问题]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