亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 7518 | 回復(fù): 11
打印 上一主題 下一主題

討論:關(guān)于多線程中fork()的同步問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2008-11-24 15:15 |只看該作者 |倒序?yàn)g覽
本來發(fā)在LINUX內(nèi)核版的,借借這里的人氣。

這是我在一個論壇上偶然看到的,在討論中有人提出LINUX系統(tǒng)中的fork()函數(shù)行為不夠清晰。
比如在一個多線程的其中一個線程中執(zhí)行fork()函數(shù),是應(yīng)該復(fù)制整個進(jìn)程(即所有線程)還是僅僅復(fù)制當(dāng)前調(diào)用fork()的線程。當(dāng)然他對
LINUX不夠熟悉。但是他提出了一個很有意思的例子來說明fork()的不足。
這里先把幾個概念理一下:
多線程:由于LINUX并沒有顯式支持進(jìn)程和線程的區(qū)別,使用了所謂的輕量級進(jìn)程表示線程,所以這里的多線程表示的是共享虛擬地址空間(和信號處理所需的數(shù)據(jù)結(jié)構(gòu)以及諸如文件等等,不過這里共享虛擬地址空間所引起的問題最大)。也就是通常使用fork()函數(shù)時指定CLONE_VM以及相關(guān)的flag,或者使用clone(),或者使用pthread庫創(chuàng)建的進(jìn)程。這些所有的調(diào)用最后都是使用do_fork(),外加flag的特定限制,特別的使用CLONE_VM指定新進(jìn)程(線程)使用當(dāng)前進(jìn)程的虛擬地址空間,包括頁目錄和頁表。
也就是說,這些多線程共用一個虛擬地址空間,包括頁表和頁目錄。問題也就開始出現(xiàn)了。

現(xiàn)在舉一個例子:假如一個SMP系統(tǒng)上面有若干個多線程,t1,t2,...tn,它們使用兩個全局變量glob1, glob2進(jìn)行某方面的同步,需要使用諸如信號量之類的鎖進(jìn)行互斥控制。在絕大多數(shù)情況下,都是沒有問題的,F(xiàn)在假設(shè)線程t1執(zhí)行了fork()希望創(chuàng)建一個進(jìn)程(而不是線程,即新創(chuàng)建的子進(jìn)程盡管初始的虛擬地址空間跟父進(jìn)程完全一樣,但是使用了COW技術(shù)保證它們有自己獨(dú)立的虛擬地址空間)。在現(xiàn)在的內(nèi)核中,do_fork()調(diào)用具體函數(shù)將父進(jìn)程的mm_struct以及vma鏈表復(fù)制給子進(jìn)程,同時也將父進(jìn)程的頁目錄和頁表復(fù)制給子進(jìn)程的頁目錄和頁表。但是由于內(nèi)核無法完全控制父進(jìn)程的頁目錄和頁表(盡管它擁有控制互斥的自旋鎖和信號量,其他CPU上內(nèi)核執(zhí)行路徑是已經(jīng)無法修改訪問父進(jìn)程的mm和頁表,頁目錄。但是其他CPU上在用戶態(tài)運(yùn)行的線程t2,t3,..tn都可以訪問頁目錄和頁表。
假設(shè)這個多線程中有這樣一個臨界區(qū)代碼:

  ...........
  mutex_lock()
   glob1 += 2;
   glob2 -= 2;
   mutex_unlock();
   ...........
也就是說glob1和glob2要嗎都不改變,要嗎都需要改變,也就是原子操作。
假設(shè)glob1和glob2屬于同一個頁(那么也屬于同一個物理頁)。當(dāng)內(nèi)核在執(zhí)行t1的do_fork時,對于glob1和glob2所在的物理頁作COW,具體一點(diǎn)就是把指向該物理頁的pte設(shè)為只讀。如果其他CPU上某個線程ti正在臨界區(qū),那么就有可能出現(xiàn)以下執(zhí)行序列:

  ti: mutex_lock();
         glob1 += 2;
                  t1: 內(nèi)核將指向該物理頁的pte置為只讀(COW)
  ti:   glob2 -= 2;  //在這里,由于現(xiàn)在的pte是只讀的,會發(fā)生缺頁異常,COW將使得glob2的修改只對t1,t2,...tn可見,
                   //而子進(jìn)程中的glob2沒有被修改
      mutex_unlock();

在剛創(chuàng)建的子進(jìn)程返回到用戶態(tài)時,它的glob1和glob2處在不一致狀態(tài)?!

論壇徽章:
0
2 [報告]
發(fā)表于 2008-11-24 17:56 |只看該作者
我來說說我自己的觀點(diǎn):
在現(xiàn)在的LINUX內(nèi)核中這個問題確實(shí)存在,并且很難改變。
引起這個問題的本質(zhì)原因是:內(nèi)核無法完全控制其他CPU上的線程在用戶態(tài)對頁目錄和頁表的訪問控制。
如果是單線程,就不會出現(xiàn)這種問題。
我所能想到的解決方法:
1.最為暴力的,內(nèi)核在執(zhí)行do_fork()時把內(nèi)存鎖住。
  這個方法不可行,首先這會完全限制SMP中其他CPU對內(nèi)存的訪問,由于do_fork()的執(zhí)行時間比較長,會有很大的開銷。
  其次,就算鎖住內(nèi)存也無濟(jì)于事,因?yàn)樵阪i住內(nèi)存之前,其他線程還是有可能處在臨界區(qū),跟不鎖內(nèi)存的情形大致一樣。
