操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)_源碼參考_第1頁
操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)_源碼參考_第2頁
操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)_源碼參考_第3頁
操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)_源碼參考_第4頁
操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)_源碼參考_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、華東交通大學(xué)軟件學(xué)院操作系統(tǒng)實(shí)驗(yàn)報(bào)告 專 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù)姓 名: 林慶達(dá) 學(xué) 號: 3103005138 2005-6試驗(yàn)一 進(jìn)程調(diào)度一、實(shí)驗(yàn)?zāi)康?編寫和調(diào)試一個(gè)進(jìn)程調(diào)度程序,以加深對進(jìn)程的概念及進(jìn)程調(diào)度算法的理解。 二、實(shí)驗(yàn)內(nèi)容:以兩種典型算法為例說明實(shí)現(xiàn)的算法(一)、最高優(yōu)先數(shù)優(yōu)先的調(diào)度算法1、實(shí)驗(yàn)原理進(jìn)程調(diào)度算法:采用最高優(yōu)先數(shù)優(yōu)先的調(diào)度算法(即把處理機(jī)分配給優(yōu)先數(shù)最高的進(jìn)程)和先來先服務(wù)算法。 每個(gè)進(jìn)程有一個(gè)進(jìn)程控制塊(PCB)表示。進(jìn)程控制塊可以包含如下信息:進(jìn)程名、優(yōu)先數(shù)、到達(dá)時(shí)間、需要運(yùn)行時(shí)間、已用CPU時(shí)間、進(jìn)程狀態(tài)等等。 進(jìn)程的優(yōu)先數(shù)及需要的運(yùn)行時(shí)間可以事先人為地指定

2、(也可以由隨機(jī)數(shù)產(chǎn)生)。進(jìn)程的到達(dá)時(shí)間為進(jìn)程輸入的時(shí)間。 進(jìn)程的運(yùn)行時(shí)間以時(shí)間片為單位進(jìn)行計(jì)算。 每個(gè)進(jìn)程的狀態(tài)可以是就緒 W(Wait)、運(yùn)行R(Run)、或完成F(Finish)三種狀態(tài)之一。 就緒進(jìn)程獲得CPU后都只能運(yùn)行一個(gè)時(shí)間片。用已占用CPU時(shí)間加1來表示。 如果運(yùn)行一個(gè)時(shí)間片后,進(jìn)程的已占用 CPU時(shí)間已達(dá)到所需要的運(yùn)行時(shí)間,則撤消該進(jìn)程,如果運(yùn)行一個(gè)時(shí)間片后進(jìn)程的已占用CPU時(shí)間還未達(dá)所需要的運(yùn)行時(shí)間,也就是進(jìn)程還需要繼續(xù)運(yùn)行,此時(shí)應(yīng)將進(jìn)程的優(yōu)先數(shù)減1(即降低一級),然后把它插入就緒隊(duì)列等待CPU。每進(jìn)行一次調(diào)度程序都打印一次運(yùn)行進(jìn)程、就緒隊(duì)列、以及各個(gè)進(jìn)程的 PCB,以便進(jìn)行

3、檢查。 重復(fù)以上過程,直到所有進(jìn)程都完成為止。2、源代碼:#include "stdio.h" #include <stdlib.h> #include <conio.h> #define getpch(type) (type*)malloc(sizeof(type) #define NULL 0 struct pcb /* 定義進(jìn)程控制塊PCB */ char name10; /*定義進(jìn)程名稱*/ char state; /*進(jìn)程狀態(tài)*/ int super; /*優(yōu)先數(shù)*/ int ntime; /*需要運(yùn)行的時(shí)間*/ int rtime; /*

4、已占用的CPU時(shí)間*/ struct pcb* link; *ready=NULL,*p; typedef struct pcb PCB; /*pcb表*/ sort() /* 建立對進(jìn)程進(jìn)行優(yōu)先級排列函數(shù)*/ PCB *first, *second; int insert=0; if(ready=NULL)|(p->super)>(ready->super) /*優(yōu)先級最大者,插入隊(duì)首*/ p->link=ready; ready=p; else /* 進(jìn)程比較優(yōu)先級,插入適當(dāng)?shù)奈恢弥?/ first=ready; second=first->link; whi

5、le(second!=NULL) if(p->super)>(second->super) /*若插入進(jìn)程比當(dāng)前進(jìn)程優(yōu)先數(shù)大,*/ /*插入到當(dāng)前進(jìn)程前面*/ p->link=second; first->link=p; second=NULL; insert=1; else /* 插入進(jìn)程優(yōu)先數(shù)最低,則插入到隊(duì)尾*/ first=first->link; second=second->link; if(insert=0) first->link=p; input() /* 建立進(jìn)程控制塊函數(shù)*/ int i,num; clrscr(); /*清

6、屏*/ printf("n 請輸入進(jìn)程號?"); scanf("%d",&num); for(i=0;i<num;i+) printf("n 進(jìn)程號No.%d:n",i); p=getpch(PCB); printf("n 輸入進(jìn)程名:"); scanf("%s",p->name); printf("n 輸入進(jìn)程優(yōu)先數(shù):"); scanf("%d",&p->super); printf("n 輸入進(jìn)程運(yùn)行時(shí)間:&

7、quot;); scanf("%d",&p->ntime); printf("n"); p->rtime=0;p->state='w' p->link=NULL; sort(); /* 調(diào)用sort函數(shù)*/ int space() int l=0; PCB* pr=ready; while(pr!=NULL) l+; pr=pr->link; return(l); disp(PCB * pr) /*建立進(jìn)程顯示函數(shù),用于顯示當(dāng)前進(jìn)程*/ printf("n qname t state t s

8、uper t ndtime t runtime n"); printf("|%st",pr->name); printf("|%ct",pr->state); printf("|%dt",pr->super); printf("|%dt",pr->ntime); printf("|%dt",pr->rtime); printf("n"); check() /* 建立進(jìn)程查看函數(shù),檢查等待隊(duì)列的進(jìn)程是否進(jìn)入就緒隊(duì)列*/ PCB* pr;

9、printf("n * 當(dāng)前正在運(yùn)行的進(jìn)程是:%s",p->name); /*顯示當(dāng)前運(yùn)行進(jìn)程*/ disp(p); pr=ready; printf("n *當(dāng)前就緒隊(duì)列狀態(tài)為:n"); /*顯示就緒隊(duì)列狀態(tài)*/ while(pr!=NULL) disp(pr); pr=pr->link; destroy() /*建立進(jìn)程撤消函數(shù)(進(jìn)程運(yùn)行結(jié)束,撤消進(jìn)程)*/ printf("n 進(jìn)程 %s 已完成.n",p->name); free(p); running() /* 建立進(jìn)程就緒函數(shù)(進(jìn)程運(yùn)行時(shí)間到,置就緒狀態(tài)*

10、/ (p->rtime)+; if(p->rtime=p->ntime) destroy(); /* 調(diào)用destroy函數(shù)*/ else (p->super)-; p->state='w' sort(); /*調(diào)用sort函數(shù)*/ main() /*主函數(shù)*/ int len, h=0; char ch; input(); len=space(); while(len!=0)&&(ready!=NULL) ch=getchar(); h+; printf("n The execute number:%d n",

11、h); p=ready; ready=p->link; p->link=NULL; p->state='R' check(); running(); printf("n 按任一鍵繼續(xù)."); ch=getchar(); printf("nn 進(jìn)程已經(jīng)完成.n"); ch=getchar(); 3、運(yùn)行結(jié)果:請輸入進(jìn)程號?5進(jìn)程號No.0:輸入進(jìn)程名:A輸入進(jìn)程優(yōu)先數(shù):2輸入進(jìn)程運(yùn)行時(shí)間:1進(jìn)程號No.1:輸入進(jìn)程名:B輸入進(jìn)程優(yōu)先數(shù):3輸入進(jìn)程運(yùn)行時(shí)間:1進(jìn)程號No.2:輸入進(jìn)程名:C輸入進(jìn)程優(yōu)先數(shù):1輸入進(jìn)程運(yùn)行時(shí)間:

12、1進(jìn)程號No.3:輸入進(jìn)程名:D輸入進(jìn)程優(yōu)先數(shù):4輸入進(jìn)程運(yùn)行時(shí)間:1進(jìn)程號No.4:輸入進(jìn)程名:E輸入進(jìn)程優(yōu)先數(shù):5輸入進(jìn)程運(yùn)行時(shí)間:1The execute number:1*當(dāng)前正在運(yùn)行的進(jìn)程是:EQnamestatesuperndtimeruntimeER510*當(dāng)前就緒隊(duì)列狀態(tài)為:QnamestatesuperndtimeruntimeDw410Bw310Aw210Cw110進(jìn)程E已完成按任一鍵繼續(xù)The execute number:2*當(dāng)前正在運(yùn)行的進(jìn)程是:DQnamestatesuperndtimeruntimeDR410*當(dāng)前就緒隊(duì)列狀態(tài)為:Qnamestatesupernd

13、timeruntimeBw310Aw210Cw110進(jìn)程D已完成按任一鍵繼續(xù)The execute number:3*當(dāng)前正在運(yùn)行的進(jìn)程是:BQnamestatesuperndtimeruntimeBR310*當(dāng)前就緒隊(duì)列狀態(tài)為:QnamestatesuperndtimeruntimeAw210Cw110進(jìn)程B已完成按任一鍵繼續(xù)The execute number:4*當(dāng)前正在運(yùn)行的進(jìn)程是:AQnamestatesuperndtimeruntimeAR210*當(dāng)前就緒隊(duì)列狀態(tài)為:QnamestatesuperndtimeruntimeCw110進(jìn)程A已完成按任一鍵繼續(xù)The execute n

14、umber:5*當(dāng)前正在運(yùn)行的進(jìn)程是:cQnamestatesuperndtimeruntimecR110*當(dāng)前就緒隊(duì)列狀態(tài)為:進(jìn)程C已完成按任一鍵繼續(xù)進(jìn)程已經(jīng)完成(二)、簡單輪轉(zhuǎn)法1、實(shí)驗(yàn)原理在分時(shí)系統(tǒng)中,都毫無例外采用時(shí)間片輪轉(zhuǎn)法。在一種簡單的輪轉(zhuǎn)法中,系統(tǒng)將所有就緒進(jìn)程按FIFO規(guī)則排成一個(gè)隊(duì)列,把CPU分配給隊(duì)首進(jìn)程,并規(guī)定它執(zhí)行一給定的時(shí)間如100ms,稱此時(shí)間間隔為時(shí)間片。當(dāng)時(shí)間片完成時(shí),系統(tǒng)產(chǎn)生一個(gè)時(shí)鐘中斷,剝奪該進(jìn)程的執(zhí)行,將它送至就緒隊(duì)列的末尾,并把處理機(jī)分配給就緒隊(duì)列的新隊(duì)首進(jìn)程,同樣也讓它執(zhí)行一個(gè)時(shí)間片。這樣,就緒隊(duì)列中的所有進(jìn)程均可獲得一個(gè)時(shí)間片的處理機(jī)而運(yùn)行。就緒隊(duì)列

15、中的進(jìn)程在依次執(zhí)行時(shí),可能發(fā)生以下三種情況:(1)進(jìn)程未用完一個(gè)時(shí)間片就結(jié)束,這時(shí)系統(tǒng)應(yīng)提前調(diào)度;(2)進(jìn)程在執(zhí)行過程中提出I/O請求而阻塞,系統(tǒng)應(yīng)將它放入相應(yīng)的阻塞隊(duì)列并引起調(diào)度;(3)進(jìn)程完成一個(gè)時(shí)間片后尚未完成,系統(tǒng)應(yīng)將它重新放到就緒隊(duì)列的末尾,等待下次執(zhí)行。由于在分時(shí)系統(tǒng)中,鍵盤命令的執(zhí)行時(shí)間較短,大多能在一個(gè)時(shí)間片內(nèi)執(zhí)行完畢,因此分時(shí)系統(tǒng)的實(shí)際響應(yīng)時(shí)間將比Nq(N是同時(shí)性用戶數(shù),q是時(shí)間片大小)小。2、源代碼:#include<stdio.h>/*定義一個(gè)pcb的結(jié)構(gòu)體*/struct pcb char name; /*進(jìn)程名*/int time; /*進(jìn)程執(zhí)行時(shí)間*/;

16、 void main() int n,i,j,flag=1; struct pcb a100; /*最多可以有100個(gè)進(jìn)程*/printf("輸入進(jìn)程個(gè)數(shù):"); scanf("%d",&n); getchar();/*接收回車*/ for(i=0;i<n;i+) printf("輸入進(jìn)程的名字:n"); scanf("%c",&); /*以字符接收進(jìn)程名*/getchar();/*接收回車*/ printf("輸入占用的時(shí)間片:"); /*輸入進(jìn)程占用的時(shí)間

17、片*/scanf("%d",&ai.time); getchar();/*接收回車*/ i=0; while(flag && n>0) /*若進(jìn)程數(shù)為空,結(jié)束程序*/ if(ai.time!=0) /*就緒隊(duì)列是否為空*/ printf("%c",); /*進(jìn)程執(zhí)行一次,打印出該進(jìn)程*/ai.time-; /*使該進(jìn)程占用的時(shí)間片減1*/ for(j=0;j<n;j+) if(aj.time) /*若進(jìn)程所占用的時(shí)間片不為0,仍執(zhí)行下一進(jìn)程*/ flag=1; break; else /*若進(jìn)程所占用的時(shí)

18、間片為0,說明已經(jīng)完成,跳過執(zhí)行下一進(jìn)程*/flag=0; i=(+i)%n; /*繼續(xù)執(zhí)行下一個(gè)進(jìn)程,i1*/ printf("n");3、運(yùn)行結(jié)果:輸入進(jìn)程個(gè)數(shù):5輸入進(jìn)程的名字:A輸入占用的時(shí)間片:2輸入進(jìn)程的名字:B輸入占用的時(shí)間片:3輸入進(jìn)程的名字:C輸入占用的時(shí)間片:1輸入進(jìn)程的名字:D輸入占用的時(shí)間片:4輸入進(jìn)程的名字:E輸入占用的時(shí)間片:5ABCDEABDEBDEDEEPress any key to continue六、心得體會:    操作系統(tǒng)是計(jì)算機(jī)系統(tǒng)中必不可少的系統(tǒng)軟件。它是計(jì)算機(jī)系統(tǒng)中各種資源的管理者和各種活動的組織

19、者、指揮者。操作系統(tǒng)采用時(shí)間片法調(diào)度進(jìn)程,使系統(tǒng)資源得到充分的利用,用戶也可以花更少的時(shí)間完成更多的工作,通過這次進(jìn)程調(diào)度實(shí)驗(yàn),讓我明白了系統(tǒng)時(shí)間片的調(diào)度方法,對操作系統(tǒng)理論的學(xué)習(xí)更加深一層.并且增強(qiáng)了用語言的編程能力。在編程的過程中,遇到了種種困難,并且一一的克服了,這使我產(chǎn)生很大的成就感。實(shí)驗(yàn)二 作業(yè)調(diào)度一、實(shí)驗(yàn)名稱:進(jìn)程調(diào)度用高級語言編寫和調(diào)試一個(gè)或多個(gè)作業(yè)調(diào)度的模擬程序,加深對作業(yè)調(diào)度算法的理解。二、實(shí)驗(yàn)內(nèi)容: 在單道批處理系統(tǒng)中,作業(yè)一投入運(yùn)行,它就占有計(jì)算機(jī)的一切資源直到作業(yè)完成為止,因此調(diào)度作業(yè)時(shí)不必考慮它所需要的資源是否得到滿足,它所占用的CPU時(shí)限等因素。而在多道批處理系統(tǒng)中

20、,作業(yè)首先存放在外存,當(dāng)系統(tǒng)擁有的資源足夠分配給一個(gè)作業(yè),就將資源分配給此作業(yè),并將此作業(yè)調(diào)進(jìn)內(nèi)存。當(dāng)系統(tǒng)資源不足以分配給一個(gè)作業(yè)時(shí),則等待已經(jīng)分配資源的作業(yè)運(yùn)行完成后釋放資源增加系統(tǒng)資源。(一)、為單道批處理系統(tǒng)設(shè)計(jì)一個(gè)作業(yè)調(diào)度程序1、實(shí)驗(yàn)原理。作業(yè)等待算法:分別采用先來先服務(wù)(FCFS),最短作業(yè)優(yōu)先(SJF)、響應(yīng)比高者優(yōu)先(HRN)的調(diào)度算法。 (1)先來先服務(wù)(FCFS)算法先來先服務(wù)作業(yè)調(diào)度算法是一種較簡單的作業(yè)調(diào)度算法,即每次調(diào)度是從后備作業(yè)隊(duì)列中選擇一個(gè)最先進(jìn)入該隊(duì)列的作業(yè),將它調(diào)入內(nèi)存,分配資源、創(chuàng)建相應(yīng)的進(jìn)程,放入進(jìn)程就緒隊(duì)列準(zhǔn)備運(yùn)行。FCFS算法利于長作業(yè),不利于短作業(yè),

21、而大多數(shù)的作業(yè)是I/O繁忙的短作業(yè)。以FCFS作為主調(diào)度算法是不常用的。(2)短作業(yè)優(yōu)先調(diào)度算法(SJF)短作業(yè)優(yōu)先調(diào)度算法是指操作系統(tǒng)在進(jìn)行作業(yè)調(diào)度時(shí)以作業(yè)長短作為優(yōu)先級進(jìn)行調(diào)度。該調(diào)度算法可以照顧到實(shí)際上占作業(yè)總數(shù)絕大部分的短作業(yè),使它們能比長作業(yè)優(yōu)先調(diào)度執(zhí)行。這時(shí)后備作業(yè)隊(duì)列按作業(yè)優(yōu)先級由高到低順序排列,當(dāng)作業(yè)進(jìn)入后備隊(duì)列時(shí)要按該作業(yè)優(yōu)先級放置到后備隊(duì)列相應(yīng)的位置。實(shí)踐證明,該調(diào)度算法的性能是最好的,單位時(shí)間的作業(yè)吞吐量也最大,但也存在缺點(diǎn):對長作業(yè)極為不利。(3)響應(yīng)比高者優(yōu)先(HRN)的調(diào)度算法采用響應(yīng)比高者優(yōu)先調(diào)度算法,進(jìn)行調(diào)度時(shí)必須計(jì)算出系統(tǒng)中的所有滿足必要條件作業(yè)的響應(yīng)比;從中

22、選擇響應(yīng)比最高的一個(gè)作業(yè)裝入主存儲器、分配資源,由于是實(shí)驗(yàn),所以就用將作業(yè)的作業(yè)控制塊出隊(duì),并輸出作業(yè)的作業(yè)名代替裝入主存儲器,同時(shí)修改系統(tǒng)的資源數(shù)量;用同樣方法選擇第二個(gè)、第三個(gè)直到不再有滿足必要條件的作業(yè)。調(diào)度算法的流程圖如下 :2、源代碼及運(yùn)行結(jié)果:#include "stdio.h"#define getjcb(type) (type*)malloc(sizeof(type)#define NULL 0int n=0,time=0;float eti,ewi;struct jcb char name10; /* 作業(yè)名 */ char state; /* 作業(yè)狀態(tài)

23、*/ int ts; /* 提交時(shí)間 */ float super; /* 優(yōu)先權(quán) */ int tb; /* 開始運(yùn)行時(shí)間 */ int tc; /* 完成時(shí)間 */ float ti; /* 周轉(zhuǎn)時(shí)間 */ float wi; /* 帶權(quán)周轉(zhuǎn)時(shí)間 */ int ntime; /* 作業(yè)所需運(yùn)行時(shí)間 */ struct jcb *link; /* 結(jié)構(gòu)體指針 */ *p,*q,*head=NULL;typedef struct jcb JCB;inital()int i;printf("n輸入作業(yè)數(shù):n");scanf("%d",&n);pri

24、ntf("輸入:n作業(yè)名t到達(dá)時(shí)間t服務(wù)時(shí)間n");for(i=0;i<n;i+) p=getjcb(JCB); scanf("%st%dt%d",&p->name,&p->ts,&p->ntime); p->state='W' p->link=NULL; if(head=NULL) head=q=p; else q->link=p; q=p; void print(JCB *pr,int m)JCB *p; printf("ntime=%d",time

25、); if(m=3) printf("n作業(yè)名t狀態(tài)t到達(dá)時(shí)間t服務(wù)時(shí)間t優(yōu)先權(quán)tt完成時(shí)間t周轉(zhuǎn)時(shí)間t帶權(quán)周轉(zhuǎn)時(shí)間n"); printf("%st%ct%dt%dt%4.2ft%dt%4.2ft%4.2fn", pr->name,pr->state,pr->ts,pr->ntime,pr->super,pr->tc,pr->ti,pr->wi); else printf("n作業(yè)名 狀態(tài) 到達(dá)時(shí)間 服務(wù)時(shí)間 完成時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間n"); printf("%st%c

26、t%dt%dt%dt%4.2ft%4.2fn", pr->name,pr->state,pr->ts,pr->ntime,pr->tc,pr->ti,pr->wi); p=head; do if(p->state='W') if(m=3) printf("%st%ct%dt%dt%4.2fn", p->name,p->state,p->ts,p->ntime,p->super); else printf("%st%ct%dt%dn", p->na

27、me,p->state,p->ts,p->ntime); p=p->link; while(p!=NULL); p=head; do if(p->state='F') if(m=3) printf("%st%ct%dt%dt%4.2ft%dt%4.2ft%4.2fn", p->name,p->state,p->ts,p->ntime,p->super,p->tc,p->ti,p->wi); elseprintf("%st%ct%dt%dt%dt%4.2ft%4.2fn&q

28、uot;, p->name,p->state,p->ts,p->ntime,p->tc,p->ti,p->wi); p=p->link; while(p!=NULL);void last()eti/=n;ewi/=n; printf("n平均周轉(zhuǎn)時(shí)間%7.3fn平均帶權(quán)周轉(zhuǎn)時(shí)間=%7.3fn",eti,ewi);super()JCB *padv;padv=head;do if(padv->state='W'&&padv->ts<=time) padv->super=(fl

29、oat)(time-padv->ts+padv->ntime)/padv->ntime; padv=padv->link;while(padv!=NULL);void hrn(m)JCB *min;int i,iden;for(i=0;i<n;i+)p=min=head;iden=1; super(); doif(p->state='W'&&p->ts<=time) if(iden) min=p;iden=0; else if(p->super>min->super) min=p; p=p->

30、;link; while(p!=NULL); if(iden) i-;time+;printf("ntime=%d",time); if(time>1000)printf("nruntime is too long.error.");getch(); else running(min,m); void sjf(int m) JCB *min; int i,iden; for(i=0;i<n;i+) p=min=head;iden=1; doif(p->state='W'&&p->ts<=tim

31、e) if(iden) min=p;iden=0; else if(p->ntime<min->ntime) min=p; p=p->link; while(p!=NULL) ; if(iden) i-;printf("ntime=%d",time);time+; if(time>100)printf("nruntime is too long.error");getch(); elserunning(min,m); fcfs(int m) int i,iden; for(i=0;i<n;i+) p=head;iden

32、=1; doif(p->state='W'&&p->ts<=time) iden=0; if(iden)p=p->link; while(p!=NULL&&iden) ; if(iden) i-;printf("ntime=%d",time);time+; if(time>100)printf("nruntime is too long.error");getch(); else running(p,m); running(JCB *p,int m) p->tb=time

33、;p->state='R' p->tc=p->tb+p->ntime; p->ti=(float)(p->tc-p->ts); p->wi=(float)(p->ti/p->ntime); eti+=p->ti; ewi+=p->wi; print(p,m); time+=p->ntime; p->state='F' printf("n作業(yè)%s已經(jīng)完成!npress any key to continue.n",p->name); getch();voi

34、d runjcb(int m) printf("nn作業(yè)開始運(yùn)行"); switch(m)case 1:fcfs(m);break; case 2:sjf(m);break; case 3:hrn(m);break; default:printf("n運(yùn)行錯(cuò)誤!n");exit(); start() int m; char str100="n選擇調(diào)度算法:n1.先來先服務(wù)FCFSn2.最短作業(yè)優(yōu)先SJFn3.響應(yīng)比高者優(yōu)先HRNn" ; printf("%s",str); m=getch()-48; inital(

35、); if(1<=m&&m<=3) runjcb(m); else printf("n選擇錯(cuò)誤,請重新選擇!n"); start(); last();main()start(); printf("n所有作業(yè)完成!"); getch();運(yùn)行結(jié)果:1、選擇先來先服務(wù)FCFS選擇調(diào)度算法:1.先來先服務(wù)FCFS2.最短作業(yè)優(yōu)先SJF3.響應(yīng)比高者優(yōu)先HRN輸入作業(yè)數(shù):5輸入:作業(yè)名到達(dá)時(shí)間服務(wù)時(shí)間A04B13C25D32E44作業(yè)開始運(yùn)行Time=0作業(yè)名 狀態(tài) 到達(dá)時(shí)間 服務(wù)時(shí)間 完成時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間AR044 4.

36、001.00BW13CW25DW32EW44作業(yè)A已經(jīng)完成Press any key to continueTime=4作業(yè)名 狀態(tài) 到達(dá)時(shí)間 服務(wù)時(shí)間 完成時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間BR137 6.002.00CW25DW32EW44AF044 4.001.00作業(yè)B已經(jīng)完成Press any key to continueTime=7作業(yè)名 狀態(tài) 到達(dá)時(shí)間 服務(wù)時(shí)間 完成時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間CR25 12 10.002.00DW32EW44AF044 4.001.00BF137 6.002.00作業(yè)C已經(jīng)完成Press any key to continueTime=12作業(yè)名

37、狀態(tài) 到達(dá)時(shí)間 服務(wù)時(shí)間 完成時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間DR321411.005.50EW44AF044 4.001.00BF137 6.002.00CF25 12 10.002.00作業(yè)D已經(jīng)完成Press any key to continueTime=14作業(yè)名 狀態(tài) 到達(dá)時(shí)間 服務(wù)時(shí)間 完成時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間ER441814.003.50AF044 4.001.00BF137 6.002.00CF25 12 10.002.00DF321411.005.50作業(yè)E已經(jīng)完成Press any key to continue平均周轉(zhuǎn)時(shí)間9.000平均帶權(quán)周轉(zhuǎn)時(shí)間=2.800所有作

38、業(yè)完成!2、選擇最短作業(yè)優(yōu)先SJF(簡要過程) 作業(yè)開始運(yùn)行Time=0作業(yè)名 狀態(tài) 到達(dá)時(shí)間 服務(wù)時(shí)間 完成時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間AR044 4.001.00BW13CW25DW32EW44作業(yè)A已經(jīng)完成Press any key to continueTime=4作業(yè)名 狀態(tài) 到達(dá)時(shí)間 服務(wù)時(shí)間 完成時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間DR3263.001.50BW13CW25EW44AF044 4.001.00作業(yè)D已經(jīng)完成Press any key to continueTime=6作業(yè)名 狀態(tài) 到達(dá)時(shí)間 服務(wù)時(shí)間 完成時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間Br1398.002.67CW25EW4

39、4AF044 4.001.00DF3263.001.50作業(yè)B已經(jīng)完成Press any key to continueTime=9作業(yè)名 狀態(tài) 到達(dá)時(shí)間 服務(wù)時(shí)間 完成時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間ER44139.002.25CW25AF044 4.001.00BF1398.002.67DF3263.001.50作業(yè)E已經(jīng)完成Press any key to continueTime=13作業(yè)名 狀態(tài) 到達(dá)時(shí)間 服務(wù)時(shí)間 完成時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間CR251816.003.20AF044 4.001.00BF1398.002.67DF3263.001.50EF44139.002.25作業(yè)

40、C已經(jīng)完成Press any key to continue平均周轉(zhuǎn)時(shí)間8.000平均帶權(quán)周轉(zhuǎn)時(shí)間=2.123所有作業(yè)完成!3、響應(yīng)比高者優(yōu)先HRN(簡要過程) 作業(yè)開始運(yùn)行Time=0作業(yè)名 狀態(tài) 到達(dá)時(shí)間 服務(wù)時(shí)間 優(yōu)先權(quán) 完成時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間AR041.004 4.001.00BW130.00CW25DW32EW44作業(yè)A已經(jīng)完成Press any key to continueTime=4作業(yè)名 狀態(tài) 到達(dá)時(shí)間 服務(wù)時(shí)間 優(yōu)先權(quán) 完成時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間BR132.0076.002.00CW25DW32EW44AF041.004 4.001.00作業(yè)B已經(jīng)完成Pre

41、ss any key to continueTime=7作業(yè)名 狀態(tài) 到達(dá)時(shí)間 服務(wù)時(shí)間 優(yōu)先權(quán) 完成時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間DR323.0096.003.00CW25EW44AF041.004 4.001.00BF132.0076.002.00作業(yè)D已經(jīng)完成Press any key to continueTime=9作業(yè)名 狀態(tài) 到達(dá)時(shí)間 服務(wù)時(shí)間 優(yōu)先權(quán) 完成時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間CR252.401412.002.40EW442.25AF041.0044.001.00BF132.0076.002.00DF323.0096.003.00作業(yè)C已經(jīng)完成Press any key t

42、o continueTime=14作業(yè)名 狀態(tài) 到達(dá)時(shí)間 服務(wù)時(shí)間 優(yōu)先權(quán) 完成時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間ER443.251814.003.50AF041.0044.001.00BF132.0076.002.00CF252.401412.002.40DF323.0096.003.00作業(yè)E已經(jīng)完成Press any key to continue平均周轉(zhuǎn)時(shí)間8.400平均帶權(quán)周轉(zhuǎn)時(shí)間=2.380所有作業(yè)完成?。ǘ?、編寫并調(diào)度一個(gè)多道程序系統(tǒng)的作業(yè)調(diào)度模擬程序。 作業(yè)調(diào)度算法:采用基于先來先服務(wù)的調(diào)度算法??梢詤⒖颊n本中的方法進(jìn)行設(shè)計(jì)。 對于多道程序系統(tǒng),要假定系統(tǒng)中具有的各種資源及數(shù)量、調(diào)

43、度作業(yè)時(shí)必須考慮到每個(gè)作業(yè)的資源要求。在單道批處理系統(tǒng)中,作業(yè)一投入運(yùn)行,它就占有計(jì)算機(jī)的一切資源直到作業(yè)完成為止,因此調(diào)度作業(yè)時(shí)不必考慮它所需要的資源是否得到滿足,它所占用的CPU時(shí)限等因素。而在多道批處理系統(tǒng)中,作業(yè)首先存放在外存,當(dāng)系統(tǒng)擁有的資源足夠分配給一個(gè)作業(yè),就將資源分配給此作業(yè),并將此作業(yè)調(diào)進(jìn)內(nèi)存。當(dāng)系統(tǒng)資源不足以分配給一個(gè)作業(yè)時(shí),則等待已經(jīng)分配資源的作業(yè)運(yùn)行完成后釋放資源增加系統(tǒng)資源。程序及運(yùn)行結(jié)果如下:#include<iostream>#include<stdio.h>#define getb(type) (type *)malloc(sizeof(

44、type)#define NULL 0typedef struct JCB/定義作業(yè)控制塊JCBchar name10;/作業(yè)名int stime;/開始運(yùn)行時(shí)刻int rtime;/需要運(yùn)行時(shí)間,即提供服務(wù)的時(shí)間char state;/作業(yè)狀態(tài)JCB *next;/鏈指針JCB;JCB *ready=NULL,*p;int T;/時(shí)間量int ttime;/總周轉(zhuǎn)時(shí)間float trtime;/總的帶權(quán)周轉(zhuǎn)時(shí)間void sort()/構(gòu)造鏈表存放作業(yè)JCB *fir,*sec; if(ready=NULL)ready=p;elsefir=ready->next;if(fir=NULL)

