程式
程式就是應用程式在記憶體中分配的空間,也就是正在執行的程式,各個程式之間互不干擾。同時程式儲存著程式每一個時刻執行的狀態。程式的兩個基本元素是程式程式碼和與程式碼關聯的資料集。程式執行的任意時刻包含了以下元素:
- 識別符號:與程式相關的唯一識別符號,用來區分其他執行緒
- 狀態:若程式正在執行,則程式處於執行態
- 優先順序:相對於其他程式的優先順序
- 程式計數器:程式中即將執行下一條指令的地址
- 記憶體指標:包括程式程式碼和程式相關資料的指標
- 上下文資料:程式執行時處理器的暫存器中的資料
執行緒
現代作業系統排程的最小單元是執行緒,也叫輕量級程式,在一個執行緒裡可以建立多個執行緒。程式中擁有一個或多個執行緒,線上程中有一個程式計數器,用來記錄接著要執行哪一條指令。執行緒擁有暫存器,用來儲存執行緒當前的工作變數,執行緒還擁有一個堆疊,用來記錄執行歷史,其中每一幀儲存了已呼叫但是還沒有從中返回的過程。
上圖展示了執行緒在執行的生命週期中6種不同的狀態,在給定的一個時刻,執行緒只能處於其中的一個狀態。
程式和執行緒的區別
程式是一個獨立的執行環境,而執行緒是在程式中執行的一個任務。他們兩個本質的區別是是否單獨佔有記憶體地址空間及其它系統資源(比如I/O):
- 程式單獨佔有一定的記憶體地址空間,所以程式間存在記憶體隔離,資料是分開的,資料共享複雜但是同步簡單,各個程式之間互不干擾;而執行緒共享所屬程式佔有的記憶體地址空間和資源,資料共享簡單,但是同步複雜。
- 程式單獨佔有一定的記憶體地址空間,一個程式出現問題不會影響其他程式,不影響主程式的穩定性,可靠性高;一個執行緒崩潰可能影響整個程式的穩定性,可靠性較低。
- 程式單獨佔有一定的記憶體地址空間,程式的建立和銷燬不僅需要儲存暫存器和棧資訊,還需要資源的分配回收以及頁排程,開銷較大;執行緒只需要儲存暫存器和棧資訊,開銷較小。