以下內容整理自互聯網,僅用于個人學習
1. 進程
1.1 進程的定義
- 進程是程序運行的一次執行過程。
- 進程是一個程序及其數據在處理機上順序執行所發生的活動。
- 進程是具有獨立功能的程序在一個數據集合上運行的過程,它是系統進行資源分配和調度的一個獨立單位。
為了使參與并發執行的程序(含數據)能獨立的運行,必須為之配置一個專門的數據結構,稱為進程控制塊(Process Control Block,PCB)。系統利用PCB來描述進程的基本情況和運行狀態,進而控制和管理進程。相應地,由程序段、相關數據段和PCB三部分過程了進程映像(進程實體)。所謂創建進程,實質上是創建進程映像中的PCB;而撤銷進程實質上是撤銷進程的PCB。值得注意的是,進程映像是靜態的,進程則是動態的。
PCB是進程存在的唯一標識!
引入進程實體的概念后,我們可以把傳統操作系統中的進程定義為:
進程是進程實體的運行過程,是系統進行資源分配和調度的一個獨立單位。
1.2 進程狀態轉換
- 運行狀態:進程正在處理機上運行。但處理機環境下,每一時刻最多只有一個進程處于運行狀態。
- 就緒狀態:進程已處于準備運行狀態,即進程獲得了除了處理機之外的一切所需資源,一旦得到處理機即可運行。
- 阻塞狀態:又稱為等待狀態。進程正在等待某一事件而暫停運行,如等待某資源為可用(不包括處理機)或等待輸入/輸出完成。即使處理器空閑,該進程也不能運行。
- 創建狀態:進程正在被創建,尚未轉入到就緒狀態。進程創建需要多個步驟:首先申請一個空白的PCB,并向PCB中填寫一些控制和管理進程的信息;然后由系統為該進程分配運行時所必需的資源;最后把該進程轉入就緒狀態。
- 結束狀態:進程正從系統中消失,這可能是進程正常結束或其他原因中斷退出運行。當進程需要結束運行時,系統首先必須置該進程為結束狀態,然后進一步處理資源釋放和回收等工作。
- 就緒→運行:處于就緒狀態的進程被調度后,獲得處理機資源(分派處理機時間片),于是進程由就緒狀態轉運行狀態。
- 運行→就緒:處于運行狀態的進程在時間片用完后,不得不讓出處理機,從而進程由運行狀態轉換為就緒。此外,在可剝奪的操作系統中,當有更高級的進程就緒時,調度程度將正執行的進程轉換為就緒狀態,讓更高優先級的進程執行。
- 運行→阻塞:當進程請求某一資源(如外設)的使用和分配或等待某一事件的發生(如I/O操作的完成)時,它就從運行狀態轉換為阻塞狀態。進程以系統調用的形式請求操作系統提供服務,這是一種特殊、由用戶態程序調用操作系統內核過程的形式。
- 阻塞→就緒:當進程等待的時間到來時,如I/O操作結束或中斷結束時,終端處理程序必須把相應的進程狀態由阻塞狀態轉為就緒狀態。
2. 線程
引入進程的目的,是為了使多道程序并發執行,以提高資源利用率和系統吞吐量;而引入線程,則是為了減少程序在并發執行時所付出的時空開銷,提高操作系統的并發性能。
線程就是"輕量級進程",它是一個基本的CPU執行單元,也是程序執行流的最小單元,由線程ID、程序計數器、寄存器集合和堆棧組成。線程自己不擁有系統資源,只擁有在運行中必不可少的資源,但與其他線程共享進程所擁有的全部資源。
線程也有 就緒、阻塞、運行 三種基本狀態。
引入線程后,進程的內涵發送了改變:進程只作為除CPU以外系統資源
的分配單元,線程則作為處理機分配單元。
3. 進程與線程比較
3.1 調度
在傳統操作系統中,用于資源和獨立調度的基本單位都是進程。在引入線程的操作系統中,線程是獨立調度的基本單位,進程是資源擁有的基本單位。統一進程中,線程的切換不會引起進程切換。在不同進程中的線程切換,如從一個進程內的線程切換到另一個進程的線程時,會引起進程切換。
3.2 資源
不論是傳統操作系統還是設有線程的操作系統,進程都是擁有資源的基本單位,而線程不擁有系統資源(也有一點必不可少的資源),但線程可以訪問其隸屬進程的系統資源。
3.3 并發性
在引入線程的操作系統中,不僅進程之間可以并發執行,而且多個線程之間也可以并發執行,從而使操作系統具有更好的并發性,提高系統的吞吐量。
3.4 系統開銷
由于創建或撤銷進程時,系統都要為之分配或回收資源,如內存空間、I/O設備等,因此操作系統所付出的開銷遠大于創建或撤銷線程時的開銷。
類似的,在進行進程切換時,涉及當前執行進程CPU環境的保存以及新調度到進程CPU環境的設置,而線程切換只需保存和設置少量寄存器內容,開銷很小。
此外,由于同一個進程內的多個線程共享進程的地址空間,因此,這些線程之間的同步與通信非常容易實現,甚至無需操作系統的干預。
3.5 地址空間和其他資源(如打開文件)
進程的地址空間之間相互獨立,同一進程的各線程間共享進程的資源,某進程內的線程對于其他進程不可見。
3.6 通信
進程間通信(IPC)需要進程同步和互斥手段輔助,以保證數據的一致性,而線程間可以直接讀寫進程數據段(如全局變量)來進行通信。