操作系统(OS)进程与调度
一、進程的定義、組成、組織方式、特征
1.1 進程的定義
1、程序:一個指令序列,即指令(或語句)的集合。
2、程序的順序執行:指令之間是順序關系,是一個靜態的概念,僅當前一操作(程序段)執行完后,才能執行后繼操作。
3、順序執行的特點:
- 順序性;處理機的操作嚴格按照程序所規定的順序執行
- 封閉性;程序獨占全機資源,程序執行結果不受外界因素的影響
- 可再現性;只要輸入的初始條件相同,則無論何時重復執行該程序都會得到相同的結果。
4、程序的并發執行:
- 間斷性:任意程序不可能一直占有CPU
- 失去封閉性:多個程序共享系統中的各種資源,因而這些資源的狀態將由多個程序來改變,致使程序的運行失去了封閉性。
- 不可再現性:程序在并發執行時,由于失去了封閉性,也導致失去了可再現性。
5、PCB:進程控制塊,用來描述進程的各種信息。因為PCB經常被系統訪問,所以應常駐內存。
6、進程實體:由PCB、程序段、數據段三部分組成,又稱為進程
7、進程:進程是進程實體的運行過程,是系統進行資源分配和調度的一個獨立單位
8、PCB與進程的關系:PCB是進程存在的唯一標志。所謂創建進程,即創建進程實體中的PCB;撤銷進程即撤銷進程實體中的PCB
9、進程的基本屬性:進程是一個可擁有資源的獨立單位;進程又是一個可獨立調度的基本單位。
10、進程與程序的關系:前者是一種動態概念,而后者是一種靜態概念,進程是程序的一次執行
1.2 進程的組成
1、PCB:包括進程描述信息、進程控制和管理信息、資源分配清單、處理機相關信息
2、程序段:存放要執行的代碼
3、數據段:存放程序運行過程中處理的各種數據
1.3 進程的組織方式
線性方式:按照進程狀態將PCB分為多個隊列,如就緒隊列、阻塞隊列等,操作系統持有指向各個隊列的指針
索引方式:根據進程狀態的不同建立幾張索引表,如就緒索引表、阻塞索引表等,操作系統持有指向各個索引表的指針
1.4 進程的特征
動態性:進程是進程實體的一次執行過程(動態性),有一定的生命周期(由創建而產生,由調度而執行,由撤消而消亡)。
并發性:多個進程同存于內存中,且能在一段時間內同時運行。
獨立性: 進程是一個能獨立運行,獨立分配資源和獨立接受調度的基本單位。
異步性:進程按各自獨立的、不可預知的速度向前推進。
結構性:從結構上看,進程實體至少包括: 程序、數據和進程控制塊(PCB) 。
二、進程的狀態與轉換
2.1 進程的五種狀態
- 運行態:占有CPU、并在CPU上運行
- 就緒態:已具備運行條件(已分配到除CPU以外的所有必要資源),但由于沒有空閑CPU而暫時不能運行
- 阻塞態:因等待某一事件而暫時不能運行,放棄CPU
- *創建態:進程正在被創建,操作系統為進程分配資源,初始化PCB
- *終止態:進程正在從系統中撤銷,操作系統會回收進程擁有的資源,撤銷PCB
- 補充:掛起態:掛起進程即把進程放在外存中
- 引入掛起狀態的原因
終端用戶的請求。暫停進程的執行,修改程序。
(2) 父進程請求。 掛起自己的子進程。
(3) 負荷調節的需要。把不重要的進程掛起,避免系統負荷較重。
(4) 操作系統的需要。 檢查資源使用情況等。
2.2 進程狀態的轉換
加入掛起態以后
三、進程控制
3.1 操作系統內核
- 1、內核定義:計算機上配置的底層軟件,是操作系統最基本、最核心的部分。操作系統分為非內核部分和內核部分
- 2、內核目的:便于對軟件進行保護,防止遭到其他應用程序的破壞;提高OS的運行效率
- 3、內核功能:
- 時鐘管理:實現計時功能
- 中斷管理:負責實現中斷機制
- 原語
- 對系統資源進行管理:進程管理、存儲器管理、設備管理
- 其中,時鐘管理、中斷管理和原語是與硬件關聯較為緊密的部分
- 4、原語:一種特殊的程序,處于操作系統最底層,是最接近硬件的部分。這種程序的運行具有原子性——其運行只能一氣呵成,不可中斷
3.2 進程控制
1、進程控制定義:
① 進程控制包括創建新進程、終止已完成的進程、進程的阻塞與喚醒等功能
② 系統為進程進行的操作:創建進程(分配內存、I/O、PCB);進程切換(保留現場、恢復環境);撤消進程(回收資源、撤消PCB)
③ 進程控制一般是由OS內核中的原語實現控制,原語采用“開中斷指令”和“關中斷指令”實現
④ 進程控制具體流程如下圖:
3.2.1 進程的創建
1、引起創建進程的事件:用戶登錄、作業調度、提供服務(前三個由系統內核創建)、應用請求(由用戶創建)
2、進程狀態轉換:無 -> 創建態 -> 就緒態
3、創建流程:(如下流程都是在 原語 中實現)
3.2.2 進程的終止
1、引起進程終止的事件:正常結束,異常結束,外界干擾
2、進程狀態轉換:就緒態/阻塞態/運行態 -> 終止態 -> 無
3、終止流程:
3.2.3 進程的阻塞與喚醒
1、引起進程阻塞與喚醒的事件:請求系統服務不能滿足時 ;啟動某種操作 如I/O;新數據尚未到達;無新工作可做
2、進程狀態轉換:
- 阻塞:運行態 -> 阻塞態
- 喚醒:阻塞態 -> 喚醒態
3、阻塞原語與喚醒原語必須成對出現
4、阻塞過程:
5、喚醒過程:
四、進程同步
1、進程同步定義:同步又稱直接制約關系,它是指未完成某種任務而建立的兩個或多個進程,這些進程因為需要在某些位置上協調他們的工作次序而產生的制約關系
2、兩種形式的制約關系
- 間接相互制約關系。進程間要通過某種中介發生聯系。即互斥關系,排他性地對資源的訪問。
互斥必須滿足兩個條件:
(1)多個進程共享同一個臨界資源。
(2)共享的方式是先來者先使用的異步方式。 - 直接相互制約關系。即同步關系,指多個進程的執行有先后順序的限制。
3、臨界資源: 系統中某些資源一次只允許一個進程使用,稱這樣的資源為臨界資源或互斥資源。如打印機、共享的變量、緩沖區等。
4、臨界區(互斥區):在進程中訪問臨界資源的程序段叫臨界區。
5、一個訪問臨界資源的循環進程應為如下結構:
6、同步機制應遵循的準則
- 為了保證進程互斥進入臨界區,系統需設置專門的同步機制,同步機制應遵循4個準則:
- 1空閑讓進。當無進程在臨界區時,任何有權使用臨界區的進程可進入。
- 2忙則等待。不允許兩個以上的進程同時進入臨界區。
- 3有限等待。任何進入臨界區的進程應在有限的時間內得到滿足。
- 4讓權等待。當進程不能進入臨界區時,應立即放棄CPU,以免進程陷入“忙等”。
4.1 信號量機制
1、信號量其實就是一個變量,可以用一個信號量來表示系統中某種資源的數量
2、一對原語:包含wait(S)原語和signal(S)原語,簡稱P、V操作,通常使用這一對原語對信號量S實施操作。該P、V操作必須成對出現
3、整型信號量
注意:注意:在wait操作中,當S≤0時,就會不斷測試而使進程處于“忙等”狀態。不滿足“讓權等待”原則。
4、記錄型信號量,可以實現讓權等待原則。
5、AND型信號量
實現思想:將進程在整個運行過程中需要的所有資源,一次性全部地分配給進程,待進程使用完后再一起釋放。只要尚有一個資源未能分配給進程,其它所有可能為之分配的資源,也不分配給他。
目的:避免死鎖
6、信號量集
Swait(S1, t1, d1, …, Sn, tn, dn) //S為信號量,t為下限值,d為需求值if S1≥t1 and … and Sn≥tn thenfor i∶=1 to n doSi∶=Si-di;endforelse把此執行進程插入第一個Si<ti的信號量Si的等待隊列中,阻塞此執行進程;endif signal(S1, d1, …, Sn, dn)for i∶=1 to n doSi∶=Si+di;把等待資源Si的隊列中的所有進程移到就緒隊列中; endfor;7、信號量集的幾種情況:
- (1) Swait(S, d, d)。 此時在信號量集中只有一個信號量S, 但允許它每次申請d個資源,當現有資源數少于d時,不予分配
- (2) Swait(S, 1, 1)。 此時的信號量集已蛻化為一般的記錄型信號量(S>1時)或互斥信號量(S=1時)。
- (3) Swait(S, 1, 0)。這是一種很特殊且很有用的信號量操作。當S≥1時,允許多個進程進入某特定區;當S變為0后,將阻止任何進程進入特定區。換言之,它相當于一個可控開關。
8、信號量機制實現進程互斥
- 1分析并發進程的關鍵活動,劃定臨界區
- 2設置互斥信號量mutex(semaphore類型)
- 3在臨界區之前執行P操作;臨界區之后執行V操作
9、信號量機制實現進程同步
- 1分析什么地方需要同步關系,即必須保證“一前一后”執行的兩個操作
- 2設置同步信號量S,初始為0
- 3在“前操作”之后執行V操作;在“后操作”之前執行P操作
10、信號量機制實現前驅關系(實際上也是進程同步問題)
*4.2 管程
1、背景:使用信號量機制,要求每個訪問臨界資源的進程都必須自備同步操作wait(s)和signal(s),使大量的同步操作分散在各
個進程中,1) 系統無法有效控制、管理;2)容易導致死鎖;3)不利于修改和維護
2、管程的定義:在程序設計級控制進程互斥與同步的機制
3、組成:① 局部于管程的共享變量說明;② 對該數據結構進行操作的一組過程;③ 對局部于管程的數據設置初始值的語句;④管程有一個名字(和類的概念類似)
4、管程使用的注意事項:
①局部于管程的數據結構,只能被局部于管程內的過程訪問。
②局部于管程的過程只能訪問管程內的數據結構。
③管程每次只允許一個進程進入,從而實現進程互斥。
五、經典進程的同步問題
同步問題的分析步驟
①關系分析:找出題目中的各個進程,分析它們之間的同步、異步關系
②整理思路:根據各進程的操作流程確定P、V操作的大致順序
③設置信號量:根據題目條件確定信號量初值(互斥一般為1,同步要根據資源的初始值)
5.1 生產者-消費者問題
1、問題描述:1個生產者生產數據后寫入緩沖區Buffer,1個消費者從緩沖區讀出數據后消費。
2、關系分析:
- 同步關系:
當Buffer為滿時,生產者進程必須等待消費者進程先執行;
當Buffer為空時,消費者進程必須等待生產者進程先執行。 - 互斥關系:
緩沖區是臨界資源,各進程必須互斥的訪問
3、整理思路
生產者消耗(P)一個緩沖區,同時生產(V)一個產品;
消費者消耗(V)一個產品同時釋放(P)一個緩沖區
取走/放入產品需要互斥
4、設置信號量
semaphone mutex = 1; //互斥信號量,實現對緩沖區的互斥訪問
semaphone empty = n; //同步信號量,表示空閑緩沖區的數量
semaphone full = 0; //同步信號量,表示產品的數量
5、實現
注意:上述兩個P操作不可以改變順序。假設現在緩沖區已滿,即empty=0,full = n,此時先執行P(mutex)操作,進入臨界區;再執行P(empty)操作,由于empty=0,因此該進程會被阻塞,此時若執行消費者進程,由于mutex=0,因此消費者進程也會被阻塞,這樣會造成死鎖的產生。因此,實現互斥的P操作一定要在實現同步的P操作之后,V操作的順序是可以互換的
6、AND實現
5.2 多生產者-多消費者問題
1、問題描述:桌子上一個盤子,每次只能放一個水果。爸爸專門像盤子中放入蘋果,媽媽放入橘子。兒子專等橘子,而女兒專等蘋果。只有盤子為空時,爸爸或媽媽才能放水果。僅當盤子中有自己需要的水果時,兒子或女兒才可以取出水果
2、關系分析:
- 互斥關系:
對盤子的訪問要互斥進行 - 同步關系:
只有父親放入蘋果女兒才能取;
只有母親放入橘子兒子才能取;
只有盤子為空時父母才可以放水果
3、整理思路
略
4、設置信號量
semaphone mutex = 1; //互斥信號量,實現對盤子的互斥訪問
semaphone apple = 0; //同步信號量
semaphone orange = 0; //同步信號量
semaphone plate = 1; //同步信號量,表示還可以放多少個水果
5、實現
6、補充:即使不設置互斥變量mutex,也不會出現多個進程同時訪問盤子的現象。因為在任何時刻,apple、orange、plate三個同步信號量最多只有一個是1,因此任何時刻都是最多只有一個進程的p操作不會被阻塞順利進入臨界區。(要是plate≠1那就要設置互斥變量了)
5.3 吸煙問題
1、問題描述:一個系統有三個抽煙者進程和一個供應者進程,抽煙者需要煙草、紙和膠水三種材料才能抽的了煙。現在三個抽煙者分別擁有其中一種材料,供應者每次將其中兩種材料放入到桌子上,擁有剩下那種材料的抽煙者取走抽煙,并向供應者返回一個已抽完的信號,供應者就會再次放入兩種材料到桌子上。一直重復上述過程,三個抽煙者輪流抽煙
2、關系分析:
- 互斥關系:
桌子需要互斥訪問 - 同步關系:
供應者放入組合一,一號抽煙者才能抽煙
供應者放入組合二,二號抽煙者才能抽煙
供應者放入組合三,三號抽煙者才能抽煙
抽煙者返回抽完信號供應者才能再放材料
3、整理思路
略
4、設置信號量
略
5、實現
6、上述問題也無需設置互斥信號量,理由同上一個問題
5.4 讀寫問題
1、問題描述:對于文件、數據,可能有多個讀者和寫者對其進行操作。要求:多個讀者可以同時操作;讀者與寫者、多個寫者之間的操作應互斥。
2、關系分析:
- 互斥關系:
寫者——寫者;寫者——讀者 - 關鍵問題:讀者——讀者(雖然可以多個讀者一起訪問,但是若是多個讀者同時訪問可能會造成死鎖問題,因此要對讀者進行互斥進入訪問)
3、整理思路
略
4、設置信號量
semaphore rmutex = 1; //讀者對文件進行互斥訪問
int count = 0; //記錄當前有幾個讀者正在訪問進程
semaphore wmutex = 1; //寫者對文件進行互斥訪問
5、實現
上述方法稱為“讀者優先”,即一旦有讀者正在讀數據,允許多個讀者同時進入讀數據,只有當全部讀者退出,才允許寫者進入寫數據。
若實現寫者優先,則需再加一個信號量 w = 1
5.5 哲學家問題
1、問題描述:五個哲學家同座一張圓桌,每人一個碗,左右各一只筷子;其習慣為:思考-吃飯-思考…;只有拿到左右兩只筷子才開始吃飯,吃完后繼續思考…。
2、關系分析:
- 互斥關系:
5個哲學家與其左鄰右舍對其中的筷子的訪問是互斥關系
3、整理思路
略
4、設置信號量
為了實現對筷子的互斥使用,可以用一個互斥信號量表示一只筷子,由這五個信號量構成信號量數組,即semaphore chopstick[5]={1,1,1,1,1};
5、實現
6、若五個哲學家并發的拿起左邊的筷子,則會導致死鎖問題,解決辦法如下:
(1) 至多只允許有四位哲學家同時去拿左邊的筷子。
(2) 僅當哲學家的左、右兩只筷子均可用時,才允許他拿起筷子進餐。
(3) 規定奇數號哲學家先拿他左邊的筷子,然后再去拿右邊的筷子;而偶數號哲學家則相反。
六、進程通信
1、定義:是指進程之間的信息交換。
2、進程通信分類:
- 低級通信:
特點:交換的信息量少,僅僅是一些數據和狀態的變化;通信由程序員完成。如P,V原語實現的進程互斥與同步。 - 高級通信;
特點:每次交換的信息量可以很大;系統提供高效、簡捷的信息傳輸命令。
3、進程通信的類型: - 共享存儲
- 基于共享數據結構的通信方式:公用數據結構的設置及對進程間同步的管理,都是由程序員完成,效率低,傳遞數據量少;
- 共享存儲區的通信方式 (如windows的剪貼板):進程可隨時向系統申請一塊存儲區, 并指定該區的關鍵字,用于進程通信。
- 消息傳遞
- 進程間的數據交換以格式化的消息為單位,通過OS提供的“發送消息/接收消息”兩個原語進行數據交換
- 消息組成:消息頭+消息體
- 消息傳遞方式:直接通信方式(將消息直接掛到緩沖隊列上)、間接通信方式 (消息發送到中間實體中進行暫存)
- 管道通信
七、線程的基本概念
1、線程的引入:
- 操作系統引入進程的目的是為了使多個程序能并發執行,提高資源利用率和系統的吞吐量。
- 引入線程的目的是為了減少程序并發執行時所付出的時空開銷,使OS具有更好的并發性。
2、系統為進程進行的操作: 創建進程(分配內存、I/O、PCB);進程切換(保留現場、恢復環境); 撤消進程(回收資源、撤消PCB)
3、線程的屬性:
- 輕型實體:線程基本上不擁有系統資源,只有一點必不可少的、能保證獨立運行的資源。
- 獨立調度和分派的基本單位。
- 可并發執行:一個進程的多個線程可以并發;不同進程中的線程也能并發。
- 共享進程資源:同一進程中的各個線程可以共享該進程擁有的資源。
4、線程的定義:作為調度和分派的基本單位
5、引入線程的目的:將進程的資源申請和調度屬性分開,即進程作為資源的申請和擁有者,但不作為調度的基本單位。使得進程內部各線程之間也可以并發
6、線程的狀態:
- ① 執行狀態,表示線程正獲得處理機而運行;
- ② 就緒狀態, 指線程已具備了各種執行條件,一旦獲得CPU便可執行的狀態;
- ③ 阻塞狀態,指線程在執行中因某事件而受阻,處于暫停執行時的狀態。
7、線程控制塊TCB:在內核空間還為每一個內核支持線程設置了一個線程控制塊, 內核是根據該控制塊而感知某線程的存在的,并對其加以控制
8、多線程OS中的進程有以下屬性:
- (1) 作為系統資源分配的單位。
- (2) 可包括多個線程(至少一個),在OS中的所有線程都只能屬于某一個特定的進程。
- (3) 進程不是一個可執行的實體。所謂進程處于“執行”狀態,實際上是該進程的某線程正在執行。
7.1 線程的實現
1、內核支持線程 :每個線程的線程控制塊設置在內核中,所有對線程的操作(創建、撤消和切換等),都是通過系統調用進入內核,再依靠內核中的相應處理程序予以實現的。
2、用戶級線程:用戶級線程僅存在于用戶空間中,即每個線程的線程控制塊設置在用戶空間中,所有對線程的操作也是在用戶空間中完成的,無須內核的支持。內核完全不知道用戶級線程的存在。
3、二者的區別:對于設置了用戶級線程的系統,調度仍以進程為單位進行。例若進程A中包含1個用戶級線程,進程B包含100個用戶級線程,用輪轉法調度,則A中線程的運行時間,將是B中線程運行時間的100倍;假如系統設置的是內核支持線程,則調度便是以線程為單位進行。例若進程A中包含1個內核支持線程,進程B包含100個內核支持線程,用輪轉法調度,則進程B可以獲得的CPU時間是進程A的100倍。
八、調度的基本概念
1、定義:當有一堆任務要處理,由于資源有限,需要確定某種規則來決定處理這些任務的順序,而確定的這些規則就稱為調度。
2、處理機調度定義:即從就緒隊列中按照一定的算法選擇一個進程并將處理機分配給它運行,以實現進程的并發執行。
3、調度的三個層次
- 高級調度
定義:按照一定的原則從外存中處于后備隊列的作業中挑選一個(或多個)作業,給他們分配內存等必要資源,并建立相應的進程(建立PCB),然后將新創建的進程排在就緒隊列上,準備執行,又稱作業調度。
在每次執行作業調度時,都須做出以下兩個決定: - 接納多少個作業
- 接納哪些作業
- 中級調度
引入中級調度的主要目的:為了提高內存利用率和系統吞吐量。
定義:即將暫時不能運行的進程調至外存上去等待(掛起狀態),當這些進程又具備運行條件、且內存又稍有空閑時,由中級調度來把外存上的進程從掛起隊列中調入內存,并修改其狀態為就緒狀態,掛在就緒隊列上等待進程調度,又稱內存調度。
中級調度即存儲器管理中的對換功能。 - 低級調度
- 定義:也稱進程調度,按照某種方法和策略從就緒隊列中選取一個進程,將處理機分配給它,主要用來決定就緒隊列中的哪個進程應獲得處理機。
- 調用方式:采用以下兩種調度方式:
- 非搶占方式:也稱非剝奪調度方式。在該調度方式下,當進程分配到處理機時,其他進程不可以搶占,只有在進程自動放棄處理機時,才進行調度。
- 搶占方式:又稱剝奪調度方式。當一個進程正在處理機上執行時,若有一個更重要的進程需要使用處理器,則立即暫停正在執行的進程,將處理機分配給更重要的進程。
- 搶占的原則:優先權原則,允許優先權高的新到進程搶占當前進程的處理機;短作業(進程)優先原則,短作業(進程)可以搶占當前較長作業(進程)的處理機;時間片原則,時間片用完則重新進行調度
| 高級調度(作業調度) | 外存->內存(面向作業) | 無->創建態->就緒態 |
| 中級調度(內存調度) | 外存->內存(面向進程) | 掛起態->就緒態(阻塞掛起->阻塞態) |
| 低級調度 (進程調度) | 內存->CPU | 就緒態->運行態 |
| 補充知識:進程的七狀態摩模型 |
8.1計算參數
1、CPU利用率:指CPU“忙碌”的時間占總時間的比例
- 利用率 = 忙碌的時間/總時間
2、系統吞吐量:單位時間內完成作業的數量
- 系統吞吐量 = 總共完成了多少道作業/總共花了多少時間3、周轉時間:值從作業被提交給系統開始,到作業完成為止的這段時間。包括四部分:a、作業在外存后備隊列上等待(作業)調度的時間。b、進程在就緒隊列上等待進程調度的時間。c、進程在CPU上執行的時間。d、進程等待I/O操作完成的時間。其中bcd可能發生多次
- 周轉時間 = 作業完成時間 - 作業提交(到達)時間
- 平均周轉時間 = 各作業周轉時間之和/作業數
- 帶權周轉時間 = 作業周轉時間 / 作業實際運行的時間(恒>= 1)
- 平均帶權周轉時間 = 各作業帶權周轉時間之和 / 作業數
4、等待時間:指作業/進程處于等待處理機狀態時間之和,等待時間越長用戶滿意度越低。
- 等待時間 = 周轉時間 - 運行時間
5、響應時間:指從用戶提交請求到首次產生響應所用的時間
九、常見調度算法
9.1 先來先服務 FCFS
1、算法思想:類似與排隊付款
2、算法規則:按照作業/進程到達的先后順序進行服務
3、適用范圍:用于作業調度,考慮的是哪個作業先到達后備隊列;用于進程調度,考慮的是哪個進程先到達就緒隊列
4、是否可搶占?:非搶占式算法
5、優點:公平、算法易實現
6、缺點:對長作業有利,對短作業不利
7、是否會導致饑餓:不會 (饑餓:某進程/作業長期得不到服務)
9.2 短作業優先 SJF
1、算法思想:最求最少的平均等待時間,最少的平均周轉時間、最少的平均帶權周轉時間
2、算法規則:最短的作業/進程優先得到服務
3、適用范圍:可用于作業調度;也可用于進程調度(SPF)
4、是否可搶占?:非搶占式算法、也有搶占式算法
5、優點:略
6、缺點:對短作業有利,對長作業不利
7、是否會導致饑餓:會 ,若不斷有短作業進程到來,長作業可能會一直得不到服務,從而產生“饑餓”
9.3 高響應比優先 HRRN
1、算法思想:綜合考慮作業/進程的等待時間和要求服務的時間
2、算法規則:在每次調度時先計算各個作業/進程的響應比,選擇響應比最高的作業/進程為其服務
響應比 = ( 等待時間+要求服務時間 ) / 要求服務時間
3、適用范圍:可用于作業調度;也可用于進程調度
4、是否可搶占?:非搶占式算法
5、優點:略
6、缺點:略
7、是否會導致饑餓:不會
9.4 時間片輪轉 RR
1、算法思想:公平地、輪流地為各個進程服務,讓每個進程在一定時間間隔內都可以得到相應
2、算法規則:按照各進程到達就緒隊列的順序,輪流讓各個進程執行一個時間片。若進程未在一個時間片內執行完則剝奪處理機,將進程重新放到就緒隊列隊尾重新排隊。一般默認新到達地進程先進入就緒隊列。+
3、適用范圍:只可用于進程調度
4、是否可搶占?:搶占式算法,但是若一個進程未執行完一個時間片下一個進程不會搶奪處理機
5、優點:略
6、缺點:略
7、是否會導致饑餓:不會
8、時間片太大或太小分別有什么影響?
9.5 優先級調度算法
1、算法思想:根據任務的緊急程度來決定處理順序
2、算法規則:調度時選擇優先級最高的作業/進程
3、適用范圍:可用于作業調度;也可用于進程調度
4、是否可搶占?:非搶占式搶占式都可
5、優點:略
6、缺點:略
7、是否會導致饑餓:會
8、優先級地分類:
- 靜態優先級:創建進程時確定,之后一直不變
- 動態優先級:創建進程時有一個初始值,之后會根據情況動態地調整優先級
9、常見優先級:系統進程優先級高于用戶進程 ; 前臺進程優先級高于后臺進程
10、確定進程優先權的依據有如下三個方面:(1)進程類型;(2) 進程對資源的需求;(3) 用戶要求
9.6 多級反饋隊列調度算法
1、算法思想:對其他調度算法的折中權衡
2、算法規則:
①設置多級就緒隊列,各級隊列優先級從高到低,時間片從小到大
②新進程到達時先進入第一級隊列,按照FCFS原則排隊等待被分配時間片,若用完時間片進程還未結束,則進程進入下一級隊列隊尾;若此時已經是在最下級的隊列,則重新放回該隊列隊尾
③只有第k級隊列為空時,才會為k+1級對頭的進程分配時間片
3、適用范圍:用于進程調度
4、是否可搶占?:搶占式算法,在k級隊列的進程運行過程中,若更上級的隊列中進入了一個新進程,該新進程便會搶占處理機,而原來運行的進程放回到k級隊列中的隊尾。
5、優點:略
6、缺點:略
7、是否會導致饑餓:會
十、死鎖
10.1 死鎖概述
1、定義:各個進程互相等待對方手里的資源,導致各進程都阻塞,無法向前推進的現象
2、進程死鎖:一組進程中,每個進程都無限等待被該組進程中另一進程所占有的資源,因而永遠無法得到的資源,這種現象稱為進程死鎖
3、產生死鎖的原因:一、競爭資源引起的死鎖;二、進程推進順序不當引起的死鎖
4、死鎖產生的必要條件:(產生死鎖必須同時滿足以下四個條件)
- 互斥條件:一個資源每次只能給一個進程使用
- 不剝奪條件:一個進程在申請新的資源的同時保持對原有資源的占有
- 請求和保持條件:資源申請者不能強行從資源占有者手中奪取資源,資源只能由占有者自愿釋放
- 循環等待條件:在出現死鎖的系統中,一定存在一個進程—資源的環行鏈
注意:發生死鎖時一定有循環等待,但是發生循環等待時未必發生死鎖
5、處理死鎖的基本方法:
- 不讓死鎖發生
- (1)預防死鎖。 設置限制條件,破壞產生死鎖的四個必要條件中的一個或幾個條件。
- (2) 避免死鎖。不設置限制條件,而是在資源分配過程中,防止系統進入不安全狀態。
- 讓死鎖發生
- (1) 檢測死鎖。 允許死鎖,并檢測和清除死鎖。
- (2) 解除死鎖。 是與檢測死鎖相配套的一種措施。
10.2 預防死鎖
做法:破壞死鎖產生的四個必要條件之一或幾個
- 互斥條件:無法破壞
- 不剝奪條件:規定進程逐個申請資源,當提出新的資源請求而不能立即得到滿足時,必須釋放已經保持的所有資源。待以后需要時重新申請。
- 請求和保持條件:采用靜態分配方法,規定所有進程在開始運行之前,都必須一次性地申請其在整個運行過程中所需的全部資源。
- 循環等待條件: 把系統中所有資源編號,進程在申請資源時必須按資源編號的遞增次序進行,否則操作系統不予分配。原因:總有一個進程占拒了較高序號的資源,則繼續申請的資源必然空閑,因此進程可以一直向前推進。
10.3 避免死鎖
1、做法:用某種方法防止系統進入不安全狀態,從而避免死鎖
2、安全狀態:如果系統能按某種進程順序(如P1,…,Pn, 稱為安全序列)為每個進程分配其所需的資源,直至每個進程都能順利地完成,稱系統處于安全狀態,成這個順序為安全序列。安全序列可能有多個。
3、不安全狀態:若不存在上述這樣一個安全序列稱系統處于不安全狀態。
4、安全狀態是一定沒有死鎖發生的。不安全狀態不一定導致死鎖發生
10.4 銀行家算法
1、銀行家算法中的數據結構
- (1) 可利用資源向量Available:它是一個含有m個元素的數組,其中每個元素代表一類當前可利用資源的數目
- (2) 最大需求矩陣Max。 n*m矩陣,表示n個進程的每一個對m類資源的最大需求。
- (3) 分配矩陣Allocation 。n*m矩陣,表示每個進程已分配的資源數。
- (4) 需求矩陣Need 。n*m矩陣,表示每個進程還需要各類資源數。
2、算法思想
1、設Requesti是進程的請求向量,Requesti[j]= K表示進程 Pi 需要 K 個 Rj 類型的資源。
2、當進程pi提出資源申請時,系統執行下列步驟:
- (1) 如果Requesti[j]≤Need[i,j],便轉向步驟(2);否則認為出錯(需要的資源數超過它所宣布的最大值)。
- (2) 如果Requesti[j]≤Available[j],便轉向步驟(3);否則Pi須等待(無足夠資源)。
- (3) 系統試著把資源分配給進程Pi,并修改下面數據結構中的數值:
Available[j]= Available[j]-Requesti[j];
Allocation[i,j]= Allocation[i,j]+Requesti[j];
Need[i,j]= Need[i,j]-Requesti[j]; - (4) 系統執行安全性算法,若系統新狀態是安全的,則分配完成,若系統新狀態是不安全的,則恢復原狀態,進程等待
10.5 安全性算法
算法思想:
(1) 設置兩個向量:
- ① 工作向量Work: 表示系統可提供給進程繼續運行所需的各類資源數目,它含有m個元素,在執行安全算法開始時,Work = Available;
- ② Finish: 表示系統是否有足夠的資源分配給進程,使之運行完成。開始時先做Finish[i]=false; 當有足夠資源分配給進程時, 再令Finish[i]=true。
(2) 從進程集合中找到一個能滿足下述條件的進程:
- ① Finish[i]=false; ② Need[i,j]≤Work[j]; 若找到, 執行步驟(3), 否則,執行步驟(4)。
(3) 當進程Pi獲得資源后,可順利執行,直至完成,并釋放出分配給它的資源,故應執行:
- Work[j]∶= Work[ j ]+Allocation[i,j];
- Finish[i]∶= true;
- go to step 2;
(4) 如果所有進程的Finish[i]=true都滿足, 則表示系統處于安全狀態;否則,系統處于不安全狀態。
10.6 死鎖的檢測與解除
1、做法:允許死鎖的發生,OS負責檢測出死鎖的發生,然后采取某種措施接觸死鎖
2、判斷死鎖的方法:①用某種數據結構來保存資源的親求和分配信息;②提供一種算法,利用上述信息來檢測系統是否已進入死鎖狀態
3、資源分配圖:
- 組成:結點:進程結點(對應一個進程);資源結點(對應一類資源);邊:進程結點->資源階段(表示進程想申請幾個資源);資源節點->進程結點(表示已經為進程分配了幾個資源)
- 檢測死鎖方法(資源分配圖化簡):
1)找一個既不阻塞又非獨立的進程結點Pi(即找出一條有向邊與它相連,且該有向邊對應的資源的申請數量小于等于系統中已有空閑資源的數量)。釋放其占有的全部資源,成為孤立結點。
2)再把相應的資源分配給一個等待該資源的進程。
3)重復以上步驟,若所有進程成為孤立結點,稱該圖是可完全簡化的,否則稱該圖是不可完全簡化的,就說明發生了死鎖。
4、死鎖狀態的充分條件是:當且僅當資源分配圖是不可完全簡化的(死鎖定理)。
5、死鎖的解除
(1) 剝奪資源。從其它進程剝奪足夠數量的資源給死鎖進程。
(2) 撤消進程。 使全部死鎖進程都夭折掉或按某種順序逐個撤消進程,直至有足夠資源可用。
總結
以上是生活随笔為你收集整理的操作系统(OS)进程与调度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 城市供水调度平台(Axure高保真原型)
- 下一篇: 速锐得驾培驾考免接线OBD数据价值及发展