2.fork()仍然只復(fù)制當(dāng)前線程,但是在復(fù)制之前,通過一定的機(jī)制讓所有的其他線程暫時停止執(zhí)行。
  這里有個問題,如果其他線程在臨界區(qū)內(nèi)被停止執(zhí)行,仍然會有不一致問題。所以必須考慮讓所有線程在臨界區(qū)外被暫時
  停止,但是這個似乎很難實(shí)現(xiàn)。
3.改變fork()的語義,讓fork()復(fù)制所有的線程,如果確實(shí)能夠?qū)崿F(xiàn),那么可以解決不一致問題。但是這需要修改內(nèi)核,而且
  do_fork()的實(shí)現(xiàn)會變得非常復(fù)雜。

或者僅僅把上面的不一致問題看成是用戶自己的責(zé)任,就像用戶自己malloc()后不free()導(dǎo)致內(nèi)存泄露一樣。
1.如果在多線程中fork()一個跟自己共享虛擬地址空間的線程(而非進(jìn)程),那么不會有不一致。
2.如果在單線程中fork()一個進(jìn)程,也不會出現(xiàn)不一致。
3.如果在多線程中fork()一個進(jìn)程,但是這個新進(jìn)程馬上使用execve(),也不會有問題。

只有在以下情形中會出現(xiàn)問題
4.如果在多線程中fork()一個進(jìn)程,但是不使用execve()之類的函數(shù),那么該新進(jìn)程中的全局變量就可能出現(xiàn)不一致。

論壇徽章:
0
3 [報告]
發(fā)表于 2008-11-24 21:51 |只看該作者
樓主辛苦

太復(fù)雜,我不干這種事

論壇徽章:
0
4 [報告]
發(fā)表于 2008-11-24 22:00 |只看該作者
LZ描述得好辛苦啊,我看都看半天。

順便:線程同步,信號量不夠用嗎?

論壇徽章:
0
5 [報告]
發(fā)表于 2008-11-24 22:05 |只看該作者
原帖由 nicozhou 于 2008-11-24 22:00 發(fā)表
LZ描述得好辛苦啊,我看都看半天。

順便:線程同步,信號量不夠用嗎?

這個不是信號量問題啊,信號量只是控制多線程的同步。
這里是指內(nèi)核實(shí)現(xiàn)fork()以及對進(jìn)程的抽象所帶來的問題。

論壇徽章:
0
6 [報告]
發(fā)表于 2008-11-24 22:13 |只看該作者
這個應(yīng)該由NPTL解決。。

論壇徽章:
0
7 [報告]
發(fā)表于 2008-11-24 22:23 |只看該作者
原帖由 雨過白鷺洲 于 2008-11-24 22:13 發(fā)表
這個應(yīng)該由NPTL解決。。

我土了,什么是NPTL?

論壇徽章:
0
8 [報告]
發(fā)表于 2008-11-24 22:32 |只看該作者
原帖由 雨過白鷺洲 于 2008-11-24 22:13 發(fā)表
這個應(yīng)該由NPTL解決。。


POSIX的東西?

論壇徽章:
0
9 [報告]
發(fā)表于 2008-11-24 22:55 |只看該作者
Linux線程就是由NPTL實(shí)現(xiàn)的,屬于glibc的一部分

論壇徽章:
0
10 [報告]
發(fā)表于 2008-11-24 23:02 |只看該作者
看了下SUS對線程調(diào)用fork()的說明,確實(shí)如樓主所說

我覺得,要么線程執(zhí)行fork()后調(diào)用exec,要么就不要fork(),這樣最簡單了
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP