操作系統(tǒng)課程設(shè)計說明書鄭麗波_第1頁
操作系統(tǒng)課程設(shè)計說明書鄭麗波_第2頁
操作系統(tǒng)課程設(shè)計說明書鄭麗波_第3頁
操作系統(tǒng)課程設(shè)計說明書鄭麗波_第4頁
操作系統(tǒng)課程設(shè)計說明書鄭麗波_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、. . . . 中北大學(xué)操作系統(tǒng)課程設(shè)計說 明 書 學(xué) 院、系:軟件學(xué)院專 業(yè):軟件工程學(xué) 生 姓 名:麗波學(xué) 號:1121011747設(shè) 計 題 目:基于Linux的模擬進程調(diào)度算法的實現(xiàn)起 迄 日 期:2013年11月22日- 2013年12月6日指 導(dǎo) 教 師:康珺   2013 年 12 月 6日1 需求分析在操作系統(tǒng)中,進程調(diào)度實際就是給進程分配存資源,隨著計算機系統(tǒng)的發(fā)展,為了更充分的利用系統(tǒng)資源以與提高計算機的運行效率,因此需要在不同的環(huán)境下采用不同的調(diào)度算法,使得系統(tǒng)具有合理的響應(yīng)時間,就要求系統(tǒng)能按照某種算法,動態(tài)的把處理機分配給就緒隊

2、列中的一個進程,使之執(zhí)行。因此,就需要設(shè)計出幾種不同的算法,通過比較,選出一種最優(yōu)的。本程序主要實現(xiàn)基于linux的進程調(diào)度算法的實現(xiàn)。共實現(xiàn)了三種不同的調(diào)度算法,分別是:先來先服務(wù)調(diào)度算法,短作業(yè)優(yōu)先調(diào)度,高響應(yīng)比調(diào)度算法。在程序的執(zhí)行過程中,可以自主輸入進程的個數(shù)以與進程必要的信息,如:進程的創(chuàng)建時間,服務(wù)時間等,然后通過不同的調(diào)度算法實現(xiàn)進程的調(diào)度,每一種算法都能動態(tài)的演示進程調(diào)度的過程,時間間隔為一秒鐘,并且可以計算出每種調(diào)度算法下的平均周轉(zhuǎn)時間和平均帶權(quán)周轉(zhuǎn)時間,通過排序比較各種調(diào)度算法的優(yōu)劣。2 總體設(shè)計本程序主要分為四大模塊:1. 創(chuàng)建進程:可以手動創(chuàng)建進程,用戶可以自主決定進程

3、的個數(shù),并且在創(chuàng)建進程時自主決定進程名,進程的創(chuàng)建時間以與執(zhí)行時間。2. 幾種不同的調(diào)度算法:分別是先來先服務(wù)調(diào)度算法,短作業(yè)優(yōu)先調(diào)度和高響應(yīng)比調(diào)度算法。3. 顯示結(jié)果函數(shù):在各個調(diào)度算法中,每一步執(zhí)行完后都會以表格的形式顯示出進程的信息,包括:進程名,創(chuàng)建時間,服務(wù)時間,開始執(zhí)行時間,完成時間,周轉(zhuǎn)時間,帶權(quán)周轉(zhuǎn)時間。4. 比較各算法的優(yōu)劣:對平均周轉(zhuǎn)時間和平均帶權(quán)周轉(zhuǎn)時間按照由小到大的順序進行排序比較。結(jié)構(gòu)圖如下:基于linux的進程調(diào)度算法三種調(diào)度算法 顯示結(jié)果 先來先服務(wù) FCFS短作業(yè)優(yōu)先SJF高響應(yīng)比調(diào)度 HHRN存放PCB信息結(jié)構(gòu)體數(shù)組錄入PCB信息比較各算法的優(yōu)劣程序中采用結(jié)構(gòu)

