作者kyuudonut (善良老百姓)
看板Grad-ProbAsk
标题Re: [理工] 108交大计系5
时间Tue Oct 27 20:59:11 2020
※ 引述《waes81224 (changchang)》之铭言:
: 标题: [理工] 108交大计系5
: 时间: Mon Oct 26 00:17:33 2020
:
: 题目如下
: 答案是A
: https://i.imgur.com/KtILUJo.jpg
:
: 1. 想请问这题程式码中的a是属於global variable,当child process经由fork行程後,也
: 会共享同一个a。
不是,这个 a 是在 stack 上的 ...
: fork之後接下去执行时,应该会因为parent preocess与child process执
: 行顺序的不同而造成a值有不同的可能对吧(race condiction发生)?
这不叫做 race condition,race condition 的定义是不同 thread 却参照到同一个变数
process fork 後就不同 address space 了,怎麽会有 race condition?
: 2. 我把程式码拿去执行,却都是4 3 3 2 2 1这个顺序,而没有上述的情形发生,想请问为
: 什麽呢?
建议加上 sleep,你比较容易观察到 OS scheduler 作动的情况,
或是你可以 hack 一下 scheduler 验证所学
建议程式限制在 single core 上执行,也比较好观察
:
: 这个想法影响到我对於 (a) 跟(b)的选择,感谢大家。
:
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 119.77.140.137 (台湾)
: ※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Grad-ProbAsk/M.1603642655.A.FE6.html
: ※ 编辑: waes81224 (119.77.140.137 台湾), 10/26/2020 00:35:12
: 推 willy3570: fork会copy一份parent的资料给child,因此child有自己 10/26 01:01
: → willy3570: 的一份资料来自於parent的copy,所以变数不是共享的,c 10/26 01:01
怕原 PO 还是没有懂,现代作业系统并不会一 fork 就马上 "copy" 一份资料给 child
process,而是直到 child process 尝试 write memory 时,才会启动实质上的复制,
这叫做 copy-on-write。
: → willy3570: hild更改a的内容也不会影响到parent。 10/26 01:01
: 感谢大大!!我懂了 variable a 要写在 main()外面才会有共享变数大问题发生。
不,你没有懂 ... 。写在 main 外面的确会变成 global variable,但是不代表 forked
child process 可以用。上面说了,他们 address space 是不一样的。
试想一下: 你在 bash 上 launch 後的 process 如果可以修改 bash 上任意 memory content
那是多恐怖的问题?
: ※ 编辑: waes81224 (119.77.140.137 台湾), 10/26/2020 12:35:18
--
◢ ◣ ▁▂█▂▁◢茄你老木! ◥ ▁▂▁
你这个茄子 ◤◥◤◥ 你有得茄吗? ◢█ ◆ █◣ 【茄~】
◣ ◤ ˋ ˊ ◥ 你有得茄吗?◢ ◤ ◥◥◤◤ ◥ ◤
◤ ㄧ ◣ ◤ (因为很重要 ▉ ⊙ ⊙ ▏
…
▍ 所以说两次)▉ △ ◢ ▏
◣ ◤◤ ◣ ◤◢ ψJeans1020
◢ ◣ ▁▂█▂▁◢茄你老木! ◥ ▁▂▁
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.34.170.73 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Grad-ProbAsk/M.1603803553.A.85B.html
1F:推 willy3570: 推 k大详细补充 10/28 08:40
2F:推 waes81224: 谢谢K大的详细解说,完全没有没有思考到copy-on-write 10/28 11:46
3F:→ gua0313: 推 感谢大大详细补充 11/10 22:13