Linux中程序與執行緒的概念以及區別
linux程序與執行緒的區別,早已成為IT界經常討論但熱度不減的話題。無論你是初級程式設計師,還是資深專家,都應該考慮過這個問題,只是層次角度不同罷了。對於一般的程式設計師,搞清楚二者的概念並在工作中學會運用是其思考的主要問題;對於資深工程師,如何在系統層面實現兩種技術及其各自的效能和實現代價是其思考的主要問題。由此可見程序和執行緒在IT界的重要地位。
程序和執行緒是作業系統的基本概念,它們之間既有區別又有聯絡。從定義來看,它們比較抽象,很難理解。今天給大家打個比方,教大家用類比的方法去理解它,掌握它。其實,程序和執行緒的關係就好比是工廠車間和車間工人的關係,程序就像是一個工廠車間,執行緒就像是車間裡的工人,每個工廠車間有一個入口和出口,這就好比執行程序程式的主函式;每個工廠車間都有自己的地址空間,這個空間裡邊可以包含不同工種的工人,這就好比一個程序的地址空間,包含文字區域,數字區域,堆疊;一個工廠車間可以容納1個或n車間工人,程序和執行緒是一對一或一對多的關係,一個程序至少包含一個執行緒;車間裡的工人共享車間裡的空間,這象徵著一個程序的記憶體空間是共享的,每個執行緒都可以使用共享記憶體;每個車間可以供不同的工人使用,但每個車間的大小不一,容納人數都有上限,比如說每個廁所可以容納1人,每個廚房可以容納n人,但車間裡的每個工人都有上廁所和吃飯的需求,那怎麼解決這個問題呢?分批次進行!這就好比執行緒裡的鎖機制,當n個執行緒爭奪同一資源時,就在這個資源上加把鎖,當執行緒使用完畢,資源釋放後才會供給後邊的資源使用。有人可能會問,怎麼確定使用該資源的先後順序呢?按照優先順序的高低來確定,優先順序高的先使用,優先順序低的後使用,同一級別按照先來後到的順序使用。
通過這個故事我麼可以看出,作業系統的設計可以歸納為3點:
(1) 以多程序形式,允許多個任務同時執行,也就是允許工廠裡的多個車間同時工作;
(2) 以多執行緒形式,允許單個任務分成不同的部分執行,也就是允許同一車間可以有不同的工種完成不同的任務;
(3) 提供協調機制,一方面防止程序和執行緒之間產生衝突,另一方面程序和執行緒之間共享資源。
我們大致對程序和執行緒有一個基本的概念之後,接下來再來看下程序和執行緒之間的區別:
(1) 程序的執行過程是順序執行的,雖然在執行過程中可能發生中斷或暫停,但該程序所擁有的資源只為該線狀執行過程服務。就好比一次只能給一個車間供電的工廠,當一個車間A正在工作時,另外一個更高階的車間B也要開啟工作時,那麼此時車間A就要斷電,但車間A的一切設施和位置都不會發生變化,等車間B斷電後,車間A繼續工作。這是程序巨集觀上的線性執行過程。而執行緒的改變只是改變了CPU執行過程,而沒有發生程序所擁有資源的變化。除了CPU之外,計算機內的軟硬體資源的分配與執行緒無關,執行緒只能共享它所屬程序的資源。這就好比一個車間裡的工人,他們可以互換位置,但他們還是在同一車間。
(2) 程序在執行過程中與執行緒還是有區別的。程序是執行中的程式,每個獨立的程序有一個程式執行的入口、順序執行序列和程式的出口,這就是程式中的主函式。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。就好比每個車間都有一個進口和出口,可以單獨生產一件產品,但這依賴於車間裡的工人協同工作才能完成。
(3) 通過程序和執行緒的執行過程我們可以看出,程序和執行緒是一對一或一對多的關係,一個程序至少包含一個執行緒,程序擁有一個完整的虛擬地址空間,它的空間大小是在設計它事就已經確定的,不隨工人的多少,體積大小而改變,也就是說,不依賴於執行緒而獨立存在;反之,執行緒是程序的一部分,沒有自己的地址空間,與程序內的其他執行緒一起共享分配給該程序的所有資源。
(4) 執行緒在很少做程序排程和切換的實時系統中可以有效地提高系統的執行效率,但並不是在所有計算機系統中都是適用的。這就好比同一車間工人總是做同一種產品的產能要比經常切換車間,切換工種,做不同產品的產能要高,因為他們更換車間,熟悉環境,熟悉生產流程都需要花時間。這也就是說執行緒的建立要比程序的建立開銷要小的多。
(5) 從邏輯角度來看,多執行緒的意義在於一個應用程式中,他們可以實現應用程式的多個功能,但並不能實現一個完整的應用程式。就好比生產一個複雜的產品,每個車間只是生產該產品一個或多個零部件,一個完成的產品還是要靠整個工廠來完成。換言之,程序的排程和管理以及資源分配還是要靠作業系統來完成,這就是程序和執行緒的重要區別。
好了,今天就先分享這麼多,《Linux就該這麼學》這本書寫的真的非常好,條理清晰,用通俗的語言闡明難懂的知識點,在這裡分享給大家,有興趣的同學可以去關注下啦!