45、sec=ready; else while(fir!=NULL) sec=fir;fir=fir->next;sec->next=p;void init()/輸入作業(yè)參數(shù)int i,num; printf("輸入作業(yè)數(shù):"); scanf("%d",&num);/輸入作業(yè)數(shù) for(i=0;i<num;i+)printf("輸入第%d個(gè)作業(yè)的信息:n",i+1); p=getb(JCB); printf("作業(yè)名:"); scanf("%s",p->name);

46、printf("開始運(yùn)行時(shí)刻:"); scanf("%d",&p->stime); printf("需要運(yùn)行時(shí)間:"); scanf("%d",&p->rtime); p->state='w'/每個(gè)作業(yè)的初始狀態(tài)總是等待W p->next=NULL; sort(); T=0;/時(shí)間量ttime=0;/總周轉(zhuǎn)時(shí)間trtime=0;/總的帶權(quán)周轉(zhuǎn)時(shí)間getchar();/接收字符int length()/鏈表長int i=0; JCB *q; q=ready; w

47、hile(q!=NULL)i+;q=q->next; return i;void destroy(int end)/完成作業(yè)int i=end;float W;printf("n作業(yè)完成時(shí)間:%d",i);printf("n周轉(zhuǎn)時(shí)間:%d",i-(p->stime);W=(float)(i-(p->stime)/(float)(p->rtime);/帶權(quán)周轉(zhuǎn)時(shí)間周轉(zhuǎn)時(shí)間/提供服務(wù)的時(shí)間printf("n帶權(quán)周轉(zhuǎn)時(shí)間:%2.2f",W);void run()/運(yùn)行作業(yè)int start,end;start=T;/

48、初始值為0end=(p->rtime)+start;/作業(yè)完成時(shí)間運(yùn)行時(shí)間開始運(yùn)行時(shí)刻ttime+=end-p->stime;/總周轉(zhuǎn)時(shí)間完成時(shí)間開始運(yùn)行時(shí)刻trtime+=(float)(end-(p->stime)/(float)(p->rtime);/總的帶權(quán)周轉(zhuǎn)時(shí)間T+=p->rtime;destroy(end);void main()/主函數(shù)int len,count;count=0;printf("ttcopyright:林慶達(dá) 計(jì)算機(jī)03(7)班");printf("nt *作業(yè)調(diào)度算法:先來先服務(wù)(FCFS)*n");init();/初始化數(shù)據(jù)len=length();/就緒作業(yè)的長度 printf("npress any key to continue .");getchar();while(len!=0)&&(ready!=NULL)/若就緒隊(duì)列不為空count+;p=ready;printf("n正在執(zhí)行的作業(yè)是: %s.",p->name);ready=ready-

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論