進程的基本概念
順序執行
僅當前一操作執行完畢後,才能執行後續操作。
特徵
-
順序性
處理機嚴格按照程序所規定的順序執行,即每個操作必須在下一個操作開始之前結束。
- 外部順序性
- 內部順序性
-
封閉性
程序是在封閉的環境下運行的,它獨佔系統資源,執行過程中不受外界影響。
-
結果可再現性
程序執行得到的最終結果與程序執行速度無關,只要初始狀態相同,每次執行結果必然相同。
併發執行
爲了調高效率,允許若干個程序段同時在系統中運行。
特徵
-
間斷性
-
失去封閉性
-
結果不可再現性
結論
併發環境下,"程序"一詞對描述和管理系統下各併發任務的執行過程已經不適用了。
進程定義
進程是程序的一次執行
進程是一個程序及其數據在處理機上順序執行時發生的活動
進程是程序在一個數據集合上運行的過程,它是系統進行資源分配和調度的一個獨立單元。
傳統OS中的進程定義:
“進程是進程實體的運行過程,是系統進行資源分配和調度的一個獨立單位。”
進程和程序的區別與聯繫
-
程序是指令的集合,是靜態的概念。進程是程序在處理機上的一次執行的過程,是動態的概念。程序可以作爲軟件資料長期保存。進程是有生命週期的。
-
進程是一個獨立的運行單位,能與其它進程併發活動。而程序不是。
-
進程是競爭計算機系統有限資源的基本單位,也是進行處理機調度的基本單位。
-
一個程序可以作爲多個進程的運行程序,一個進程也可以運行多個程序。
進程狀態
-
就緒態 一個進程已經具備運行條件,但由於CPU暫時不能運行的狀態。
-
執行態 進程佔有CPU,並在CPU上運行。
-
阻塞態 也稱爲等待態、封鎖態。指進程因等待某種事件的發生而暫時不能運行的狀態。
阻塞態不能直接轉執行態,還需放入到就緒態進行排隊,因爲這樣高效並且簡單。
掛起態
在系統資源不足的情況下,操作系統會對內存中的進程進行合理的安排,其中有的進程被暫時掉離出內存,即處於“掛起”狀態。當條件允許的時候,會被操作系統再次調回內存,重新進入就緒態等待處理機調度。
引入掛起狀態的原因:
-
終端用戶的請求
-
父進程請求
-
負荷調節的需求
-
操作系統的需求
進程狀態的轉換:
活動就緒->靜止就緒
活動阻塞->靜止阻塞
靜止就緒->活動就緒
靜止阻塞->活動阻塞
進程控制塊
作用
存放進程的管理和控制信息的數據結構稱爲進程控制塊。它是進程管理和控制的重要的數據結構,在進程創建時,系統爲該進程建立PCB,並伴隨其運行的全過程,直到進程撤銷而撤銷。
PCB的作用是使一個在多道程序環境下不能獨立運行的程序(含數據),成爲一個能獨立運行的基本單位,一個能與其它進程併發執行的進程。
進程控制塊中的信息
進程描述信息
- 進程標識符
-
進程家族關係
父進程標識、子進程標識
-
用戶
指示擁有該進程的用戶
處理機狀態 (CPU現場保護結構、進程上下文)
-
通用寄存器
又稱爲用戶可視寄存器,它們是用戶程序可以訪問的,用於暫存信息。
-
指令計數器PC
其中存放了要訪問的下一條指令的地址。
-
程序狀態字PSW
其中含有狀態信息,如條件碼、執行方式、中斷屏蔽標誌。
-
用戶棧指針
指每個用戶進程都有一個或者若干個與之相關的系統棧,用於存放過程和系統調用參數及調用地址。
進程調度信息
-
進程狀態
指明進程當前狀態,作爲進程調度和對換時的依據。
-
進程優先級
用於描述進程使用處理機的優先級別的整數,優先級高的進程應優先獲得處理機。
-
進程調度所需的其它信息
它們與所採用的進程調度算法有關,如進程已等待CPU的時間總和,進程已執行的時間綜合等。
-
事件
是指進程由執行狀態轉變爲阻塞狀態所等待發生的事件,即阻塞的原因。
進程控制信息
-
程序和數據的地址
指進程的程序和數據所在的內存或外存地(首)址,以便再調度到該進程執行時,能從PCB中找到其程序和數據。
-
進程同步和通信機制
指實現進程同步和進程通信時必須的機制,如消息隊列、信號量等。
-
資源清單
是一張列出了除CPU以外、進程所需的全部資源及已分配到該進程的資源清單。
-
鏈接指針
給出本進程(PCB)所在隊列中的下一個進程的PCB的首地址。
進程控制
就是系統使用一些具有特定功能的程序段來創建進程、撤銷進程以及完成進程各狀態之間的轉換,從而達到多線程高效率併發執行、實現資源共享的目的。
爲防止OS本身或關鍵數據被其他程序破壞,一般將處理機執行狀態分成以下2種:
-
系統態(管態/內核態):它具有較高的特權,能執行一切指令,訪問所有寄存器和存儲區。
-
用戶態(目態):具有較低的特權,僅能執行特定指令,訪問指定寄存器和存儲區。
應用程序只能工作在用戶態。
OS的內核一般包括以下2方面功能:
支撐功能:時鐘管理、中斷處理、原語操作
資源管理功能:進程管理、存儲器管理、設備管理
原語 (Primitive)
系統態下執行的某些具有特定功能的程序段。
也指原子操作——不可分割的基本單位。
創建原語Create
進程創建過程:
-
申請空白PCB
-
爲新進程分配資源
-
初始化進程控制塊
-
將新進程插入就緒隊列 (前提是有空間能接納新進程)
進程創建的事件:
-
用戶登錄
-
作業調度
-
提供服務: 以上三種由系統內核創建
-
應用請求: 由用戶自己創建
進程終止Delete
進程終止過程:
-
根據標識符,從PCB集合中檢索出對應PCB,並讀出進程狀態。
-
若正處於執行狀態,應立即終止該進程的執行,並置調度標誌位真。
-
若該進程還有子孫進程,還應將其所有子孫進程予以終止,以防他們成爲不可控得進程。
-
將被終止進程的全部資源歸還給其父進程或系統。
-
將被終止進程的PCB從所在隊列移出。等待其它程序來收集它的信息。
引起進程終止的事件:
-
正常結束
-
異常結束
-
外界干預
異常結束:
出現某些錯誤和故障而迫使進程終止。
① 越界錯誤:程序所訪問的存儲區,已越出該進程的區域;
② 保護錯:進程試圖去訪問一個不允許訪問的資源或文件,或者以不適當的方式進行訪問,如進程去寫一個只讀文件;
③ 非法指令:程序試圖去執行一條不存在的指令。如程序錯誤地轉移到數據區,把數據當成了指令;
④ 特權指令錯:用戶進程執行一條只允許OS執行的指令;
⑤ 運行超時:進程的執行時間超過了指定的最大值;
⑥ 等待超時:進程等待某事件的時間, 超過規定的最大值;
⑦ 算術運算錯:進程試圖執行一個被禁止的運算,如除0;
⑧ I/O故障:這是指在I/O過程中發生了錯誤等。
外界干預:
外界干預並非指在本進程運行中出現了異常事件,而是指進程應外界的請求而終止運行。
① 操作員或操作系統干預:由於某種原因,例如,發生了死鎖, 由操作員或操作系統終止該進程;
② 父進程請求:由於父進程具有終止自己的任何子孫進程的權利, 因而當父進程提出請求時,系統將終止該進程;
③ 父進程終止。 當父進程終止時,OS也將他的所有子孫進程終止。
進程阻塞Block
阻塞是進程的自身調用阻塞原語而自我阻塞(主動行爲)。而喚醒是引起阻塞的事件消失後,有關的“發現者”調用喚醒原語來喚醒被阻塞的進程,它們是一對逆過程。
阻塞是進程的主動行爲
進程阻塞過程:
-
保存當前進程的CPU現場
-
置該進程的狀態爲阻塞狀態
-
被阻塞進程進入等待隊列
-
轉進程調度
進程喚醒Wakeup
當被阻塞進程所期待的事件出現時,如I/O完成或其所期待的數據已經到達,則由有關進程(比如,用完並釋放了該I/O設備的進程)調用喚醒原語wakeup( ),將等待該事件的進程喚醒。
喚醒原語 Wakeup() 不能自己喚醒
進程喚醒過程:
-
從等待隊列中摘下被喚醒的進程
-
將被喚醒的進程置爲就緒態
-
將被喚醒的進程送入就緒隊列
-
轉進程調度或返回
進程掛起Suspend
當出現了引起進程掛起的事件時,如用戶進程請求將自己掛起,或父進程請求將自己的某個子進程掛起,系統將利用掛起原語suspend( )將指定進程或處於阻塞狀態的進程掛起。
進程掛起過程:
-
檢查被掛起進程的狀態,若處於活動就緒狀態,便將其改爲靜止就緒;對於活動阻塞狀態的進程,則將之改爲靜止阻塞。
-
爲了方便用戶或父進程考查該進程的運行情況而把該進程的PCB複製到某指定的內存區域。
-
若被掛起的進程正在執行,則轉向調度程序重新調度。
進程激活Active
當發生激活進程的事件時,例如,父進程或用戶進程請求激活指定進程,若該進程駐留在外存而內存中已有足夠的空間時,則可將在外存上處於靜止就緒狀態的進程換入內存。這時,系統將利用激活原語active( )將指定進程激活。
進程激活過程:
-
激活原語先將進程從外存調入內存,檢查該進程的現行狀態,若是靜止就緒,便將之改爲活動就緒;若爲靜止阻塞便將之改爲活動阻塞。
-
假如採用的是搶佔調度策略,則每當有新進程進入就緒隊列時,應檢查是否要進行重新調度,即由調度程序將被激活進程與當前進程進行優先級的比較,如果被激活進程的優先級更低,就不必重新調度;否則,立即剝奪當前進程的運行,把處理機分配給剛被激活的進程。