二、程序管理
引入
1. 程式:原始碼程式、目標程式、可執行程式
2. 程式執行:編寫、編譯、連結、執行
3. 交換:將部分程序換出到外存,騰出記憶體空間。被換出去的程序處於掛起狀態。只有掛起它的程序才能恢復被掛起的程序。
4. 虛擬儲存:每個程序只能裝入一部分程式和資料
程序描述及控制
1. 程序的概念
申請/擁有資源的單位
程式是靜態概念,程序是存在於記憶體的動態概念,表現為程式的執行
2. 程序的結構
程式
資料集合
程序控制塊PCB
PCB是程序存在的唯一標識,PCB代表著程序是不是存在
3. PCB的構成
(1)構成
程序標識資訊
處理機狀態資訊
程序排程資訊
其它資訊
(2)組織方式
單一佇列
通過連結串列組織成單一佇列,適用程序數目不多,否則查詢困難。插入、刪除都麻煩
表格結構
PCB按照程序狀態不同,組織成不同的表:就緒程序表、執行程序表、阻塞程序表
4. 程序的狀態
(1)五狀態
新建-->就緒
就緒-->被排程-->執行
執行-->時間到-->就緒
執行-->IO等待-->阻塞
執行-->完成-->終止
阻塞-->IO完成-->就緒
(a)某些系統,父程序可任何情況下終止子程序
(b)父程序終止、子程序必須終止
(2)具有掛起的程序狀態圖
(a)阻塞掛起,當事件發生時,變成就緒掛起
5. 程序的建立
(1)系統為程序分配唯一標識ID,PID
(2)主程序表增加表項,記錄程序對應的PCB
(3)為程序分配空間:使用者地址空間、使用者棧空間、PCB空間。有共享記憶體,就建立連結
(4)初始化PCB:程序標識、狀態
(5)建立連結:插入排程佇列
程序排程
1. 排程方式
程序排程方式分為剝奪式和非剝奪兩種。
IO阻塞並非剝奪,屬於主動放棄CPU
2. 排程型別
長程排程:作業從外存調進來
中程排程:交換出去外存的掛起程序調進來
短程排程:
3. 排程演算法
(1)FCFS先來先服務:非剝奪,對短時程序不公平,對IO型不公平。整個等待時間肯定長
(2)短程序優先:非剝奪,但是需要對程序進行排序,而且難以估算程序時間
(3)時間片輪轉:分時聯機系統,剝奪式,程序切換多,額外開銷,時間片大小問題。對短程序有利,不利於IO型程序,中斷太多不適合批處理
(4)基於優先順序:典型的是剩餘時間減少優先順序提高、排隊時間增加優先順序提高。反饋排程法就是很好的一個實現。
(5)反饋排程法:根據歷史執行情況進行調整,結合了優先順序和時間片輪轉排程思想
根據優先順序分多個就緒佇列,每個佇列的時間片遞增。
就緒佇列0 時間片0 優先順序高
就緒佇列1 時間片1
...
就緒佇列n 時間片n 優先順序低
執行緒
1. 為什麼引入執行緒
為了減少程式併發執行時系統所付出的額外開銷,使系統有更好的併發性。比如有些應用場景,必須是多程序/多執行緒併發才能實現功能的,如果採用程序的話,需要增加建立程序時候的開銷,另外就是程序切換的時候,要保護現場等,比執行緒切換複雜。
執行緒是程序的一個實體,自身不擁有系統資源,只擁有少許執行中必不可少的私有資源。執行緒可與同屬一個程序的其它執行緒共享程序的全部資源。
2. 執行緒狀態
就緒、阻塞、執行
一般沒有掛起狀態:因為掛起是指將程式和資料交換出去外存,而多個執行緒是共享程式和資料的。
3. 程序與執行緒區別
(1)程序是資源申請的最小單位,執行緒是系統排程的最小單位
(2)程序切換開銷比執行緒切換要大,執行緒具有相同的地址空間,使得執行緒間通訊同步容易
(3)程序有掛起,執行緒沒有
(4)windows、linux採用多程序、多執行緒技術
UNIX採用多程序、單執行緒技術
java虛擬機器採用單程序、多執行緒技術
MS DOS採用單程序、單執行緒技術
4. 使用者級執行緒和核心級執行緒
這個跟具體作業系統設計有關,而不是應用程式自己決定採用哪種的。
5. 執行緒阻塞會否造成程序阻塞
(1)如果是執行緒1等待執行緒2而阻塞,不會引起程序阻塞
(2)如果是執行緒1等待IO而阻塞,核心需要啟動系統IO,控制從使用者級轉向核心級,會引起程序阻塞
互斥與同步
1. 同步:協作 互斥:競爭
2. 臨界資源:一次只允許一個程序訪問的資源。
臨界區:訪問臨界資源的那段程式碼
3. 互斥條件
忙則等待
有限等待
空閒讓進
讓權等待
4. 死鎖和飢餓
5. 實現方法
(1)軟體方法
(a)程序嚴格順序使用臨界區
(b)為臨界區設定一個狀態標誌,“忙”和“空閒”。問題:同時進入了。
(c)先表明要進去,然後再看下對方進去沒。問題:都不進去
(d)謙讓一段時間,再重新嘗試進去
(e)有序謙讓
(2)硬體方法
(3)訊號量方法
(a)訊號量定義
訊號量包括如下機構:
count:可用資源數
queue:阻塞程序佇列
(b)原語
原子操作,作業系統保證了一次執行不可中斷。
wait(s) == P(s) 申請訊號量,s--,判斷s>=0則進入臨界區,否則阻塞,s絕對值表示有多少個被阻塞的程序
signal(s) == V(s) 釋放訊號量,s++,判斷s<=0,喚醒一個程序,s絕對值表示有多少個被阻塞的程序
(c)訊號量型別
互斥訊號量
資源訊號量
經典問題
1. 生產者/消費者問題
(1)特點:生產者建立資料,消費者使用資料,用完就沒了,消耗型的。生產者可以多個,消費者也可以多個。
(2)生產者消費者共享大小固定的緩衝區。假設緩衝區大小為n,有插入指標和取出指標
(3)要求:
生產者與生產者之間要互斥
生產者與消費者之間要互斥
生產者不能向滿緩衝區寫資料
消費者不能向空緩衝區取資料
e: 資源訊號量,表示緩衝區大小
n:資源訊號量,非空單元
x:互斥訊號量,對緩衝區的操作許可權
生產者:
wait(e)
wait(x)
生產資料
signal(x)
signal(n)
消費者:
wait(n)
wait(x)
取走資料
signal(x)
signal(e)
(4)資源訊號量要先申請,然後再申請互斥訊號量。也就是說多的要先申請。
2. 讀者/寫者問題
要求:
寫者間互斥
寫者讀者間互斥
讀者間可同時讀
讀完資料還在
(1)讀者優先
讀者:
wait(x)
reader++;
if(reader == 1)
wait(wsem)
signal(x)
讀資料
wait(x)
reader--;
if(reader == 0)
signal(wsem)
signal(x)
寫者:
wait(wsem)
寫資料
signal(wsem)
(2)寫者優先
讀者:
wait(z)
wait(rsem)
wait(x)
reader++;
if(reader == 1)
wait(wsem)
signal(x)
signal(rsem)
signal(z)
讀資料
wait(x)
reader--;
if(reader == 0)
signal(wsem)
signal(x)
寫者:
wait(y)
writer++;
if(writer == 1)
wait(rsem)
signal(y)
wait(wsem)
寫資料
signal(wsem)
wait(y)
writer--;
if(writer == 0)
signal(rsem)
signal(y)
程序通訊
1. 程序通訊型別
控制資訊和資料資訊
2.常用的程序通訊機制
(1)共享儲存區
(1.1)要求本地程序之間,資料空間固定
(1.2)同步互斥方式:
程式設計
作業系統實現:程序將儲存區連線到本地程序中,互斥同步由作業系統實現,程序只管讀寫。
(2)訊息傳遞
(2.1)訊息格式
訊息頭:訊息型別+目的地址+原地址+訊息長度+控制資訊
訊息體:訊息內容
Send原語:如果沒有空閒的緩衝區,則程序阻塞;
Receive原語:如果緩衝區為空,則程序阻塞;
同步方式:
阻塞傳送、阻塞接收
不阻塞傳送、阻塞接收:傳送程序不是一定要傳送的,而接收程序一定要等有資料
不阻塞傳送、不阻塞接收
(3)郵箱機制
郵箱:訊息的容器
使用郵箱實現互斥同步:建立一個郵箱,裡面有一條空訊息。接收阻塞方式,讀取時如果為空則阻塞,等待進入臨界區;如果取到了,就進入臨界區。
3. 死鎖
(1)安全狀態、不安全狀態
(2)安全序列、安全演算法
4. 哲學家演算法
(1)問題描述
五個哲學家圍成一桌,5碗麵,五支筷子在面左右,同時獲得兩支筷子才能進食。
(2)死鎖
如果每個哲學家都申請自己右邊的筷子,再申請左邊的筷子,很容易進入死鎖
wait(fork(i));
wait(fork(i+1 )mod 5);
eat;
signal(fork(i+1) mod 5);
signal(fork(i));
(3)解決方案
增加一位服務員,先讓4位哲學家進餐,4位哲學家競爭5支筷子,肯定有一個能夠取得一對,然後再安排最後一位進餐。
room:semaphore(4)
wait(room)
wait(fork(i));
wait(fork(i+1 )mod 5);
eat;
signal(fork(i+1) mod 5);
signal(fork(i));
signal(room);