版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、數(shù)學(xué)與計(jì)算機(jī)學(xué)院 課程設(shè)計(jì)說明書 課 程 名 稱: 操作系統(tǒng)原理-課程設(shè)計(jì) 課 程 代 碼: 題 目: 進(jìn)程調(diào)度模擬程序 年級/專業(yè)/班: 09 級 計(jì)科 5 班 學(xué) 生 姓 名: 學(xué) 號: 開 始 時 間: 2011 年 12 月 9 日 完 成 時 間: 2011 年 12 月 23 日 課程設(shè)計(jì)成績: 學(xué)習(xí)態(tài)度及平 時成績(30) 技術(shù)水平與實(shí)際 能力(20) 創(chuàng)新 (5) 說明書撰寫質(zhì)量(45) 總 分 (100) 指導(dǎo)教師簽名: 年 月 日 摘摘 要要 隨著計(jì)算機(jī)的普及,在計(jì)算機(jī)上配置合適的操作系統(tǒng),已成為不可或缺的 因素,操作系統(tǒng)時配置在計(jì)算機(jī)硬件上的第一層軟件,時對硬件系統(tǒng)的首次
2、擴(kuò)充, 其他的諸如匯編程序,編譯程序,數(shù)據(jù)庫管理系統(tǒng)等系統(tǒng)軟件,以及大量的應(yīng)用 軟件,都將依賴于操作系統(tǒng)的支持,取得它的服務(wù)。os 作為用戶與計(jì)算機(jī)硬件之 間的接口,作為系統(tǒng)資源的管理者,實(shí)現(xiàn)了對計(jì)算機(jī)資源的抽象,因此,不斷提 高計(jì)算機(jī)資源的利用率,方便用戶,以及器件的不斷更新?lián)Q代,計(jì)算機(jī)體系結(jié)構(gòu) 的不斷發(fā)展,已經(jīng)成為推動計(jì)算機(jī)操作系統(tǒng)發(fā)展的主要因素,為了達(dá)到這些目的, 了解操作系統(tǒng)的發(fā)展過程,熟悉操作系統(tǒng)的內(nèi)部結(jié)構(gòu),掌握操作系統(tǒng)的運(yùn)行,已 經(jīng)成為當(dāng)代大學(xué)生,特別是計(jì)算機(jī)專業(yè)的學(xué)生所必不可少的知識。 操作系統(tǒng)的主要任務(wù)是為多道程序的運(yùn)行提供良好的運(yùn)行環(huán)境,并能最大 程度的提高系統(tǒng)中各種資源的利
3、用率和方便用戶,為了實(shí)現(xiàn)這些功能,操作系統(tǒng) 還應(yīng)該具有處理機(jī)管理,存儲器管理,設(shè)備管理和文件管理等功能。 關(guān)鍵詞:關(guān)鍵詞:操作系統(tǒng);資源利用率;處理機(jī);文件管理 目 錄 1 引 言 .1 1.1 問題的提出 .1 1.2 任務(wù)與分析.1 2 程序的主要函數(shù).2 2.1 建立將要模擬進(jìn)程調(diào)度的所有進(jìn)程 pcb 鏈表.2 2.2模擬 cpu 運(yùn)行進(jìn)程.3 2.3 顯示.4 2.4 排序.5 2.5 建立先來先服務(wù)調(diào)度算法的就緒隊(duì)列.7 2.6 建立最高優(yōu)先數(shù)優(yōu)先調(diào)度算法的就緒隊(duì)列.8 2.7 進(jìn)程模擬調(diào)度.9 2.8 主函數(shù).12 3 程序運(yùn)行平臺 .14 4 總體設(shè)計(jì) .14 5 程序結(jié)構(gòu)體的說
4、明 .14 6 程序運(yùn)行結(jié)果 .15 7 結(jié)論.22 8 參考文獻(xiàn) .23 9 附錄 .24 1 引引 言言 1.1 問題的提出問題的提出 隨著現(xiàn)在操作系統(tǒng)的日趨成熟,用戶對計(jì)算機(jī)的需求越來越多,處理機(jī)在同一時 刻處理資源的能力是有限的,從而導(dǎo)致各種任務(wù)隨時隨地的爭奪使用處理機(jī),因而此 對程序的并發(fā)能力提出了更高的要求。 引進(jìn)并發(fā)技術(shù)后,為了更好地說明并發(fā)現(xiàn)象(尤其是動態(tài)進(jìn)程) ,引入了進(jìn)程的概 念。進(jìn)程是一個具有一定獨(dú)立功能的可并發(fā)執(zhí)行的關(guān)于某個數(shù)據(jù)集合一次運(yùn)行活動的 程序。一個程序的啟動執(zhí)行,便是一個進(jìn)程的建立;一個程序執(zhí)行結(jié)束(正?;蛘呤?不正常) ,便是一個進(jìn)程的撤銷。由于同時處于就緒
5、態(tài)(爭奪使用 cpu 資源)的進(jìn)程通 常比較多,因此需要 cpu 調(diào)度算法來決定由哪個進(jìn)程獲得 cpu 使用權(quán)進(jìn)入運(yùn)行狀態(tài), 即進(jìn)程調(diào)度算法。 1.2 任務(wù)與分析任務(wù)與分析 本課題主要的目的是編寫并調(diào)試一個有 n 個進(jìn)程并發(fā)的進(jìn)程模擬調(diào)度程序。 進(jìn)程調(diào)度算法:采用最高優(yōu)先數(shù)優(yōu)先的調(diào)度算法(即把處理機(jī)分配給優(yōu)先數(shù)最高 的進(jìn)程)和先來先服務(wù)算法。 每個進(jìn)程有一個進(jìn)程控制塊( pcb)表示。進(jìn)程控制塊可以包含如下信息:進(jìn)程 名、優(yōu)先數(shù)、到達(dá)時間、需要運(yùn)行時間、已用 cpu 時間、進(jìn)程狀態(tài)等等。 進(jìn)程的優(yōu)先數(shù)及需要的運(yùn)行時間可以事先人為地指定(也可以由隨機(jī)數(shù)產(chǎn)生) 。進(jìn) 程的到達(dá)時間為進(jìn)程輸入的時間。
6、 進(jìn)程的運(yùn)行時間以時間片為單位進(jìn)行計(jì)算。 等待 i/o 的時間以時間片為單位進(jìn)行計(jì)算,可隨機(jī)產(chǎn)生,也可事先指定。 每個進(jìn)程的狀態(tài)可以是就緒 r(ready) 、運(yùn)行 r(run) 、等待(wait)或完成 f(finish)四種狀態(tài)之一。 就緒進(jìn)程獲得 cpu 后都只能運(yùn)行一個時間片。用已占用 cpu 時間加 1 來表示。 如果運(yùn)行一個時間片后,進(jìn)程的已占用 cpu 時間已達(dá)到所需要的運(yùn)行時間,則撤 消該進(jìn)程,如果運(yùn)行一個時間片后進(jìn)程的已占用 cpu 時間還未達(dá)所需要的運(yùn)行時間, 也就是進(jìn)程還需要繼續(xù)運(yùn)行,此時應(yīng)將進(jìn)程的優(yōu)先數(shù)減 1(即降低一級) ,然后把它插 入就緒隊(duì)列等待 cpu。 每進(jìn)行
7、一次調(diào)度程序都打印一次運(yùn)行進(jìn)程、就緒隊(duì)列、等待進(jìn)程以及各個進(jìn)程的 pcb,以便進(jìn)行檢查。 重復(fù)以上過程,直到所要進(jìn)程都完成為止。 2 2 程序的主要函數(shù) 2.1 建立將要模擬進(jìn)程調(diào)度的所有進(jìn)程建立將要模擬進(jìn)程調(diào)度的所有進(jìn)程 pcb 鏈表鏈表 算法思想算法思想:要建立的進(jìn)程個數(shù) n 作為函數(shù)參數(shù),頭指針作為返回,在函數(shù)內(nèi)部由一重 循環(huán)建立每個進(jìn)程 pcb 的各個數(shù)據(jù)項(xiàng),其中進(jìn)程需要運(yùn)行時間、到達(dá)時間以及優(yōu)先數(shù) 全部采用隨機(jī)生成。 代碼代碼: plist *creatpro(int n) /建立所有將要進(jìn)行 n 個模擬調(diào)度的進(jìn)程 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 運(yùn)行進(jìn)程運(yùn)行進(jìn)程 算法思想算法思想:需要運(yùn)行進(jìn)程的 pcb 作為函數(shù)參數(shù),先修改進(jìn)程狀態(tài),然后修改再修改進(jìn) 程已運(yùn)行時間和還需運(yùn)行時間。 代碼:代碼: void action(plist * nowpro) /模擬 cup 運(yùn)行進(jìn)程的過程 nowpro-state = 2; /設(shè)置進(jìn)程狀態(tài)為運(yùn)行態(tài) printf(now is process %d ,nowpro-name); nowpro-needtime-; /修改進(jìn)程還需運(yùn)行時間 nowpro-cputime+; /修改進(jìn)程已運(yùn)行時間 nowpro-sta
11、te = 1; if(nowpro-needtime=0)/進(jìn)程運(yùn)行結(jié)束 printf(tthe process %d is endn,nowpro-name); nowpro-state = 4; /進(jìn)程運(yùn)行結(jié)束,設(shè)置進(jìn)程狀態(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 顯示顯示 算法思想算法思想:先判斷鏈表借點(diǎn)是否為空,然后利用循環(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 當(dāng) 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) /將進(jìn)程隊(duì)列按到達(dá)先后順序排序 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)度算法的就緒隊(duì)列建立先來先服務(wù)調(diào)
16、度算法的就緒隊(duì)列 算法思想算法思想:先來先服務(wù)調(diào)度算法中的就緒隊(duì)列是按到達(dá)時間的先后排序的,當(dāng)就緒隊(duì) 列為空時,直接將作為將要添加的進(jìn)程接將作為將要添加的進(jìn)程 pcbpcb temptemp 作為隊(duì)頭,如果就緒隊(duì)列不為空,則作為隊(duì)頭,如果就緒隊(duì)列不為空,則 將將 temptemp 添加到隊(duì)列末尾。添加到隊(duì)列末尾。 添加到就緒隊(duì)列后再修改進(jìn)程狀態(tài)為就緒態(tài)。添加到就緒隊(duì)列后再修改進(jìn)程狀態(tài)為就緒態(tài)。 代碼:代碼: plist *fcfs_creatready(plist *ready_queue,plist *temp) /將進(jìn)程 temp 添加到就緒隊(duì)列 ready_queue 的尾部 plist
17、 *q; q=ready_queue; if(ready_queue) /當(dāng)就緒隊(duì)列不為空時,新進(jìn)入的進(jìn)程添加到就緒隊(duì)列末尾 while(q-next) q=q-next; /使指針 p 指向就緒隊(duì)列中最后一個進(jìn)程 q-next=temp; temp-state=1;/修改進(jìn)程狀態(tài) temp-next=null; else /當(dāng)就緒隊(duì)列為空時,新進(jìn)入的進(jìn)程作為就緒隊(duì)列頭部 ready_queue=temp; ready_queue-state = 1; /將進(jìn)程狀態(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)度算法的就緒隊(duì)列建立最高優(yōu)先數(shù)優(yōu)先調(diào)度算法的就緒隊(duì)列 算法思想算法思想:最高優(yōu)先數(shù)優(yōu)先調(diào)度算法中的就緒隊(duì)列是按進(jìn)程優(yōu)先數(shù)遞減排序的,當(dāng)就 緒隊(duì)列為空時,直接將作為將要添加的進(jìn)程 pcb temp 作為隊(duì)頭,如果就緒隊(duì)列不為空, 則將 temp 添加到隊(duì)列合
19、適位置。然后再修改進(jìn)程狀態(tài)為就緒態(tài)。 代碼代碼: plist *hrrn_creatready(plist *ready_queue, plist *temp) /按優(yōu)先數(shù)遞減的順序?qū)⑦M(jìn)程 temp 添加到就緒隊(duì)列 ready_queue 的合適位置 plist *q, *p; p=q=ready_queue; if(ready_queue q=q-next; /使指針 p-next 指向就緒隊(duì)列中進(jìn)程 temp 的插入位置 p-next=temp; temp-next=q; temp-state=1;/修改進(jìn)程狀態(tài) else /當(dāng)就緒隊(duì)列為空時,新進(jìn)入的進(jìn)程作為就緒隊(duì)列頭部 temp-nex
20、t=ready_queue; ready_queue=temp; ready_queue-state = 1; /將進(jìn)程狀態(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 進(jìn)程模擬調(diào)度進(jìn)程模擬調(diào)度 算法思想:算法思想: 1
21、.先來先服務(wù)調(diào)度算法 先來先服務(wù)調(diào)度算法是一種最簡單的調(diào)度算法,該算法既可以用于作業(yè)調(diào)度,也 可用于進(jìn)程調(diào)度。當(dāng)在作業(yè)調(diào)度中采用該算法時,每次調(diào)度都是從后備作業(yè)隊(duì)列中選 擇一個或多個最先進(jìn)入該隊(duì)列的作業(yè),將他們調(diào)入內(nèi)存,為它們分配資源、創(chuàng)建進(jìn)程, 然后放入就緒隊(duì)列。在進(jìn)程調(diào)度中采用 fcfs 算法時,則每次調(diào)度是從就緒隊(duì)列中選擇 一個最先進(jìn)入該隊(duì)列的進(jìn)程,為之分配處理機(jī),使之投入運(yùn)行。該進(jìn)程一直運(yùn)行到完 成或發(fā)生某事件而阻塞后才放棄處理機(jī)。fcfs 算法比較有利于長作業(yè)(進(jìn)程) ,而不利 于短作業(yè)(進(jìn)程) 。 2.最高優(yōu)先數(shù)調(diào)度算法 優(yōu)先數(shù)調(diào)度算法常用于批處理系統(tǒng)中。在進(jìn)程調(diào)度中,每次調(diào)度時,
22、系統(tǒng)把處理 機(jī)分配給就緒隊(duì)列中優(yōu)先數(shù)最高的進(jìn)程。它又分為兩種:非搶占式優(yōu)先數(shù)算法和搶占 式優(yōu)先數(shù)算法。在非搶占式優(yōu)先數(shù)算法下,系統(tǒng)一旦把處理機(jī)分配給就緒隊(duì)列中優(yōu)先 數(shù)最高的進(jìn)程后,這個進(jìn)程就會一直運(yùn)行,直到完成或發(fā)生某事件使它放棄處理機(jī), 這時系統(tǒng)才能重新將處理機(jī)分配給就緒隊(duì)列中的另一個優(yōu)先數(shù)最高的進(jìn)程。在搶占式 優(yōu)先數(shù)算法下,系統(tǒng)先將處理機(jī)分配給就緒隊(duì)列中優(yōu)先數(shù)最高的進(jìn)程度讓它運(yùn)行,但 在運(yùn)行的過程中,如果出現(xiàn)另一個優(yōu)先數(shù)比它高的進(jìn)程,它就要立即停止,并將處理 機(jī)分配給新的高優(yōu)先數(shù)進(jìn)程。 本次模擬采用搶占式最高優(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; /定義就緒隊(duì)列,并初始化 time = 0; /初始化 cpu 時序 while(proce
24、ss|ready_queue) /當(dāng)進(jìn)程隊(duì)列不為空,或者就緒隊(duì)列不為空 while(process process = process-next; ready_queue=creatready(ready_queue, temp); if(ready_queue = null) /如果沒有進(jìn)程運(yùn)行,打印 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/如果有進(jìn)程需要運(yùn)行,則模擬進(jìn)程運(yùn)行過程 printf(the time sequence is :%dn,time); printf(the ready queue is :n); show(ready_queue-next);/打印就緒隊(duì)列 action(ready_queue); /模擬進(jìn)程運(yùn)行 if(ready_queue -needtime = 0) /進(jìn)程運(yùn)行結(jié)束,此時將此進(jìn)程從就緒 隊(duì)列中刪除 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 鏈表,然后采用冒泡法將鏈表按進(jìn)程到達(dá) 時間遞增的順序排序,然后采用 switch-case 選擇結(jié)構(gòu)進(jìn)行菜單選擇需要模擬的調(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);/* 利用冒泡法將進(jìn)程按到達(dá)時間排序 */ 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(請輸入正確選項(xiàng)!n); break; 3 3 程序運(yùn)行平臺程序運(yùn)行平臺 windows xp microsoft visual c+ 6.0 4 4 總體設(shè)計(jì)總體設(shè)計(jì) 開始 先來 先服 務(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; /進(jìn)程名 int needtime; /進(jìn)程所需運(yùn)行時間 int arrivetime; /進(jìn)程到達(dá)時間 int pri; /進(jìn)程優(yōu)先數(shù) int state; /進(jìn)程狀態(tài):0 表示未到達(dá)
31、1 表示就緒 2 表示運(yùn)行 3 表示等 待 4 表示結(jié)束 int cputime; /已用 cpu 時間 struct pcb *next; plist; 6 程序運(yùn)行結(jié)果 先來先服務(wù)模擬調(diào)度運(yùn)行結(jié)果:先來先服務(wù)模擬調(diào)度運(yùn)行結(jié)果: 最高優(yōu)先數(shù)優(yōu)先調(diào)度模擬運(yùn)行結(jié)果:最高優(yōu)先數(shù)優(yōu)先調(diào)度模擬運(yùn)行結(jié)果: 7 結(jié)論 這次課程設(shè)計(jì)的題目是模擬進(jìn)程調(diào)度,課程設(shè)計(jì)的任務(wù)書要求實(shí)現(xiàn)模擬作業(yè)調(diào)度 的兩個算法:先來先服務(wù)調(diào)度算法,最高優(yōu)先數(shù)優(yōu)先算法。這次的課程設(shè)計(jì)我采用的 是 c 語言來編寫的,首先編寫一個結(jié)構(gòu)體用來存放進(jìn)程的相關(guān)信息,即 pcb。然后將要 模擬調(diào)度的進(jìn)程 pcb 放在隊(duì)列中。通過不斷的調(diào)試與優(yōu)化,
32、程序很好的模擬了進(jìn)程的 調(diào)度過程,先來先服務(wù),最高優(yōu)先數(shù)優(yōu)先。在編寫實(shí)現(xiàn)最高優(yōu)先數(shù)優(yōu)先算法的時候, 剛開始由于沒有考慮到后到達(dá)的進(jìn)程的優(yōu)先數(shù),和當(dāng)前運(yùn)行的進(jìn)程的優(yōu)先數(shù)有高低之 分,導(dǎo)致調(diào)度得不到預(yù)想的結(jié)果,經(jīng)過改正之后就得到了正確的結(jié)果。他們的調(diào)度結(jié) 果都不一樣,但是對于進(jìn)程調(diào)度而言,這幾個算法各有個的優(yōu)點(diǎn)和缺點(diǎn)。先來先服務(wù) 算法有利于長進(jìn)程而不利于短進(jìn)程;最高優(yōu)先數(shù)優(yōu)先算法既照顧了長進(jìn)程,又考慮了 進(jìn)程的優(yōu)先級,不會使長進(jìn)程長期得不到服務(wù),該算法實(shí)現(xiàn)了比較好的折中。 通過本次課程設(shè)計(jì)加深了我對進(jìn)程調(diào)度算法的理解并且還明白了調(diào)度的過程。在 上操作系統(tǒng)課的時候?qū)@幾個算法并不是很理解,通過實(shí)現(xiàn)了
33、這幾個調(diào)度算法的模擬 之后我,我就明白了這幾個算法的本質(zhì),并且理解了這幾個算法。在做課程設(shè)計(jì)的時 候自己還是存在不足之處,在考慮算法的時候考慮的不夠周全,在編寫最高優(yōu)先數(shù)優(yōu) 先的時候剛開始由于沒有考慮到后到達(dá)的進(jìn)程與之前的進(jìn)程的優(yōu)先數(shù)不一樣造成調(diào)度 的結(jié)果與預(yù)想的不一樣,通過仔細(xì)的檢查與思考之后發(fā)現(xiàn)了這個問題并且改正了之后 就可以得到正確的結(jié)果了。這次課程設(shè)計(jì)還讓我明白了只有多實(shí)踐才能發(fā)現(xiàn)自己的問 題所在才能夠很好的掌握知識。 8 參考文獻(xiàn) 1張堯?qū)W等編著. 計(jì)算機(jī)操作系統(tǒng)教程.北京:清華大學(xué)出版社,2006.02 2湯子瀛等編著.計(jì)算機(jī)操作系統(tǒng).西安:西安電子科技出版社,1996.12 3陳
34、向群 編著.操作系統(tǒng)教程.北京:北京大學(xué)出版社,2007.01 4羅宇 等編著.操作系統(tǒng)課程設(shè)計(jì).北京:機(jī)械工業(yè)出版社,2005.9 附 錄 程序源代碼:程序源代碼: #include #include #include #include typedef struct pcb int name; /進(jìn)程名 int needtime; /進(jìn)程所需運(yùn)行時間 int arrivetime; /進(jìn)程到達(dá)時間 int pri; /進(jìn)程優(yōu)先數(shù) int state; /進(jìn)程狀態(tài):0 表示未到達(dá) 1 表示就緒 2 表示運(yùn)行 3 表示等待 4 表示結(jié)束 int cputime; /已用 cpu 時間 struc
35、t pcb *next; plist; plist *creatpro(int n) /建立所有將要進(jìn)行 n 個模擬調(diào)度的進(jìn)程 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 運(yùn)行進(jìn)程的過程 nowpro-state = 2; /設(shè)置進(jìn)程狀態(tài)為運(yùn)行態(tài) printf(now is process %d ,nowpro-name); nowpro-needtime-; /修改進(jìn)程還需運(yùn)行時間 nowpro-cputime+; /修改進(jìn)程已運(yùn)行時間 nowpro-state = 1; if(no
37、wpro-needtime=0)/進(jìn)程運(yùn)行結(jié)束 printf(tthe process %d is endn,nowpro-name); nowpro-state = 4; /進(jìn)程運(yùn)行結(jié)束,設(shè)置進(jìn)程狀態(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) /將進(jìn)程隊(duì)列按到達(dá)先后順序排序 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) /將進(jìn)程 temp 添加到就緒隊(duì)列 ready_queue 的尾部 plist *q; q=ready_queue; if(ready_q
40、ueue) /當(dāng)就緒隊(duì)列不為空時,新進(jìn)入的進(jìn)程添加到就緒隊(duì)列末尾 while(q-next) q=q-next; /使指針 p 指向就緒隊(duì)列中最后一個進(jìn)程 q-next=temp; temp-state=1;/修改進(jìn)程狀態(tài) temp-next=null; else /當(dāng)就緒隊(duì)列為空時,新進(jìn)入的進(jìn)程作為就緒隊(duì)列頭部 ready_queue=temp; ready_queue-state = 1; /將進(jìn)程狀態(tài)設(shè)為就緒狀態(tài) temp-next=null; return ready_queue; plist *hrrn_creatready(plist *ready_queue, plist *temp) /按優(yōu)先數(shù)遞減的順序?qū)⑦M(jìn)程 temp 添加到就緒隊(duì)列 ready_queue 的合適位置 plist *q, *p; p=q=ready_queue; if(ready_queue q=q-next; /使指針 p-next 指向就緒隊(duì)列中進(jìn)程 temp 的插入位置 p-next=temp; temp-next=q; temp-state=1;/修改進(jìn)程狀態(tài) else /當(dāng)就緒隊(duì)列為空時,新進(jìn)入的進(jìn)程作為就緒隊(duì)列頭部 temp-next=ready_queue; ready_queue=temp; ready_queue-state = 1; /將進(jìn)程狀態(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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版房地產(chǎn)買賣合同擔(dān)保及產(chǎn)權(quán)轉(zhuǎn)移范本3篇
- 2025版農(nóng)業(yè)科技股份收購與農(nóng)產(chǎn)品品牌合作合同3篇
- 2025年高標(biāo)準(zhǔn)住宅小區(qū)水電安裝及售后服務(wù)合同2篇
- 2025年銷售薪資與銷售團(tuán)隊(duì)激勵合同3篇
- 桶裝水銷售合同中的質(zhì)量糾紛處理2025年度3篇
- 2025版事業(yè)單位職工食堂職工餐飲滿意度調(diào)查與分析承包合同3篇
- 2025版司機(jī)雇傭服務(wù)質(zhì)量監(jiān)督與考核合同3篇
- 2025版標(biāo)準(zhǔn)二手車鑒定評估師服務(wù)合同3篇
- 二零二五版門頭廣告位招商與運(yùn)營管理合同4篇
- 2025版?zhèn)€人小額教育貸款抵押擔(dān)保協(xié)議3篇
- 油氣行業(yè)人才需求預(yù)測-洞察分析
- 《數(shù)據(jù)采集技術(shù)》課件-Scrapy 框架的基本操作
- 高一化學(xué)《活潑的金屬單質(zhì)-鈉》分層練習(xí)含答案解析
- 華為集團(tuán)干部管理
- 圖書館前臺接待工作總結(jié)
- 衛(wèi)生院藥品管理制度
- 理論力學(xué)智慧樹知到期末考試答案章節(jié)答案2024年中國石油大學(xué)(華東)
- 2024老年人靜脈血栓栓塞癥防治中國專家共識(完整版)
- 四年級上冊脫式計(jì)算100題及答案
- 上海市12校2023-2024學(xué)年高考生物一模試卷含解析
- 儲能電站火災(zāi)應(yīng)急預(yù)案演練
評論
0/150
提交評論