實驗目的與要求
在採用多道程式設計的系統中,往往有若干個程序同時處於就緒狀態。當就緒狀態程序個數大於處理器數時,就必須依照某種策略來決定哪些程序優先占用處理器。本實驗模擬在單處理器情況下處理器排程,幫助學生加深了解處理器排程的工作。
二、實驗要求
(1) 實驗題目。
(2) 程式中使用的資料結構及符號說明。
(3) 流程圖。
(4) 列印乙份源程式並附上注釋。
(5) 列印程式執行時的初值和執行結果,要求如下:
1 程序控制塊的初始狀態
2.選中執行的程序名以及選中程序執行後的各程序控制塊狀態。
對於2要求每選中乙個程序執行後都要列印。
實驗原理與內容
假定系統有五個程序,每乙個程序用乙個程序控制塊pcb來代表。程序控制塊的格式為:
程序名時間
要求求執行時間
優先數狀態
其中,程序名----作為程序的標識,假設五個程序的程序名分別是p1,p2,p3,p4,p5。
指標----按優先數的大小把五個程序連成佇列,用指標指出下乙個程序的程序控制塊
首位址,最後乙個程序中的指標為「0」。
要求執行時間----假設程序需要執行的單位時間數。
優先數----賦予程序的優先數,排程時總是選取優先數大的程序先執行。
狀態----可假設有兩種狀態,「就緒」狀態和「結束「狀態,五個程序的初始狀態都為「就緒「狀態,用「r」表示,當乙個程序執行結束後,它的狀態變為「結束」,
用「e」表示。
在每次執行你所設計的處理器排程程式之前,為每個程序任意確定它的「優先數」和「要求執行時間」。
為了排程方便,把五個程序按給定的優先數從大到小連成佇列,用一單元指出隊首程序,用指標指出佇列的連線情況。例:
隊首標誌
k2k1 k2 k3 k4 k5
p1p3
k5p5
k1p4
k3p2k4r
rrrr
pcb1 pcb2 pcb3 pcb4 pcb5
處理器排程總是選隊首程序執行。採用動態改變優先數的辦法,程序每執行一次優先數就減「1」。由於本實驗是模擬處理器排程,所以,對被選中的程序並不實際的啟動執行,而是執行:
優先數-1
要求執行時間-1
來模擬程序的一次執行。
程序執行一次後,若要求執行時間≠0,則再將它加入佇列(按優先數大小插入,且置隊首標誌);若要求執行時間=0,則把它的狀態修改為「結束」(),且退出佇列。
若「就緒」狀態的程序佇列不為空,則重複上面(4)和(5)的步驟,直到所有程序都成為「結束」狀態。
在所設計的稱序中應有顯示或列印語句,能顯示或列印每次被選中程序的程序名以及執行一次後進稱對列的變化。
為五個程序任意確定一組「優先數」和「要求執行時間」,啟動所設計的處理器排程程式,顯示或列印逐次被選中程序的程序名以及程序控制塊的動態變化過程。
實驗過程與結果(可貼圖)
設計乙個按優先數排程演算法實現處理器排程的程序。
//定義結構體,包含五個屬性,名字,下乙個pcb指標,執行時間,優先順序,目前狀態
(一) 程式中使用的資料結構及符號說明。
本程式採用的程序結構體為pcb
struct pcb /*程序控制塊結構體,包含識別符號、優先數、執行時間、狀態、前後指標*/
;/*資料結構為雙鏈表*/
struct pcb *head; /*程序鍊錶的頭指標*/
struct pcb *tail; /*程序鍊錶的尾指標*/
(四)源程式
#include#include#includeint num = 5; /*假定程序數為5*/
struct pcb*head; /*程序鍊錶的頭指標*/
struct pcb*tail; /*程序鍊錶的尾指標*/
intglobal_time; /*定義全域性時間*/
struct pcb*pcbinit(struct pcb *q); /*初始化程序鍊錶*/
struct pcb*init(struct pcb *p, int i); /*初始化程序*/
void sort(structpcb *phead); /*氣泡排序鍊錶*/
voidexchange(struct pcb *p, struct pcb *max); /*交換相鄰兩個程序的指標*/
void run(structpcb *p); /*模擬執行程序*/
voidshowinfor(struct pcb *head); /*輸出程序資訊*/
voidcheck_runtime(struct pcb *p);/*判斷執行時間是否為0*/
struct pcb /*程序控制塊結構體,包含識別符號、優先數、執行時間、狀態、前後指標*/
;
//初始化程序
struct pcb*init(struct pcb *p, int i)
//初始化程序鍊錶
struct pcb*pcbinit(struct pcb *q)else
}return p;
}
//氣泡排序鍊錶
void sort(structpcb *phead)
a = a->next; //完成一次內迴圈後
b = b->next; //指標順延}}
}
//交換相鄰兩個程序的指標
void exchange(structpcb *p, struct pcb *max)
if(max == p->next)else
if(max->next != null)
max->pre = p->pre; //將max的前一指標指向p的前一指標
p->next = max->next; //將p的後一指標指向max的後一指標
max->next = p; //max的後一指標指向p
p->pre = max; //p的前一指標指向max
}//本方法用於實現氣泡排序中程序結構體只轉換指標,不轉換資料
}
//輸出程序資訊
voidshowinfor(struct pcb *phead)
}
//執行函式
void run(structpcb *p)
//判斷執行時間是否為0
voidcheck_runtime(struct pcb *p)
}
void main()
}
(五)程式執行時的初值和執行結果
作業系統原理 處理器排程
1 處理機按照層次被劃分為為 排程 排程按照頻率從高到低依次被命名為低階排程,中級排程和高階排程 低階排程 又稱為程序排程,此種排程頻率最高.也是最基本的排程。就是cpu不再執行當前程序,而是執行乙個就緒態的程序 中級排程 又稱為交換排程,這種排程就是將記憶體中暫時不用的程序移至外存.把外存等待的程...
作業系統學習筆記之處理器排程
關於程序排程有乙個核心問題就是 是否搶占。因此,排程演算法也被劃分為兩類 搶占式排程和非搶占式排程。非搶占式排程就是說,一旦這個程序獲得了處理器資源,除非執行完成或者阻塞或者出現不能執行的情況,將一直執行下去,直到執行完成。搶占式排程的意思是排程程式可能會暫時中斷某個程序轉向另外乙個程序。最樸素的排...
作業系統 處理器排程
1 cpu資源的時分復用 程序切換 cpu資源的當前占用者切換。處理器排程 排程程式 挑選就緒程序的核心函式。2 排程演算法 3 死鎖 死鎖是多個程序在爭奪資源的過程中造成的僵局。例如 a和b程序都需要資源s1和s2,當a獲得了s1,b獲得了s2,但是兩個人都不釋放獲得的資源,但是也都不能執行,這就...