程式與執行緒
程式就是處於執行期的程式(目標碼存放在某種儲存介質上)。但是程式並不僅僅侷限於一段可執行程式碼段。通常程式還要包含其他資源,例如:開啟的檔案,掛起的訊號,核心內部資料,處理器狀態,一個或多個具有記憶體對映的的記憶體地址空間及一個或者多個執行執行緒(thread of execution)等。實際上,程式就是正在執行的程式程式碼的實時結果。
執行緒(thread),或者成為執行執行緒,是在程式中活動的物件。每個執行緒都擁有一個獨立的程式計數器、程式棧和一組程式暫存器。核心排程的物件是執行緒而不是程式。在傳統的Unix/Linux系統中,一個程式只包含一個執行緒,但現代作業系統中,包含多個執行緒的多執行緒程式司空見慣。<Linux系統的執行緒實現非常特別:它對執行緒和程式並不是特別區分。對Linux而言,執行緒只不過是一種特殊的程式罷了>
程式——資源分配的最小單位 執行緒——程式執行的最小單位
程式有獨立的堆疊和區域性變數,但執行緒沒有單獨的地址空間,一個執行緒死掉就等於整個程式死掉,所以多程式的程式要比多執行緒的程式健壯,但是程式切換時,耗費資源較大,效率要差一些(據統計是執行緒的30倍左右)。但是對於一些要求同時進行並且又要共享某些變數的併發操作,只能用執行緒,不能用程式。
為什麼使用多執行緒而不是多程式
執行緒間方便的通訊機制。對於不同程式來說,它們具有獨立的資料空間,要進行資料的傳遞只能通過程式間通訊的方式進行,這種方式不僅費時,而且很不方便。執行緒則不然,由於同一程式下的執行緒之間共享資料空間,所以一個執行緒的資料可以直接為其他執行緒所用。
併發和並行
併發又稱共行,是指能處理多個同時性活動的能力,併發事件之間不一定要同一時刻發生。 比如,現代計算機系統可在同一段時間內以程式的形式將多個程式載入到儲存器中,並藉由處理器的分時多工, 以在一個處理器上表現出同時執行的感覺。
並行是指同時發生的兩個併發事件,具有併發的含義,而併發則不一定並行。
併發和並行的區別就是一個處理器同時處理多個任務和多個處理器或者是多核的處理器同時處理多個不同的任務。 前者是邏輯上的同時發生(simultaneous),而後者是物理上的同時發生。
以上這些都是一些比較淺顯的概念,深入的概念可以去查閱相關的linux/Unix相關資料。
時:2018年4月18日