Thread and Process by Linus Torvalds

機緣巧合下在linux內核開發的郵件組里看到這篇年代久远的郵件,是Linus大神回答關於Thread和Process的。覺得大神就是大神,把這個問題回答得乾淨利索,不服不行 - 雖然我不大看得懂,所以我特意把它翻譯成中文,備忘。


不!
萬萬不能把線程和進程看成單獨的實體。雖然傳統上它們是被視為單獨的,但我個人認為這是個大錯誤,那是個歷史遺留問題。

線程和進程實際上都是指一個東西:“執行的上下文”。人為地去將它們倆區分開實際上是作繭自縛。

執行的上下文,即所謂的COE(Context of Execution), 是該COE所有狀態的聚合。 所謂的狀態包括CPU狀態(寄存器等等),MMU狀態(頁映射),權限狀態(uid,gid)和各種“通信狀態”(如打開文件,信號handler等等)。

習慣上來說,線程與進程之間的區別主要在於線程具有CPU狀態(可能還另外有一些其他小狀態),同時其他的上下文來自進程。 然而,這只是將COE的總狀態分割開的一個方式而已,並不是說這是正確的方式。 把自己限制與這樣的想法是極其愚蠢的。

Linux工作的方式(同時也是我想要的)是,不存在一個叫進程或者線程的東西。 只有COE的總和(Linux將它稱為任務)。不同的COE可以共享自己的一部分上下文, 其中這共享的部分的子集就是傳統中的線程/進程, 但這應該只視之為一個子集(它是一個重要的子集,但它的重要性不是來自設計,而是源自標準:明顯我們想在Linux上執行符合標準的線程程序)。

簡而言之,不要基於線程/進程來設計。內核應該基於COE來設計,這樣的話, pthreads庫就能將有限的pthreads接口暴露給那些想用那樣的COE的用戶。

comments powered by Disqus