標籤:

進程和線程有什麼區別?


一、關於進程和線程,首先從定義上理解就有所不同

1、進程是什麼?

是具有一定獨立功能的程序、它是系統進行資源分配和調度的一個獨立單位,重點在系統調度和單獨的單位,也就是說進程是可以獨 立運行的一段程序。

2、線程又是什麼?

線程進程的一個實體,是CPU調度和分派的基本單位,他是比進程更小的能獨立運行的基本單位,線程自己基本上不擁有系統資源。

在運行時,只是暫用一些計數器、寄存器和棧 。

二、他們之間的關係

1、一個線程只能屬於一個進程,而一個進程可以有多個線程,但至少有一個線程(通常說的主線程)。

2、資源分配給進程,同一進程的所有線程共享該進程的所有資源。

3、線程在執行過程中,需要協作同步。不同進程的線程間要利用消息通信的辦法實現同步。

4、處理機分給線程,即真正在處理機上運行的是線程。

5、線程是指進程內的一個執行單元,也是進程內的可調度實體。

三、從三個角度來剖析二者之間的區別

1、調度:線程作為調度和分配的基本單位,進程作為擁有資源的基本單位。

2、並發性:不僅進程之間可以並發執行,同一個進程的多個線程之間也可以並發執行。

3、擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統資源,但可以訪問隸屬於進程的資源。


書面的講,進程和線程基本是一個東西,只是進程可以包含若干個線程。此外就是在操作系統中的層級上,也就是粒度不同外,無甚其他大的區別。在一般使用中,需要就多開幾個Thread即可。

形象的講,進程就是一個項目組,每個程序員就是裡面的線程呀!當然一個程序員也可以叫做一個項目組,對應的就是一個進程只有一個線程。公司裡面的任務是分配給項目組級別的,幹活的就是其中的程序員。總的意思就是,進程和線程沒有什麼區別。

吐槽的話:我的意思就是進程干不過來了,那就多開幾個線程呀!


進程與線程的一個簡單解釋


對於Linux程序員來說,進程和線程的區別,在進程/線程空間中的不同,是最大的不同。

首先明確,進程至少有一個線程(單進程單線程)。

用戶進程主要段segment:stack(向低地址),heap,.rodata,data/bss,.text。

一個進程,上面的6部分是主要的,必須的。

由於線程是進程的子集,那麼如果存在多個線程,線程擁有全部的6部分segment的許可權嗎?

答案是否定的。

線程只擁有stack(線程棧,線程棧是單個線程所獨享的),保存自己的函數調用過程,比如heap,.rodata,data/bss,text段都是共享的。

在實際過程中,有一個很棘手的問題,就是線程安全函數。

有的函數不是線程安全的,有的函數是線程安全的。

比如在localtime()裡面,就有兩個版本

struct tm *localtime(const time_t *timep);

struct tm *localtime_r(const time_t *timep, struct tm *result);

看第一個函數,返回一個tm類型的指針,我們可以肯定,在localtime()裡面,tm指針結果存儲於靜態存儲中,並返回指向靜態存儲的指針。如果多個線程,在調用了localtime()函數,那麼多個線程共享了這塊內存,對內存的修改,會導致race condition(race condition的舉例:如果計算機中的兩個進程同時試圖修改一個共享內存的內容,在沒有並發控制的情況下,最後的結果依賴於兩個進程的執行順序與時機。而且如果發生了並發訪問衝突,則最後的結果是不正確的。from wikipedia)

看第二個函數,首先說結論,localtime_r是線程安全的。程序員自己malloc一塊內存,然後把指針傳給localtime_r,那麼及時有多個線程調用該函數,也不會導致race condition,因為每次調用的指針是不同的,指針存儲在線程棧上面。不同線程之間,不能訪問線程棧,這樣就不會獲得malloc的堆地址。不會存在race condition


  1. 定義方面:進程是程序在某個數據集合上的一次運行活動;線程是進程中的一個執行路徑。
  2. 角色方面:在支持線程機制的系統中,進程是系統資源分配的單位,線程是系統調度的單位。
  3. 資源共享方面:進程之間不能共享資源,而線程共享所在進程的地址空間和其它資源。同時線程還有自己的棧和棧指針,程序計數器等寄存器。
  4. 獨立性方面:進程有自己獨立的地址空間,而線程沒有,線程必須依賴於進程而存在。

詳情請移步

android 線程與進程 區別 聯繫

關於線程和進程的一篇文章。歡迎大佬拍磚

作者:李爭

鏈接:線程和進程的區別是什麼? - 李爭的回答 - 知乎

來源:知乎

著作權歸作者所有,轉載請聯繫作者獲得授權。


推薦閱讀:

如何評價在瀏覽器端實現Unix環境的Browsix框架?
如何評價 Windows 10 Mobile 10240 版本?
你為什麼需要windows系統的手機?
OS X El Capitan 正式版的使用體驗如何?
如何做一個線程鏡像?

TAG:操作系統 |