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. 經過進程和線程的執行過程咱們能夠看出,進程和線程是一對一或一對多的關係,一個進程至少包含一個線程,進程擁有一個完整的虛擬地址空間,它的空間大小是在設計它事就已經肯定的,不隨工人的多少,體積大小而改變,也就是說,不依賴於線程而獨立存在;反之,線程是進程的一部分,沒有本身的地址空間,與進程內的其餘線程一塊兒共享分配給該進程的全部資源。

 

  1. 線程在不多作進程調度和切換的實時系統中能夠有效地提升系統的執行效率,但並非在全部計算機系統中都是適用的。這就比如同一車間工人老是作同一種產品的產能要比常常切換車間,切換工種,作不一樣產品的產能要高,由於他們更換車間,熟悉環境,熟悉生產流程都須要花時間。這也就是說線程的建立要比進程的建立開銷要小的多。

 

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

好了,今天就先分享這麼多,《Linux就該這麼學》這本書寫的真的很是好,條理清晰,用通俗的語言闡明難懂的知識點,在這裏分享給你們,有興趣的同窗能夠去關注下啦!函數

相關文章
相關標籤/搜索