4、體來存儲進程信息,其中包括:進程名,進程的創(chuàng)建時間,服務(wù)時間,執(zhí)行時間,完成時間,周轉(zhuǎn)時間,帶權(quán)周轉(zhuǎn)時間,等待時間,優(yōu)先權(quán),時候完成等,各個進程共同組成一個結(jié)構(gòu)體數(shù)組。數(shù)據(jù)結(jié)構(gòu)如下:struct Pro/進程調(diào)度信息結(jié)構(gòu)體char name;/進程名float creat_time;/創(chuàng)建時間float serve_time;/服務(wù)時間float excute_time;/執(zhí)行時間float finish_time;/完成時間float zhou_time;/周轉(zhuǎn)時間float d_time;/帶權(quán)周轉(zhuǎn)時間float wait_time;/等待時間 float priority;/優(yōu)先權(quán)int

5、 finish;/是否已經(jīng)完成;3詳細(xì)設(shè)計先來先服務(wù)調(diào)度算法:當(dāng)在進程調(diào)度算法中采用該算法時,每次調(diào)度都是從就緒隊列中選擇一個最先進入該隊列的進程,為之分配處理機,使之投入運行,該進程一直到運行完成或是發(fā)生某時間而阻塞后才放棄處理機。核心代碼: int Input(struct Pro a)/輸入函數(shù)int n,i;printf("輸入要創(chuàng)建的進程個數(shù):");scanf("%d",&n);printf("輸入進程名、開始時間和服務(wù)時間:n");getchar();for(i=0;i<n;i+)scanf("%c

6、 %f %f",&,&ai.creat_time,&ai.serve_time);getchar();ai.d_time=0;ai.finish_time=0;return n;void compare() /比較函數(shù) float temp;if(fs>ss)temp=fs;fs=ss;ss=temp;if(fs>hs)temp=fs;fs=hs;hs=temp;if(ss>hs)temp=ss;ss=hs;hs=temp;printf("平均周轉(zhuǎn)時間由小到大以此為: %8.2f %3.2f %3.2fn",

7、fs,ss,hs);if(ft>st)temp=ft;ft=st;st=temp;if(ft>ht)temp=ft;ft=ht;ht=temp;if(st>ht)temp=st;st=ht;ht=temp;printf("平均帶權(quán)周轉(zhuǎn)時間由小到大以此為:%3.2f %3.2f %3.2fn",ft,st,ht);void Display(struct Pro a,int n) /顯示函數(shù)int i;printf("數(shù)據(jù)輸出:n");printf("進程名 創(chuàng)建時間 服務(wù)時間 開始執(zhí)行時間 完成時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間n&q

8、uot;);for(i=0;i<n;i+)printf(" %c",);printf(" %10.2f",ai.creat_time);printf(" %10.2f",ai.serve_time);printf(" %10.2f",ai.excute_time);printf(" %12.2f",ai.finish_time);printf(" %10.2f",ai.zhou_time);printf(" %13.2f",ai.d_t

9、ime);printf("n");main() int n,k; struct Pro a20,b20,c20; show_welcome(); printf("nn"); n=Input(a);for(k=0;k<19;k+)bk=ak; ck=ak; FCFS(a,n); printf("*n"); SJF(b,n); printf("*n"); HRRN(c,n); printf("對于平均周轉(zhuǎn)時間: 采用FCFS算法為:%3.2f SJF算法為:%3.2f HRRN算法為:%3.2fn&qu

10、ot;,fs,ss,hs); printf("對于平均帶權(quán)周轉(zhuǎn)時間:采用FCFS算法為:%3.2f SJF算法為:%3.2f HRRN算法為:%3.2fn",ft,st,ht); compare();運行結(jié)果:4.心得體會通過這次課設(shè),讓我對進程先來先服務(wù),有了更深入的認(rèn)識!初步理解了操作系統(tǒng)對于進程處理的基本思想!并且對linux操作系統(tǒng)有了初步的了解,學(xué)會了一些基本的操作,在合作過程中,體會到了團體合作的快樂。附:#include<stdio.h>#include<unistd.h> struct Pro/進程調(diào)度信息結(jié)構(gòu)體char name;/

11、進程名float creat_time;/創(chuàng)建時間float serve_time;/服務(wù)時間float excute_time;/執(zhí)行時間float finish_time;/完成時間float zhou_time;/周轉(zhuǎn)時間float d_time;/帶權(quán)周轉(zhuǎn)時間float wait_time;/等待時間 float priority;/優(yōu)先權(quán)int finish;/是否已經(jīng)完成;float Pjzhou_time,Pjd_time; /平均周轉(zhuǎn)時間和平均帶權(quán)時間float s,t; /分別存儲周轉(zhuǎn)時間和帶權(quán)時間的和float fs,ft,ss,st,hs,ht; /分別存儲各算法中的平均

