進程
定義:
進程是指一個具有一定獨立功能的程序在一個數據集合上的一次動態執行的過程。
組成:
- 代碼
- 數據
- 狀態寄存器(正在運行的一個程序的所有狀態信息):CPU狀態CP0、指令指針IP
- 通用寄存器:AX、BX、CX
- 進程占用系統資源:打開文件、已分配內存
特點:
- 動態性:客動態地創建、結束進程
- 并發性:進程既可以被獨立調度并占用處理機運行
- 獨立性:不同的進程的工作不相互影響
- 制約性:因訪問共享數據/資源或進程間同步而產生制約
進程與程序的聯系:
- 進程是操作系統處于執行狀態程序的抽象。程序 = 文件(靜態的可執行文件);進程 = 執行中的程序 = 程序 + 執行狀態
- 同一個程序的多次至干性過程對應為不同進程。如命令“ls”的多次執行對應多個進程
- 進程執行需要的資源。內存:保存代碼和數據;CPU:執行指令
進程與程序的區別:
- 進程是動態的,程序是靜態的。程序是有序代碼的集合;進程是程序的執行,進程有內核態/用戶態
- 進程是暫時的,程序是永久的。進程是一個狀態變化的過程;程序可長久保存
- 進程與程序的組成不同。進程的組成包括程序、數據和進程控制塊
進程控制塊(Process Control Block, PCB):
定義:操作系統管理控制進程運行所用的信息集合。
操作系統用PCB來描述進程的基本情況以及運行變化的過程。
PCB是進程存在的唯一標志,每個進程都在操作系統中有一個對應的PCB
使用:
- 進程創建時生成該進程的PCB
- 進程終止時回收它的PCB
- 通過對PCB的組織管理來實現對進程的組織管理
內容:
- 進程標識信息。PID:進程號,UID等 哪個程序在執行,執行了幾次,用戶標識
- 處理機現場保存,主要就是寄存器,保存進程的運行現場信息:堆棧指針:記錄堆棧現場;指令指針:記錄進程運行到哪
- 進程控制信息:
- 調度和狀態信息:進程和處理機使用情況調度
- 進程間通信信息:進程間通信相關的各種標識
- 存儲管理信息:指向進程映像存儲空間數據結構
- 進程所用資源:進程使用的系統資源,如打開文件等
- 有關數據結構連接信息:通過與PCB相關的進程隊列實現
組織
- 鏈表(便于插刪,用于通用的OS):同一狀態的進程PCB為一鏈表,多個狀態對應更多個不同的鏈表,就緒鏈表,阻塞鏈表
- 索引表(數組,不利于插刪,使用于固定數目的進程,相對創建更快捷):同一狀態的歸入一個index表(每一個index指向PCB),就緒/阻塞索引表
進程狀態
劃分在不同操作系統中可能不同,但是大致可以分為:
- 系統初始化時,創建INIT進程,INIT再負責創建其他進程;用戶請求創建一個NEW PROCESS;正在運行的進程執行了創建進程的系統調用。
- 進程就緒:進程獲取了除處理機之外的資源,得到了處理機即可運行
- 進程運行:內核選擇一個就緒的進程,讓它占用處理機(cpu)并執行
- 進程阻塞(等待)的三種情況:請求并等待系統服務,無法馬上完成;啟動某種操作(和其他進程協調工作),無法馬上完成;需要的數據沒有到達。進程自己觸發阻塞,因為只有自己才知道何時需要等待某事件
- 進程搶占:進程會被搶占情況:高優先級進程就緒;進程執行當前時間用完。
- 進程喚醒的情況:需要的資源可被滿足;等待的事件到達。因為自身沒有占用cpu執行,所以只能被OS或其他進程喚醒
- 進程結束的情形:自愿(正常退出,錯誤退出),強制性的(致命錯誤,被其他進程所殺)
進程切換
三狀態進程模型:
創建與退出只是兩個短暫的狀態,除此之外簡化為三個狀態:就緒、運行、等待。裝填變遷如下圖。
- 運行狀態:進程正在處理機上運行
- 就緒狀態:進程獲取了除處理機之外的資源,得到了處理機即可運行
- 阻塞狀態:進程正在等待某一事件出現而暫停運行
- 創建狀態:進程正在被創建,還沒轉到就緒狀態之前的狀態
- 退出狀態:進程正在從系統中消失時的狀態,這是因為進程結束或由于其他原因所導致
掛起進程模型:
處在掛起狀態的進程映像在磁盤上,目的是減少進程占用內存。也就是說掛起就是把一個處于就緒或者等待狀態的進程從內存轉存到外存,通常選擇低優先級進程進行掛起。
1、進程掛起
不同于進程阻塞。掛起時沒有占用該內存空間,而是映像在磁盤上。類似虛存中,有的程序段被放到了硬盤上。?可以合理、充分地利用系統資源。Suspend:把一個進程從內存轉到外存。?
2、掛起狀態
- 堵塞掛起狀態:進程再外存并等待某事件的出現
- 就緒掛起狀態:進程再外存,但只要進入內存即可運行
3、狀態轉換
內存中被掛起:
①堵塞到堵塞掛起:沒有進程處于就緒狀態或就緒進程要求更多內存資源
②就緒到就緒掛起:當高優先級等待進程和低優先級就緒進程
③運行到就緒掛起:對搶占式分時系統,當有高優先級等待掛起進程因事件出現而進入就緒掛起
外存中激活:
①阻塞掛起到就緒掛起: 相關事件出現時,轉變為就緒掛起但還在硬盤上。
②解掛/激活 activate:外存到內存,需要運行該進程時
就緒掛起到就緒態: 沒有就緒進程或掛起就緒優先進程優先級高于當前就緒進程時
堵塞掛起到堵塞態:當一個進程釋放了足夠內存時,OS把高優先級阻塞掛起(認為很快出現等待的事件)轉換為阻塞進程
狀態隊列
- 由操作系統來維護一組隊列,表示系統中所有進程的當前狀態。
- 不同隊列表示不同狀態。根據進程狀態不同,進程PCB進入對應的隊列。
線程
引入原因:一個進程內部可能有多種事件可以并發地執行,比如播放音樂時,可以拆分為磁盤讀取、解碼和播放三個子流程,讀取主要是I/O操作,解碼主要是CPU工作,這兩者是可以并發執行的。因此很多時候需要在進程內部增加一類實體,滿足以下特性:實體之間可以并發執行、實體之間共享相同的地址空間。在這種需求之下,出現了線程。
定義:線程是進程的一部分,描述指令流執行狀態,它是進程的指令執行流的最小單元,是CPU調度的基本單位。
- 進程的資源分配角色:進程由一組相關資源構成,包括地址空間(代碼段、數據段)、打開的文件等各種資源。
- 線程的處理機調度角色:線程描述在進程資源環境中的指令流的執行狀態。每個線程有自己獨立的指令指針等。
線程的優點:
- 一個進程中可以同時存在多個線程
- 線程之間可以并發地進行
- 線程之間可以共享地址空間和文件等資源
線程的缺點:
-
在進程空間內有多個控制流且執行流程不一樣,有各自獨立的寄存器和堆棧,但共享代碼段,數據段,資源。?如果一個線程寫錯了,崩潰,如破壞了數據,會導致這個進程的所有線程都崩潰。
線程與進程的比較
- 進程是資源分配單元(內存,打開的文件,訪問的網絡),線程是CPU調度單位,CPU也是一種特殊的資源,要執行控制流需要的相關信息
- 進程擁有一個完整資源平臺,而線程只獨享必不可少的資源如寄存器和棧
- 線程同樣具有就緒、阻塞和執行三種基本狀態和轉換關系
- 線程能減少并發執行的時空開銷:
線程的創建時間比進程短
線程的終止時間比進程短
同一進程內的線程切換時間比進程短
由于統一進程的各線程間共享內存和文件資源,可不通過內核進行直接通信。線程的終止時間比進程短
線程三種實現方式:
- 用戶線程:在用戶空間實現,OS看不到,由應用程序的用戶線程庫來管理;POSIX Pthreads, Mach C-threads
- 內核線程:在內核中實現,OS管理的;Windows
- 輕量級進程lightweight process:內核中實現,支持用戶線程。Solaris, Linux
- 用戶線程與內核線程間,可以是多對一,一對一,多對多
用戶線程:
由一組用戶級的線程庫函數來完成線程的管理。如POSIX Pthreads等。
優點:
- 不依賴于操作系統內核,可以用于不支持線程的多進程操作系統
- 在用戶空間實現的線程機制
- 同一進程內的用戶線程切換速度快,無需在用戶態與核心態之間切換
- 允許每個進程擁有自己的線程調度算法
缺點:
- 線程發起系統調用而阻塞時,整個進程進入等待
- 不支持基于線程的處理機搶占,除非當前運行線程主動放棄,它所在的線程的其他線程無法搶占CPU
- 只能按進程分配CPU時間,多個線程進程中,每個線程的時間片較少。
內核線程:
由內核通過系統調用實現的線程機制,由內核完成線程的創建、終止和管理。如Windows、Linux等
特點:
- 由內核維護PCB和TCB
- 線程執行系統調用而被阻塞不影響其他線程
- 線程的創建、終止和切換開銷相對較大,因為通過系統調用/內核函數,在內核空間實現
- 以線程為單位進行CPU時間分配,多線程的進程可以獲得更多CPU時間。
輕量級進程:
內核支持的用戶線程,一個進程可以有一個或多個輕量級進程,每個輕權進程由一個單獨的內核線程來支持。如Solaris。最后這個被證實優點沒有被很好地體現出來。
用戶線程與內核線程的對應關系:
可以有如下圖多種方式,最后證明一對一是最優的。