Re: [理工] 108交大計系5

看板Grad-ProbAsk作者 (善良老百姓)時間3年前 (2020/10/27 20:59), 編輯推噓2(200)
留言2則, 2人參與, 3年前最新討論串2/2 (看更多)
※ 引述《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://www.ptt.cc/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://www.ptt.cc/bbs/Grad-ProbAsk/M.1603803553.A.85B.html

10/28 08:40, 3年前 , 1F
推 k大詳細補充
10/28 08:40, 1F

10/28 11:46, 3年前 , 2F
謝謝K大的詳細解說,完全沒有沒有思考到copy-on-write
10/28 11:46, 2F
文章代碼(AID): #1Vc1cXXR (Grad-ProbAsk)
文章代碼(AID): #1Vc1cXXR (Grad-ProbAsk)