12、周轉(zhuǎn)時間和平均帶權(quán)時間void Display(struct Pro a,int n) ;/顯示函數(shù)void FCFS(struct Pro a,int n)/FCFS算法int i,j;int min=1;/最早到達(dá)int max=1;/最晚到達(dá)int temp=0;/記錄上一次運行進程for(j=0;j<n;j+)min=max;for(i=0;i<n;i+)if(amin.creat_time>ai.creat_time)&&(ai.d_time=0)/選出當(dāng)前未運行進程中到達(dá)時間最短進程 min=i;if(amax.creat_time<ai.c

13、reat_time)&&(ai.d_time=0)/選出當(dāng)前未運行進程中到達(dá)時間最長進程 max=i;if(atemp.finish_time=0)/第一個執(zhí)行進程amin.excute_time=0; amin.finish_time=0+a0.serve_time;elseamin.excute_time=atemp.finish_time; amin.finish_time=amin.excute_time+amin.serve_time;amin.zhou_time=amin.finish_time-amin.creat_time;/周轉(zhuǎn)時間=完成時間-創(chuàng)建時間amin

14、.d_time=amin.zhou_time/amin.serve_time;/帶權(quán)周轉(zhuǎn)時間=周轉(zhuǎn)時間/服務(wù)時間;temp=min; printf("nn");printf("FCFS:n"); Display(a,n);sleep(1); s=0,t=0; for(i=0;i<n;i+) s+=ai.zhou_time; t+=ai.d_time; Pjzhou_time=s/n; Pjd_time=t/n; fs=Pjzhou_time; ft=Pjd_time; printf("n"); printf("平均周轉(zhuǎn)

15、時間 t=%5.3fn平均帶權(quán)周轉(zhuǎn)時間 w=%5.3fn",Pjzhou_time,Pjd_time); printf("n"); printf("n");void SJF(struct Pro a,int n) /SJC算法int i,j;int min=1;int max=1;int temp=0;a0.excute_time=0;a0.finish_time=0+a0.serve_time;a0.zhou_time=a0.finish_time-a0.creat_time;a0.d_time=a0.zhou_time/a0.serve_t

16、ime;for(j=1;j<n;j+)min=max;for(i=1;i<n;i+)if(amin.serve_time>=ai.serve_time)&&(ai.d_time=0)&&(ai.creat_time<=atemp.finish_time)/選出當(dāng)前未運行進程中服務(wù)時間最短進程 min=i;if(amax.serve_time<=ai.serve_time)&&(ai.d_time=0)&&(ai.creat_time<=atemp.finish_time)/選出當(dāng)前未運行進程中服

17、務(wù)時間最長進程 max=i; amin.excute_time=atemp.finish_time;amin.finish_time=amin.excute_time+amin.serve_time;amin.zhou_time=amin.finish_time-amin.creat_time;/周轉(zhuǎn)時間=完成時間-創(chuàng)建時間amin.d_time=amin.zhou_time/amin.serve_time;/帶權(quán)周轉(zhuǎn)時間=周轉(zhuǎn)時間/服務(wù)時間;temp=min; printf("nn");printf("SJF:n"); Display(a,n);sle

18、ep(1); s=0,t=0; for(i=0;i<n;i+) s+=ai.zhou_time; t+=ai.d_time; Pjzhou_time=s/n; Pjd_time=t/n; printf("n"); ss=Pjzhou_time; st=Pjd_time; printf("平均周轉(zhuǎn)時間 t=%5.3fn平均帶權(quán)周轉(zhuǎn)時間 w=%5.3fn",Pjzhou_time,Pjd_time); printf("n"); printf("n");int HRN(struct Pro a,int pre,in

19、t n) /優(yōu)先權(quán)的判斷int current=1,i,j;/* 優(yōu)先權(quán) =(等待時間+服務(wù)時間)/服務(wù)時間*/for(i=0; i<n; i+) ai.wait_time=apre.finish_time-ai.creat_time; /*等待時間 =上一個進程的完成時間-創(chuàng)建時間*/ ai.priority=(ai.wait_time+ai.serve_time)/ai.serve_time;for(i=0; i<n; i+)if(!ai.finish)current=i; /*找到第一個還沒完成的進程*/break;for( j=i; j<n; j+) /*和后面的進程

20、比較*/if( !aj.finish) /* 還沒完成(運行)*/if(acurrent.creat_time<=apre.finish_time) /*如果進程在上一個進程完成之前創(chuàng)建*/if(aj.creat_time<=apre.finish_time && aj.priority>acurrent.priority )current=j;/* 找出創(chuàng)建時間在上一個進程完成之前,優(yōu)先權(quán)高的進程*/else /* 如果進程是在上一個進程完成之后創(chuàng)建*/if(aj.creat_time<acurrent.creat_time)current=j; /*

21、 找出比較早創(chuàng)建的一個*/if(aj.creat_time=acurrent.creat_time) /* 如果同時創(chuàng)建*/if(aj.priority>acurrent.priority)current=j; /*找出服務(wù)時間比較短的一個*/return current;/*返回當(dāng)前進程*/void HRRN( struct Pro a,int n) /最高響應(yīng)比算法int i;int current=0, times=0, pre=0; /當(dāng)前,次數(shù),前一個apre.finish_time=0; for(i=0;i<n;i+) /初始化優(yōu)先權(quán)和完成時間都為0 ai.priori

22、ty=0; ai.finish=0; for(times=0; times<n; times+) /開始執(zhí)行current=HRN(a,pre,n);i=current;if(times=0) / 第一個進程 ai.excute_time=ai.creat_time;ai.finish_time=ai.excute_time+ai.serve_time; ai.zhou_time=ai.serve_time;ai.d_time=1.0; else if(ai.creat_time>apre.finish_time) ai.excute_time=ai.creat_time; els

23、eai.excute_time=apre.finish_time; ai.finish_time=ai.excute_time+ai.serve_time; ai.zhou_time=ai.finish_time-ai.creat_time; ai.d_time=ai.zhou_time/ai.serve_time; ai.finish=1; pre=current;printf("nn"); printf("HRRN:n"); Display(a,n);sleep(1); s=0,t=0; for(i=0;i<n;i+) s+=ai.zhou_t

24、ime; t+=ai.d_time; Pjzhou_time=s/n; Pjd_time=t/n; hs=Pjzhou_time; ht=Pjd_time; printf("n"); printf("平均周轉(zhuǎn)時間 t=%5.3fn平均帶權(quán)周轉(zhuǎn)時間 w=%5.3fn",Pjzhou_time,Pjd_time); printf("n"); printf("n");int Input(struct Pro a)/輸入函數(shù)int n,i;printf("輸入要創(chuàng)建的進程個數(shù):");scanf(&quo

25、t;%d",&n);printf("輸入進程名、開始時間和服務(wù)時間:n");getchar();for(i=0;i<n;i+)scanf("%c %f %f",&,&ai.creat_time,&ai.serve_time);getchar();ai.d_time=0;ai.finish_time=0;return n;void compare() /比較函數(shù) float temp;if(fs>ss)temp=fs;fs=ss;ss=temp;if(fs>hs)temp=fs;fs

26、=hs;hs=temp;if(ss>hs)temp=ss;ss=hs;hs=temp;printf("平均周轉(zhuǎn)時間由小到大以此為: %8.2f %3.2f %3.2fn",fs,ss,hs);if(ft>st)temp=ft;ft=st;st=temp;if(ft>ht)temp=ft;ft=ht;ht=temp;if(st>ht)temp=st;st=ht;ht=temp;printf("平均帶權(quán)周轉(zhuǎn)時間由小到大以此為:%3.2f %3.2f %3.2fn",ft,st,ht);void Display(struct Pro a,int n) /顯示函數(shù)int i;printf("數(shù)據(jù)輸出:n");printf("進程名創(chuàng)建時間服務(wù)時間開始執(zhí)行時間完成時間周轉(zhuǎn)時間帶權(quán)周轉(zhuǎn)時間n");for(i=0;i<n;i+)printf(" %c",);printf(" %10.2f",ai.creat_time);printf(" %10.2f",ai.serve_time);printf(" %10.2f",ai.excute_time);printf(" %12.2f&

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論