1. 程式人生 > >二、程序管理

二、程序管理

引入

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);