[問題] fork()運作方式

看板C_and_CPP (C/C++)作者時間12年前 (2013/10/30 22:27), 編輯推噓4(4037)
留言41則, 6人參與, 最新討論串1/1
想請問一下 資料說執行fork()後,會將原本process複製一份 所以child的內容根parent一樣 在作資料存取時,可能發生race condition 但是既然是兩個獨立的process了 為什麼還會發生race condition? 各自不是都有自己的 process space嗎? 又看到資料說 "會有相同的PCB資訊" 這樣是說 其實記憶體中只有一個process space 只是 parent 執行 fork() return 值 > 0 的部分 而child 執行 fork() return 0 的部分嗎 這種情形才會發生 race condition 吧? 有點模糊, 謝謝了 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 27.240.56.29

10/30 22:31, , 1F
存取共享的資源才會有 race condition, 私人空間是分開的
10/30 22:31, 1F

10/30 22:31, , 2F
什麼是 PCB 資訊?
10/30 22:31, 2F

10/30 22:32, , 3F
Process contol block
10/30 22:32, 3F

10/30 22:33, , 4F
因為我想說 如果父與子各自擁有自己的PROCEE SPACE的話
10/30 22:33, 4F

10/30 22:34, , 5F
應該不會發生RACE CONDITION吧? 但是課本說有可能發生
10/30 22:34, 5F

10/30 22:34, , 6F
process ID 都不同了, process control block 也不同啊
10/30 22:34, 6F

10/30 22:35, , 7F
所以我猜想 fork後會不會是其實父與子共用process space?
10/30 22:35, 7F

10/30 22:35, , 8F
shared memory 或 disk file 才比較有可能是共用的
10/30 22:35, 8F

10/30 22:35, , 9F
那既然這樣 為什麼還會有機會發生RACE CONDITION阿??
10/30 22:35, 9F

10/30 22:36, , 10F
你說的那種現在叫作 thread
10/30 22:36, 10F

10/30 22:36, , 11F
恩恩 我知道 THREAD 但是FORK不是生THREAD的吧
10/30 22:36, 11F

10/30 22:36, , 12F
以前曾經用過 lightweight process 這名詞, 現在不流行了
10/30 22:36, 12F

10/30 22:37, , 13F
對, fork 就 fork, 它不是 thread
10/30 22:37, 13F

10/30 22:37, , 14F
所以課本所說的RACE應該是指DISK FILE囉?
10/30 22:37, 14F

10/30 22:37, , 15F
不知道, 我又沒看見課本上怎麼寫 XD
10/30 22:37, 15F

10/30 22:37, , 16F
不過我已經在找打火機了
10/30 22:37, 16F

10/30 22:37, , 17F
他們共用FILE DESCRIPTION TABLE所以有機會發生RACE?
10/30 22:37, 17F

10/30 22:38, , 18F
就算不共用 fd, fork 完再各自去開同一個檔不行嗎? XD
10/30 22:38, 18F

10/30 22:39, , 19F
file問題不會只發生在父與子,無關係的process也會發生
10/30 22:39, 19F
所以說 .... int a = 10; int p; if((p=fork()) > 0) // 對a做事 else if(p == 0) // 對a做事 這樣的情況下應該不會有race condition發生囉? 是這樣嗎QQ ※ 編輯: kumusou 來自: 27.240.56.29 (10/30 22:41)

10/30 22:42, , 20F
你說得沒錯
10/30 22:42, 20F

10/30 22:43, , 21F
可以寫個程式來當場測試啊
10/30 22:43, 21F

10/30 22:43, , 22F
謝謝妳喔 但是 PRINTF 這種標準輸出可能就有機會發生問題
10/30 22:43, 22F

10/30 22:44, , 23F
了 對嗎?
10/30 22:44, 23F

10/30 22:44, , 24F
你還是可以試試看 printf, 不過記得順便把 PID 印出來
10/30 22:44, 24F

10/30 22:44, , 25F
這樣才分得清楚哪一行是誰 print 的
10/30 22:44, 25F

10/30 22:45, , 26F
不然印 I am your father 也是可以啦
10/30 22:45, 26F

10/30 22:47, , 27F
printf在印量小的時候(一整面螢幕算小)是atomic的
10/30 22:47, 27F

10/30 22:48, , 28F
也就是一個printf印出來的東西會一次輸出完,不會被插隊
10/30 22:48, 28F

10/30 22:49, , 29F
你可以想成推文, 一次出一行, 分好幾行才會被斷
10/30 22:49, 29F

10/31 03:09, , 30F
你最後說的情況,跟書上說的並沒有衝突,因為你們都是說"可
10/31 03:09, 30F

10/31 03:09, , 31F
能" "應該" 這種不確定的詞,我會偏向把書上的話記下來 慢
10/31 03:09, 31F

10/31 03:10, , 32F
慢找例子
10/31 03:10, 32F

10/31 08:16, , 33F
請問是哪本書寫的?
10/31 08:16, 33F

10/31 10:59, , 34F
看成 vfork 了吧
10/31 10:59, 34F

10/31 12:53, , 35F
vfork() 情況不同, parent 會suspend直到 child exec 或 exit,
10/31 12:53, 35F

10/31 12:55, , 36F
所以 vfork() 沒 exec() 的話, 就沒 race condition 的問題.
10/31 12:55, 36F

10/31 13:16, , 37F
作資料存取的race condition, 我想是指已開啟的檔案之類.
10/31 13:16, 37F

10/31 13:17, , 38F
比方用 open() 開啟, fork() 後各別對其 read(), 和
10/31 13:17, 38F

10/31 13:18, , 39F
先 fork() 再各別 open() 及 read(), 結果會不同.
10/31 13:18, 39F

10/31 13:19, , 40F
假設檔案內容為 abcdef, read() 每次都讀 1 byte,
10/31 13:19, 40F

10/31 13:20, , 41F
第一種可能各別讀到為 ace 和 bdf; 第二種就都讀到 abcdef.
10/31 13:20, 41F
文章代碼(AID): #1ISHT6NF (C_and_CPP)
文章代碼(AID): #1ISHT6NF (C_and_CPP)