Linux中進程與線程的概念以及區別

linux進程與線程的區別,早已成為IT界經常討論但熱度不減的話題。無論你是初級程序員,還是資深專家,都應該考慮過這個問題,只是層次角度不同罷了。對於一般的程序員,搞清楚二者的概念並在工作中學會運用是其思考的主要問題;對於資深工程師,如何在系統層面實現兩種技術及其各自的性能和實現代價是其思考的主要問題。由此可見進程和線程在IT界的重要地位。

Linux中進程與線程的概念以及區別


	進程和線程是操作系統的基本概念,它們之間既有區別又有聯繫。從定義來看,它們比較抽象,很難理解。今天給大家打個比方,教大家用類比的方法去理解它,掌握它。其實,進程和線程的關係就好比是工廠車間和車間工人的關係,進程就像是一個工廠車間,線程就像是車間裡的工人,每個工廠車間有一個入口和出口,這就好比執行進程程序的主函數;每個工廠車間都有自己的地址空間,這個空間裡邊可以包含不同工種的工人,這就好比一個進程的地址空間,包含文本區域,數字區域,堆棧;一個工廠車間可以容納1個或n車間工人,進程和線程是一對一或一對多的關係,一個進程至少包含一個線程;車間裡的工人共享車間裡的空間,這象徵著一個進程的內存空間是共享的,每個線程都可以使用共享內存;每個車間可以供不同的工人使用,但每個車間的大小不一,容納人數都有上限,比如說每個廁所可以容納1人,每個廚房可以容納n人,但車間裡的每個工人都有上廁所和吃飯的需求,那怎麼解決這個問題呢?分批次進行!這就好比線程裡的鎖機制,當n個線程爭奪同一資源時,就在這個資源上加把鎖,當線程使用完畢,資源釋放後才會供給後邊的資源使用。有人可能會問,怎麼確定使用該資源的先後順序呢?按照優先級的高低來確定,優先級高的先使用,優先級低的後使用,同一級別按照先來後到的順序使用。 

通過這個故事我麼可以看出,操作系統的設計可以歸納為3點:

(1) 以多進程形式,允許多個任務同時運行,也就是允許工廠裡的多個車間同時工作;

(2) 以多線程形式,允許單個任務分成不同的部分運行,也就是允許同一車間可以有不同的工種完成不同的任務;

(3) 提供協調機制,一方面防止進程和線程之間產生衝突,另一方面進程和線程之間共享資源。

我們大致對進程和線程有一個基本的概念之後,接下來再來看下進程和線程之間的區別:

(1) 進程的執行過程是順序執行的,雖然在執行過程中可能發生中斷或暫停,但該進程所擁有的資源只為該線狀執行過程服務。就好比一次只能給一個車間供電的工廠,當一個車間A正在工作時,另外一個更高級的車間B也要開啟工作時,那麼此時車間A就要斷電,但車間A的一切設施和位置都不會發生變化,等車間B斷電後,車間A繼續工作。這是進程宏觀上的線性執行過程。而線程的改變只是改變了CPU執行過程,而沒有發生進程所擁有資源的變化。除了CPU之外,計算機內的軟硬件資源的分配與線程無關,線程只能共享它所屬進程的資源。這就好比一個車間裡的工人,他們可以互換位置,但他們還是在同一車間。

(2) 進程在執行過程中與線程還是有區別的。進程是執行中的程序,每個獨立的進程有一個程序運行的入口、順序執行序列和程序的出口,這就是程序中的主函數。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。就好比每個車間都有一個進口和出口,可以單獨生產一件產品,但這依賴於車間裡的工人協同工作才能完成。

(3) 通過進程和線程的執行過程我們可以看出,進程和線程是一對一或一對多的關係,一個進程至少包含一個線程,進程擁有一個完整的虛擬地址空間,它的空間大小是在設計它事就已經確定的,不隨工人的多少,體積大小而改變,也就是說,不依賴於線程而獨立存在;反之,線程是進程的一部分,沒有自己的地址空間,與進程內的其他線程一起共享分配給該進程的所有資源。

(4) 線程在很少做進程調度和切換的實時系統中可以有效地提高系統的執行效率,但並不是在所有計算機系統中都是適用的。這就好比同一車間工人總是做同一種產品的產能要比經常切換車間,切換工種,做不同產品的產能要高,因為他們更換車間,熟悉環境,熟悉生產流程都需要花時間。這也就是說線程的創建要比進程的創建開銷要小的多。

(5) 從邏輯角度來看,多線程的意義在於一個應用程序中,他們可以實現應用程序的多個功能,但並不能實現一個完整的應用程序。就好比生產一個複雜的產品,每個車間只是生產該產品一個或多個零部件,一個完成的產品還是要靠整個工廠來完成。換言之,進程的調度和管理以及資源分配還是要靠操作系統來完成,這就是進程和線程的重要區別。

好了,今天就先分享這麼多,《Linux就該這麼學》這本書寫的真的非常好,條理清晰,用通俗的語言闡明難懂的知識點,在這裡分享給大家,有興趣的同學可以去關注下啦!


分享到:


相關文章: