[優(yōu)秀畢業(yè)設(shè)計精品] 進程模擬調(diào)度程序_第1頁
[優(yōu)秀畢業(yè)設(shè)計精品] 進程模擬調(diào)度程序_第2頁
[優(yōu)秀畢業(yè)設(shè)計精品] 進程模擬調(diào)度程序_第3頁
[優(yōu)秀畢業(yè)設(shè)計精品] 進程模擬調(diào)度程序_第4頁
[優(yōu)秀畢業(yè)設(shè)計精品] 進程模擬調(diào)度程序_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、數(shù)學(xué)與計算機學(xué)院 課程設(shè)計說明書 課 程 名 稱: 操作系統(tǒng)原理-課程設(shè)計 課 程 代 碼: 題 目: 進程調(diào)度模擬程序 年級/專業(yè)/班: 09 級 計科 5 班 學(xué) 生 姓 名: 學(xué) 號: 開 始 時 間: 2011 年 12 月 9 日 完 成 時 間: 2011 年 12 月 23 日 課程設(shè)計成績: 學(xué)習(xí)態(tài)度及平 時成績(30) 技術(shù)水平與實際 能力(20) 創(chuàng)新 (5) 說明書撰寫質(zhì)量(45) 總 分 (100) 指導(dǎo)教師簽名: 年 月 日 摘摘 要要 隨著計算機的普及,在計算機上配置合適的操作系統(tǒng),已成為不可或缺的 因素,操作系統(tǒng)時配置在計算機硬件上的第一層軟件,時對硬件系統(tǒng)的首次

2、擴充, 其他的諸如匯編程序,編譯程序,數(shù)據(jù)庫管理系統(tǒng)等系統(tǒng)軟件,以及大量的應(yīng)用 軟件,都將依賴于操作系統(tǒng)的支持,取得它的服務(wù)。os 作為用戶與計算機硬件之 間的接口,作為系統(tǒng)資源的管理者,實現(xiàn)了對計算機資源的抽象,因此,不斷提 高計算機資源的利用率,方便用戶,以及器件的不斷更新?lián)Q代,計算機體系結(jié)構(gòu) 的不斷發(fā)展,已經(jīng)成為推動計算機操作系統(tǒng)發(fā)展的主要因素,為了達到這些目的, 了解操作系統(tǒng)的發(fā)展過程,熟悉操作系統(tǒng)的內(nèi)部結(jié)構(gòu),掌握操作系統(tǒng)的運行,已 經(jīng)成為當代大學(xué)生,特別是計算機專業(yè)的學(xué)生所必不可少的知識。 操作系統(tǒng)的主要任務(wù)是為多道程序的運行提供良好的運行環(huán)境,并能最大 程度的提高系統(tǒng)中各種資源的利

3、用率和方便用戶,為了實現(xiàn)這些功能,操作系統(tǒng) 還應(yīng)該具有處理機管理,存儲器管理,設(shè)備管理和文件管理等功能。 關(guān)鍵詞:關(guān)鍵詞:操作系統(tǒng);資源利用率;處理機;文件管理 目 錄 1 引 言 .1 1.1 問題的提出 .1 1.2 任務(wù)與分析.1 2 程序的主要函數(shù).2 2.1 建立將要模擬進程調(diào)度的所有進程 pcb 鏈表.2 2.2模擬 cpu 運行進程.3 2.3 顯示.4 2.4 排序.5 2.5 建立先來先服務(wù)調(diào)度算法的就緒隊列.7 2.6 建立最高優(yōu)先數(shù)優(yōu)先調(diào)度算法的就緒隊列.8 2.7 進程模擬調(diào)度.9 2.8 主函數(shù).12 3 程序運行平臺 .14 4 總體設(shè)計 .14 5 程序結(jié)構(gòu)體的說

4、明 .14 6 程序運行結(jié)果 .15 7 結(jié)論.22 8 參考文獻 .23 9 附錄 .24 1 引引 言言 1.1 問題的提出問題的提出 隨著現(xiàn)在操作系統(tǒng)的日趨成熟,用戶對計算機的需求越來越多,處理機在同一時 刻處理資源的能力是有限的,從而導(dǎo)致各種任務(wù)隨時隨地的爭奪使用處理機,因而此 對程序的并發(fā)能力提出了更高的要求。 引進并發(fā)技術(shù)后,為了更好地說明并發(fā)現(xiàn)象(尤其是動態(tài)進程) ,引入了進程的概 念。進程是一個具有一定獨立功能的可并發(fā)執(zhí)行的關(guān)于某個數(shù)據(jù)集合一次運行活動的 程序。一個程序的啟動執(zhí)行,便是一個進程的建立;一個程序執(zhí)行結(jié)束(正常或者是 不正常) ,便是一個進程的撤銷。由于同時處于就緒

5、態(tài)(爭奪使用 cpu 資源)的進程通 常比較多,因此需要 cpu 調(diào)度算法來決定由哪個進程獲得 cpu 使用權(quán)進入運行狀態(tài), 即進程調(diào)度算法。 1.2 任務(wù)與分析任務(wù)與分析 本課題主要的目的是編寫并調(diào)試一個有 n 個進程并發(fā)的進程模擬調(diào)度程序。 進程調(diào)度算法:采用最高優(yōu)先數(shù)優(yōu)先的調(diào)度算法(即把處理機分配給優(yōu)先數(shù)最高 的進程)和先來先服務(wù)算法。 每個進程有一個進程控制塊( pcb)表示。進程控制塊可以包含如下信息:進程 名、優(yōu)先數(shù)、到達時間、需要運行時間、已用 cpu 時間、進程狀態(tài)等等。 進程的優(yōu)先數(shù)及需要的運行時間可以事先人為地指定(也可以由隨機數(shù)產(chǎn)生) 。進 程的到達時間為進程輸入的時間。

6、 進程的運行時間以時間片為單位進行計算。 等待 i/o 的時間以時間片為單位進行計算,可隨機產(chǎn)生,也可事先指定。 每個進程的狀態(tài)可以是就緒 r(ready) 、運行 r(run) 、等待(wait)或完成 f(finish)四種狀態(tài)之一。 就緒進程獲得 cpu 后都只能運行一個時間片。用已占用 cpu 時間加 1 來表示。 如果運行一個時間片后,進程的已占用 cpu 時間已達到所需要的運行時間,則撤 消該進程,如果運行一個時間片后進程的已占用 cpu 時間還未達所需要的運行時間, 也就是進程還需要繼續(xù)運行,此時應(yīng)將進程的優(yōu)先數(shù)減 1(即降低一級) ,然后把它插 入就緒隊列等待 cpu。 每進行

7、一次調(diào)度程序都打印一次運行進程、就緒隊列、等待進程以及各個進程的 pcb,以便進行檢查。 重復(fù)以上過程,直到所要進程都完成為止。 2 2 程序的主要函數(shù) 2.1 建立將要模擬進程調(diào)度的所有進程建立將要模擬進程調(diào)度的所有進程 pcb 鏈表鏈表 算法思想算法思想:要建立的進程個數(shù) n 作為函數(shù)參數(shù),頭指針作為返回,在函數(shù)內(nèi)部由一重 循環(huán)建立每個進程 pcb 的各個數(shù)據(jù)項,其中進程需要運行時間、到達時間以及優(yōu)先數(shù) 全部采用隨機生成。 代碼代碼: plist *creatpro(int n) /建立所有將要進行 n 個模擬調(diào)度的進程 int j; plist *p, *q, *head; p= (pl

8、ist *) malloc(sizeof(plist); head = p; for(j=0;jname = j+1; p-needtime = 1+(int)(10.0*rand()/(rand_max+1.0); p-arrivetime = (int)(10.0*rand()/(rand_max+1.0); p-pri = 1+(int)(9.0*rand()/(rand_max+1.0); p-state = 0; p-cputime =0; p-next = (plist *) malloc(sizeof(plist); p=p-next; q-next = null; return

9、 head; 流程圖:流程圖: p= (plist *) malloc(sizeof(plist); head = p; for(j=0;jname = j+1; p-needtime = 1+(int)(10.0*rand()/(rand_max+1.0); p-arrivetime = (int)(10.0*rand()/(rand_max+1.0); p-pri = 1+(int)(9.0*rand()/(rand_max+1.0); p-state = 0; p-cputime =0; p-next = (plist *) malloc(sizeof(plist); p=p-next;

10、 q-next = null; return head; 2.2 模擬模擬 cpu 運行進程運行進程 算法思想算法思想:需要運行進程的 pcb 作為函數(shù)參數(shù),先修改進程狀態(tài),然后修改再修改進 程已運行時間和還需運行時間。 代碼:代碼: void action(plist * nowpro) /模擬 cup 運行進程的過程 nowpro-state = 2; /設(shè)置進程狀態(tài)為運行態(tài) printf(now is process %d ,nowpro-name); nowpro-needtime-; /修改進程還需運行時間 nowpro-cputime+; /修改進程已運行時間 nowpro-sta

11、te = 1; if(nowpro-needtime=0)/進程運行結(jié)束 printf(tthe process %d is endn,nowpro-name); nowpro-state = 4; /進程運行結(jié)束,設(shè)置進程狀態(tài)為結(jié)束態(tài) else printf(tprocess %d needtime is %dn,nowpro-name,nowpro-needtime); printf(-n); 流程圖流程圖: nowpro-state = 2; nowpro-needtime-; nowpro-cputime+; nowpro-state = 1; nowpro-needtime=0? 真

12、 假 printf(tthe process %d is endn, printf(tprocess %d needtime is %dn, nowpro-name); nowpro-name,nowpro-needtime); nowpro-state = 4; 2.3 顯示顯示 算法思想算法思想:先判斷鏈表借點是否為空,然后利用循環(huán)輸出各 pcb 信息 代碼:代碼: void show(plist * process) /顯示 if(!process) printf(there is no process nown); while(process printf(tneedtime %d,p

13、rocess-needtime); printf( arrivetime %d,process-arrivetime); printf( pri %d,process-pri); printf( state %d,process-state); printf( cputime %dn,process-cputime); process = process-next; 流程圖:流程圖: if(!process) 真 假 printf(there is no 當 process printf(name of process %d,process-name); printf(tneedtime %d

14、,process-needtime); printf( arrivetime %d,process-arrivetime); printf( pri %d,process-pri); printf( state %d,process-state); printf( cputime %dn,process-cputime); process = process-next; 2.4 排序排序 算法思想:算法思想:利用兩層循環(huán),比較相鄰兩個元素的大小,第一遍將最大的數(shù)排到最末, 第二遍將次大的數(shù)排到最末的數(shù)的前面,經(jīng) n-1 遍后將滿足排序的要求。 代碼:代碼: plist *sort(plist

15、*head) /將進程隊列按到達先后順序排序 plist *p,*p1,*p2,*p3,*temp; p=head; while(p-next!=null) p=p-next; while(p!=head) p3=p1=head; p2=p1-next; while(p1!=p else p3-next=p2; temp=p2-next; p2-next=p1; p1-next=temp; temp=p1; p1=p2; p2=temp; p3=p1; p1=p1-next; p2=p1-next; p=p3; return head; 2.5 建立先來先服務(wù)調(diào)度算法的就緒隊列建立先來先服務(wù)調(diào)

16、度算法的就緒隊列 算法思想算法思想:先來先服務(wù)調(diào)度算法中的就緒隊列是按到達時間的先后排序的,當就緒隊 列為空時,直接將作為將要添加的進程接將作為將要添加的進程 pcbpcb temptemp 作為隊頭,如果就緒隊列不為空,則作為隊頭,如果就緒隊列不為空,則 將將 temptemp 添加到隊列末尾。添加到隊列末尾。 添加到就緒隊列后再修改進程狀態(tài)為就緒態(tài)。添加到就緒隊列后再修改進程狀態(tài)為就緒態(tài)。 代碼:代碼: plist *fcfs_creatready(plist *ready_queue,plist *temp) /將進程 temp 添加到就緒隊列 ready_queue 的尾部 plist

17、 *q; q=ready_queue; if(ready_queue) /當就緒隊列不為空時,新進入的進程添加到就緒隊列末尾 while(q-next) q=q-next; /使指針 p 指向就緒隊列中最后一個進程 q-next=temp; temp-state=1;/修改進程狀態(tài) temp-next=null; else /當就緒隊列為空時,新進入的進程作為就緒隊列頭部 ready_queue=temp; ready_queue-state = 1; /將進程狀態(tài)設(shè)為就緒狀態(tài) temp-next=null; return ready_queue; 流程圖流程圖: q=ready_queue;

18、 ready_queue=null? 真 假 q-next ready_queue=temp; q=q-next; ready_queue-state=1; q-next=temp; temp-next=null; temp-state=1; temp-next=null; return ready_queue; 2.6 建立最高優(yōu)先數(shù)優(yōu)先調(diào)度算法的就緒隊列建立最高優(yōu)先數(shù)優(yōu)先調(diào)度算法的就緒隊列 算法思想算法思想:最高優(yōu)先數(shù)優(yōu)先調(diào)度算法中的就緒隊列是按進程優(yōu)先數(shù)遞減排序的,當就 緒隊列為空時,直接將作為將要添加的進程 pcb temp 作為隊頭,如果就緒隊列不為空, 則將 temp 添加到隊列合

19、適位置。然后再修改進程狀態(tài)為就緒態(tài)。 代碼代碼: plist *hrrn_creatready(plist *ready_queue, plist *temp) /按優(yōu)先數(shù)遞減的順序?qū)⑦M程 temp 添加到就緒隊列 ready_queue 的合適位置 plist *q, *p; p=q=ready_queue; if(ready_queue q=q-next; /使指針 p-next 指向就緒隊列中進程 temp 的插入位置 p-next=temp; temp-next=q; temp-state=1;/修改進程狀態(tài) else /當就緒隊列為空時,新進入的進程作為就緒隊列頭部 temp-nex

20、t=ready_queue; ready_queue=temp; ready_queue-state = 1; /將進程狀態(tài)設(shè)為就緒狀態(tài) return ready_queue; 流程圖流程圖: p=q=ready_queue; ready_queue-pritemp-pri 真 ready_queue 假 q p=q; temp-next=null; ready_queue-state=1; temp-next=null; q=q-next; q-next=temp; temp-state=1; return ready_queue; 2.7 進程模擬調(diào)度進程模擬調(diào)度 算法思想:算法思想: 1

21、.先來先服務(wù)調(diào)度算法 先來先服務(wù)調(diào)度算法是一種最簡單的調(diào)度算法,該算法既可以用于作業(yè)調(diào)度,也 可用于進程調(diào)度。當在作業(yè)調(diào)度中采用該算法時,每次調(diào)度都是從后備作業(yè)隊列中選 擇一個或多個最先進入該隊列的作業(yè),將他們調(diào)入內(nèi)存,為它們分配資源、創(chuàng)建進程, 然后放入就緒隊列。在進程調(diào)度中采用 fcfs 算法時,則每次調(diào)度是從就緒隊列中選擇 一個最先進入該隊列的進程,為之分配處理機,使之投入運行。該進程一直運行到完 成或發(fā)生某事件而阻塞后才放棄處理機。fcfs 算法比較有利于長作業(yè)(進程) ,而不利 于短作業(yè)(進程) 。 2.最高優(yōu)先數(shù)調(diào)度算法 優(yōu)先數(shù)調(diào)度算法常用于批處理系統(tǒng)中。在進程調(diào)度中,每次調(diào)度時,

22、系統(tǒng)把處理 機分配給就緒隊列中優(yōu)先數(shù)最高的進程。它又分為兩種:非搶占式優(yōu)先數(shù)算法和搶占 式優(yōu)先數(shù)算法。在非搶占式優(yōu)先數(shù)算法下,系統(tǒng)一旦把處理機分配給就緒隊列中優(yōu)先 數(shù)最高的進程后,這個進程就會一直運行,直到完成或發(fā)生某事件使它放棄處理機, 這時系統(tǒng)才能重新將處理機分配給就緒隊列中的另一個優(yōu)先數(shù)最高的進程。在搶占式 優(yōu)先數(shù)算法下,系統(tǒng)先將處理機分配給就緒隊列中優(yōu)先數(shù)最高的進程度讓它運行,但 在運行的過程中,如果出現(xiàn)另一個優(yōu)先數(shù)比它高的進程,它就要立即停止,并將處理 機分配給新的高優(yōu)先數(shù)進程。 本次模擬采用搶占式最高優(yōu)先數(shù)調(diào)度算法。 如果調(diào)用此函數(shù)時是 process_simulation(pro

23、cess,fcfs_creatready);則此時是 先來先服務(wù)算法模擬調(diào)度。 如果調(diào)用此函數(shù)時是 process_simulation(process,hrrn_creatready);則此時是 最高優(yōu)先數(shù)優(yōu)先算法模擬調(diào)度。 代碼代碼: void process_simulation(plist * process,plist *creatready(plist *,plist *) int time; /模擬 cpu 時鐘 plist *temp; plist *ready_queue=null; /定義就緒隊列,并初始化 time = 0; /初始化 cpu 時序 while(proce

24、ss|ready_queue) /當進程隊列不為空,或者就緒隊列不為空 while(process process = process-next; ready_queue=creatready(ready_queue, temp); if(ready_queue = null) /如果沒有進程運行,打印 cpu 空轉(zhuǎn)信息 printf(the time sequence is :%dn,time); printf(the ready queue is :n); printf(there is no process nown); printf(-n); time+; sleep(500); el

25、se/如果有進程需要運行,則模擬進程運行過程 printf(the time sequence is :%dn,time); printf(the ready queue is :n); show(ready_queue-next);/打印就緒隊列 action(ready_queue); /模擬進程運行 if(ready_queue -needtime = 0) /進程運行結(jié)束,此時將此進程從就緒 隊列中刪除 ready_queue=ready_queue-next; time+; sleep(1000); printf(the time sequence is :%dn,time); /先

26、來先服務(wù)模擬調(diào)度結(jié)束 printf(there is no process nown); printf(-n); 流程圖流程圖: plist *ready_queue=null; time = 0; process|ready_queue process process = process-next; ready_queue=creatready(ready_queue, temp); ready_queue = null 真 假 printf(the time sequence is :%dn,time); printf(the time sequence is :%dn,time); pr

27、intf(the ready queue is :n); printf(the ready queue is :n); printf(there is no process nown); show(ready_queue-next); printf(-n); action(ready_queue); time+; ready_queue -needtime = 0 sleep(500); 真 假 ready_queue=ready_queue-next; time+; sleep(1000); printf(the time sequence is :%dn,time); printf(the

28、re is no process nown); printf(-n); 2.8 主函數(shù)主函數(shù) 算法思想算法思想:先建立所有需要模擬調(diào)度的 pcb 鏈表,然后采用冒泡法將鏈表按進程到達 時間遞增的順序排序,然后采用 switch-case 選擇結(jié)構(gòu)進行菜單選擇需要模擬的調(diào)度 模擬。 代碼:代碼: void main() int n; /*the number of process*/ int k; plist *process; printf(please input the number of process: ); scanf(%d, process = creatpro(n); proce

29、ss = sort(process);/* 利用冒泡法將進程按到達時間排序 */ show(process); printf(please choose the what you want to use:n); printf(t1 先來先服務(wù)nt2 最高優(yōu)先數(shù)優(yōu)先n); scanf(%d, switch(k) case 1: process_simulation(process,fcfs_creatready); /* 先來先服務(wù) */ break; case 2: process_simulation(process,hrrn_creatready); /* 最高優(yōu)先數(shù)算 法 */ brea

30、k; default : printf(請輸入正確選項!n); break; 3 3 程序運行平臺程序運行平臺 windows xp microsoft visual c+ 6.0 4 4 總體設(shè)計總體設(shè)計 開始 先來 先服 務(wù)算 法模 擬調(diào) 度 最高 優(yōu)先 數(shù)優(yōu) 先算 法模 擬調(diào) 度 退 出 系統(tǒng)總體框架圖 5 5 程序結(jié)構(gòu)體的說明程序結(jié)構(gòu)體的說明 typedef struct pcb int name; /進程名 int needtime; /進程所需運行時間 int arrivetime; /進程到達時間 int pri; /進程優(yōu)先數(shù) int state; /進程狀態(tài):0 表示未到達

31、1 表示就緒 2 表示運行 3 表示等 待 4 表示結(jié)束 int cputime; /已用 cpu 時間 struct pcb *next; plist; 6 程序運行結(jié)果 先來先服務(wù)模擬調(diào)度運行結(jié)果:先來先服務(wù)模擬調(diào)度運行結(jié)果: 最高優(yōu)先數(shù)優(yōu)先調(diào)度模擬運行結(jié)果:最高優(yōu)先數(shù)優(yōu)先調(diào)度模擬運行結(jié)果: 7 結(jié)論 這次課程設(shè)計的題目是模擬進程調(diào)度,課程設(shè)計的任務(wù)書要求實現(xiàn)模擬作業(yè)調(diào)度 的兩個算法:先來先服務(wù)調(diào)度算法,最高優(yōu)先數(shù)優(yōu)先算法。這次的課程設(shè)計我采用的 是 c 語言來編寫的,首先編寫一個結(jié)構(gòu)體用來存放進程的相關(guān)信息,即 pcb。然后將要 模擬調(diào)度的進程 pcb 放在隊列中。通過不斷的調(diào)試與優(yōu)化,

32、程序很好的模擬了進程的 調(diào)度過程,先來先服務(wù),最高優(yōu)先數(shù)優(yōu)先。在編寫實現(xiàn)最高優(yōu)先數(shù)優(yōu)先算法的時候, 剛開始由于沒有考慮到后到達的進程的優(yōu)先數(shù),和當前運行的進程的優(yōu)先數(shù)有高低之 分,導(dǎo)致調(diào)度得不到預(yù)想的結(jié)果,經(jīng)過改正之后就得到了正確的結(jié)果。他們的調(diào)度結(jié) 果都不一樣,但是對于進程調(diào)度而言,這幾個算法各有個的優(yōu)點和缺點。先來先服務(wù) 算法有利于長進程而不利于短進程;最高優(yōu)先數(shù)優(yōu)先算法既照顧了長進程,又考慮了 進程的優(yōu)先級,不會使長進程長期得不到服務(wù),該算法實現(xiàn)了比較好的折中。 通過本次課程設(shè)計加深了我對進程調(diào)度算法的理解并且還明白了調(diào)度的過程。在 上操作系統(tǒng)課的時候?qū)@幾個算法并不是很理解,通過實現(xiàn)了

33、這幾個調(diào)度算法的模擬 之后我,我就明白了這幾個算法的本質(zhì),并且理解了這幾個算法。在做課程設(shè)計的時 候自己還是存在不足之處,在考慮算法的時候考慮的不夠周全,在編寫最高優(yōu)先數(shù)優(yōu) 先的時候剛開始由于沒有考慮到后到達的進程與之前的進程的優(yōu)先數(shù)不一樣造成調(diào)度 的結(jié)果與預(yù)想的不一樣,通過仔細的檢查與思考之后發(fā)現(xiàn)了這個問題并且改正了之后 就可以得到正確的結(jié)果了。這次課程設(shè)計還讓我明白了只有多實踐才能發(fā)現(xiàn)自己的問 題所在才能夠很好的掌握知識。 8 參考文獻 1張堯?qū)W等編著. 計算機操作系統(tǒng)教程.北京:清華大學(xué)出版社,2006.02 2湯子瀛等編著.計算機操作系統(tǒng).西安:西安電子科技出版社,1996.12 3陳

34、向群 編著.操作系統(tǒng)教程.北京:北京大學(xué)出版社,2007.01 4羅宇 等編著.操作系統(tǒng)課程設(shè)計.北京:機械工業(yè)出版社,2005.9 附 錄 程序源代碼:程序源代碼: #include #include #include #include typedef struct pcb int name; /進程名 int needtime; /進程所需運行時間 int arrivetime; /進程到達時間 int pri; /進程優(yōu)先數(shù) int state; /進程狀態(tài):0 表示未到達 1 表示就緒 2 表示運行 3 表示等待 4 表示結(jié)束 int cputime; /已用 cpu 時間 struc

35、t pcb *next; plist; plist *creatpro(int n) /建立所有將要進行 n 個模擬調(diào)度的進程 int j; plist *p, *q, *head; p= (plist *) malloc(sizeof(plist); head = p; for(j=0;jname = j+1; p-needtime = 1+(int)(10.0*rand()/(rand_max+1.0); p-arrivetime = (int)(10.0*rand()/(rand_max+1.0); p-pri = 1+(int)(9.0*rand()/(rand_max+1.0); p

36、-state = 0; p-cputime =0; p-next = (plist *) malloc(sizeof(plist); p=p-next; q-next = null; return head; void action(plist * nowpro) /模擬 cup 運行進程的過程 nowpro-state = 2; /設(shè)置進程狀態(tài)為運行態(tài) printf(now is process %d ,nowpro-name); nowpro-needtime-; /修改進程還需運行時間 nowpro-cputime+; /修改進程已運行時間 nowpro-state = 1; if(no

37、wpro-needtime=0)/進程運行結(jié)束 printf(tthe process %d is endn,nowpro-name); nowpro-state = 4; /進程運行結(jié)束,設(shè)置進程狀態(tài)為結(jié)束態(tài) else printf(tprocess %d needtime is %dn,nowpro-name,nowpro-needtime); printf(-n); void show(plist * process) /顯示 if(!process) printf(there is no process nown); while(process printf(tneedtime %d,

38、process-needtime); printf( arrivetime %d,process-arrivetime); printf( pri %d,process-pri); printf( state %d,process-state); printf( cputime %dn,process-cputime); process = process-next; plist *sort(plist *head) /將進程隊列按到達先后順序排序 plist *p,*p1,*p2,*p3,*temp; p=head; while(p-next!=null) p=p-next; while(p

39、!=head) p3=p1=head; p2=p1-next; while(p1!=p else p3-next=p2; temp=p2-next; p2-next=p1; p1-next=temp; temp=p1; p1=p2; p2=temp; p3=p1; p1=p1-next; p2=p1-next; p=p3; return head; plist *fcfs_creatready(plist *ready_queue,plist *temp) /將進程 temp 添加到就緒隊列 ready_queue 的尾部 plist *q; q=ready_queue; if(ready_q

40、ueue) /當就緒隊列不為空時,新進入的進程添加到就緒隊列末尾 while(q-next) q=q-next; /使指針 p 指向就緒隊列中最后一個進程 q-next=temp; temp-state=1;/修改進程狀態(tài) temp-next=null; else /當就緒隊列為空時,新進入的進程作為就緒隊列頭部 ready_queue=temp; ready_queue-state = 1; /將進程狀態(tài)設(shè)為就緒狀態(tài) temp-next=null; return ready_queue; plist *hrrn_creatready(plist *ready_queue, plist *temp) /按優(yōu)先數(shù)遞減的順序?qū)⑦M程 temp 添加到就緒隊列 ready_queue 的合適位置 plist *q, *p; p=q=ready_queue; if(ready_queue q=q-next; /使指針 p-next 指向就緒隊列中進程 temp 的插入位置 p-next=temp; temp-next=q; temp-state=1;/修改進程狀態(tài) else /當就緒隊列為空時,新進入的進程作為就緒隊列頭部 temp-next=ready_queue; ready_queue=temp; ready_queue-state = 1; /將進程狀態(tài)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論