進程調度程序設計報告源代碼_第1頁
進程調度程序設計報告源代碼_第2頁
進程調度程序設計報告源代碼_第3頁
進程調度程序設計報告源代碼_第4頁
進程調度程序設計報告源代碼_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、-. z成績課程設計報告題目 進程調度程序設計 課程名稱 操作系統(tǒng)課程設計 院部名稱計算機工程學院專業(yè)計算機科學與技術 班級 13計算機科學與技術(單)(1) 學生* 周敏健* 1305202113 課程設計地點 A104 課程設計學時20學時指導教師 何 健金陵科技學院教務處制目 錄 TOC o 1-3 h z u HYPERLINK l _Toc436927676摘要 PAGEREF _Toc436927676 h 3HYPERLINK l _Toc436927677一、課程設計的目的和要求 PAGEREF _Toc436927677 h 4HYPERLINK l _Toc43692767

2、8二、系統(tǒng)需求分析 PAGEREF _Toc436927678 h 4HYPERLINK l _Toc436927679三、總體設計 PAGEREF _Toc436927679 h 5HYPERLINK l _Toc436927680四、詳細設計 PAGEREF _Toc436927680 h 6HYPERLINK l _Toc436927681五、測試、調試過程 PAGEREF _Toc436927681 h 9HYPERLINK l _Toc436927682六、結論與體會 PAGEREF _Toc436927682 h 11HYPERLINK l _Toc436927683七、參考文獻

3、PAGEREF _Toc436927683 h 12HYPERLINK l _Toc436927684附錄:源程序 PAGEREF _Toc436927684 h 12課程設計課題進程調度程序設計摘 要在多道系統(tǒng)中,對批處理作業(yè)需要進展作業(yè)調度。作業(yè)調度是在資源滿足的條件下,將處于就緒狀態(tài)的作業(yè)調入存,同時生成與作業(yè)相對應的進程,并未這些進程提供所需要的資源。進程調度需要根據進程控制塊PCB中的信息,檢查系統(tǒng)是否滿足進程的資源需求。只有在滿足進程的資源需求的情況下,系統(tǒng)才能進展進程調度。下面是幾種常見的作業(yè)調度算法:先來先效勞FCFS、優(yōu)先算法、輪換算法、短作業(yè)優(yōu)先算法以及最高響應比優(yōu)先法等,

4、本文將對前兩種算法進展詳細的介紹。關鍵詞:進程調度,優(yōu)先級,F(xiàn)CFS,PCB,作業(yè),資源一、課程設計的目的和要求1、目的進程調度是處理機管理的核心容。本設計要求用C語言編寫和調試一個簡單的進程調度程序。通過設計本可以加深理解有關進程控制塊、進程隊列的概念,并體會和了解最高優(yōu)先數(shù)優(yōu)先的調度算法即把處理機分配給優(yōu)先數(shù)最高的進程和先來先效勞算法的具體實施方法。2、要求1進程調度算法:采用最高優(yōu)先數(shù)優(yōu)先的調度算法即把處理機分配給優(yōu)先數(shù)最高的進程和先來先效勞算法。 2每個進程有一個進程控制塊 PCB表示。進程控制塊可以包含如下信息:進程名、優(yōu)先數(shù)、到達時間、需要運行時間、已用CPU時間、進程狀態(tài)等等。

5、3進程的優(yōu)先數(shù)及需要的運行時間可以事先人為地指定也可以由隨機數(shù)產生。進程的到達時間為進程輸入的時間。 進程的運行時間以時間片為單位進展計算。 4每個進程的狀態(tài)可以是就緒 WWait、運行RRun、或完成FFinish三種狀態(tài)之一。 5就緒進程獲得CPU后都只能運行一個時間片。用已占用CPU時間加1來表示。如果運行一個時間片后,進程的已占用 CPU時間已到達所需要的運行時間,則撤消該進程,如果運行一個時間片后進程的已占用CPU時間還未達所需要的運行時間,也就是進程還需要繼續(xù)運行,此時應將進程的優(yōu)先數(shù)減1即降低一級,然后把它插入就緒隊列等待CPU。 6每進展一次調度程序都打印一次運行進程、就緒隊列

6、、以及各個進程的 PCB,以便進展檢查。 7重復以上過程,直到所要進程都完成為止。二、系統(tǒng)需求分析編寫一個模擬進程調度的程序,將每個進程抽象成一個進程控制塊PCB,PCB用一個構造體描述。采用兩種不同的調度算法來實現(xiàn)功能,主要有如下幾大功能模塊組成。創(chuàng)立優(yōu)先數(shù)PCB模塊 用循環(huán)來實現(xiàn)對每個進程的進程名、進程優(yōu)先數(shù)隨機分配以及所需時間的錄入。將進程隊列存放到就緒隊列等待執(zhí)行。優(yōu)先數(shù)調度算法模塊從優(yōu)先級最高就緒隊列的第一個進程的開場執(zhí)行,每執(zhí)行一次優(yōu)先數(shù)減1,并重新放入就緒隊列進展排序,對排序完的繼續(xù)運行直到所有進程都完畢。FCFS創(chuàng)立PCB模塊 對N個進程的信息進展輸入:進程名、到達時間、需要時

7、間等。每輸入一個進程,按進程的到達時間進展排序,記下前驅和后繼的方法。FCFS調度算法模塊當系統(tǒng)時間與第一個進程到達時間一致時,將進程狀態(tài)置為Run,直到這個進程執(zhí)行完,再判斷下個進程的到達時間,假設系統(tǒng)時間大于下個進程的到達時間,即上個進程的完畢時間就是下個進程的開場時間,反之就等待系統(tǒng)時間。進程完畢后放入完成隊列。主函數(shù)及菜單顯示 由主菜單進入顯示界面,進展算法選擇。三、總體設計進程是程序在處理機上的執(zhí)行過程。進程存在的標識是進程控制塊PCB,所謂系統(tǒng)創(chuàng)立一個進程,就是由系統(tǒng)為*個程序設置一個PCB,用于對該進程進展控制和管理。進程任務完成,由系統(tǒng)收回其PCB,該進程便消亡。每個進程可有三

8、個狀態(tài):運行狀態(tài)、就緒狀態(tài)和完成狀態(tài)。因此設計三個鏈隊列,finish為完成隊列的頭指針,wait為就緒隊列的頭指針。因為每一時刻,CPU只能運行一個進程,所以運行隊列只有一個run指針指向當前運行的進程??紤]到處理的方便,將它們設為全局變量??傮w構造框架圖:優(yōu)先數(shù)算法界面FCFS算法開場四、詳細設計1優(yōu)先數(shù)調度算法優(yōu)先調度算法要為每一個進程設一個優(yōu)先數(shù),它總是把處理機給就緒隊列中具有最高優(yōu)先權的進程。常用的算法有靜態(tài)優(yōu)先權法和動態(tài)優(yōu)先權法。本程序采用了動態(tài)優(yōu)先權法,使進程的優(yōu)先權隨時間而改變。初始的進程優(yōu)先數(shù)取決于進程運行所需的時間,時間大,則優(yōu)先數(shù)低,所以采取了將進程優(yōu)先數(shù)定位最大的那個進

9、程,隨著進程的運行優(yōu)先數(shù)進展調整,每次運行時都是從就緒隊列中選取優(yōu)先數(shù)最大的進程運行,所以將就緒隊列按照優(yōu)先數(shù)的大小從高到低排序,這樣,每次取隊頭進程即可。優(yōu)先數(shù)調度算法輸入進程信息將進程放入ready隊列進程按優(yōu)先數(shù)大小排序取ready隊列首進程送入run執(zhí)行一個時間片,優(yōu)先數(shù)-1,運行時間+1是否還需輸入進程YN輸入時進程是否完成N執(zhí)行隊列時放入完成隊列Y2先來先效勞調度算法先來先效勞調度算法是按照進程進入就緒隊列的先后順序調度并分配處理機執(zhí)行。先來先效勞算法是一種不可搶占的算法,先進入就緒隊列的進程,先被處理機運行,一旦一個進程占有了處理機,它就一直運行下去,直到該進程完成工作或者因為等

10、待*種事件而不能繼續(xù)運行時才釋放處理機。FCFS調度算法輸入進程信息將進程放入ready隊列進程按到達先后順序排序取ready隊列首進程送入run執(zhí)行一個時間片,運行時間+1是否還需輸入進程YN輸入時進程是否完成N執(zhí)行隊列時放入完成隊列Y五、測試、調試過程界面優(yōu)先數(shù)算法輸入優(yōu)先數(shù)算法輸出FCFS算法輸入FCFS算法輸出遇到的問題:在設計程序時,在算法上面出現(xiàn)了一些錯誤,優(yōu)先數(shù)不是由大到小排序,而是應該這樣理解,當進程執(zhí)行一個時間片時,優(yōu)先數(shù)減一使用CPU的時間變少,反而優(yōu)先級高,因此,優(yōu)先級高的優(yōu)先數(shù)應該是比擬小的,而不是優(yōu)先數(shù)大的優(yōu)先級大。在程序調試時,鏈表發(fā)生了錯誤,該存不可寫或者就是程序

11、直接完畢,但最終結果不是我想要的,經過一番折騰,最后發(fā)現(xiàn),頭指針和頭結點混淆,有些地方沒有給指針分配存,語句的先后順序不正確,以及沒有考慮到鏈表最后沒有設置完畢標志。六、結論與體會做這個程序我斷斷續(xù)續(xù)的算下來應該總共用了2天,主要是花時間在觀察別人的算法讀別人的程序,然后才開場寫自己的程序,期間參考了前人的程序并進展了改善和加工,這讓我對進程調度的理解再次加深了,這是在平常學習的根底上,與程序相結合的過程,讓我再次感受到編程給我們帶來的無窮魅力,只要自己有興趣,其實編程也是一件有趣的事,為了到達一定的要求,我們必須屢次嘗試用不同的方法去實現(xiàn)它,比方,進程調度有先來先效勞算法,對于這個算法,可以

12、用數(shù)組實現(xiàn),也可以用鏈表實現(xiàn),但是到底哪個更好哪個更靈活呢,相信學過C語言的人都知道肯定是用鏈表實現(xiàn)最好了。這次設計還是有一些缺乏之處的,比方在算法和運行效率上還是有些欠缺的,需要進一步去改善程序代碼,提高效率,減少冗余和錯誤,讓使用者更清晰的觀察和理解進程調度。七、參考文獻1任愛華、羅曉峰. 操作系統(tǒng)實用教程第三版M.:清華大學,20212諶衛(wèi)軍、王浩娟. 操作系統(tǒng)M. :清華大學,2021.53日前橋和彌Maebasi Kazuya. 征服C指針M. 吳雅明譯. :人民郵電,2021.2附錄:源程序*include *include *include *include*includetyp

13、edef struct node char name10; /進程名 int prio; /進程優(yōu)先數(shù) int cputime; /進程占用CPU時間int needtime; /進程到完成還要的時間int arrivetime; /進程到達時間int starttime; /進程開場時間int finishtime; /進程完成時間int servicetime; /進程效勞時間char state; /進程的狀態(tài) struct node *ne*t; PCB; PCB *finish,*ready,*run; /隊列指針int N; /進程量void firstin() run=ready

14、; /就緒隊列頭指針賦值給運行頭指針run-state=R; /進程狀態(tài)變?yōu)檫\行態(tài)ready=ready-ne*t; /就緒對列頭指針后移到下一進程 void prt1(char a) switch(a)case 1: /*優(yōu)先數(shù)法*/ printf(名字t進程占用CPU時間t需要的時間t優(yōu)先級數(shù)t狀態(tài)n);break; case 2: /*先來先效勞算法*/printf(名字t到達時間t開場時間t效勞時間t完成時間t狀態(tài)n);break;default:break; void prt2(char a,PCB *q) switch(a)case 1: printf(%st%dtt%dtt%dt

15、t%cn,q-name,q-cputime,q-needtime,q-prio,q-state);break; case 2:printf(%st%dtt%dtt%dtt%dtt%cn,q-name,q-arrivetime,q-starttime,q-servicetime,q-finishtime,q-state);break;default:break; void prt(char algo) PCB *p; prt1(algo); /輸出文字格式 if(run!=NULL) /如果運行指針不空 prt2(algo,run); /輸出當前正在運行的PCBp=ready; /輸出就緒隊列P

16、CBwhile(p!=NULL) prt2(algo,p); p=p-ne*t; p=finish; /輸出完成隊列的PCB while(p!=NULL) prt2(algo,p); p=p-ne*t; getchar(); /壓任意鍵繼續(xù) void insert1(PCB *q) PCB *p1,*s,*r; int b; s=q; /待插入的PCB指針 p1=ready; /就緒隊列頭指針 r=p1; /做p1的前驅指針 b=1; while(p1!=NULL)&b) /根據優(yōu)先數(shù)確定插入位置 if(p1-prio=s-prio) r=p1; p1=p1-ne*t; else b=0; i

17、f(r!=p1) /如果條件成立說明插入在r與p1之間 r-ne*t=s; s-ne*t=p1; else s-ne*t=p1; /否則插入在就緒隊列的頭ready=s; void insert2(PCB *q)PCB *p1,*s,*r;int b;s=q; /指針s指向新要插入的進程p1=ready; /指針p1指向原來的進程的對首r=p1; /使用指針r指向p1前面的進程b=1;while(p1!=NULL)&b)if(p1-arrivetimearrivetime)r=p1; p1=p1-ne*t;elseb=0;if(r!=p1)r-ne*t=s;s-ne*t=p1;elses-ne

18、*t=p1;ready=s; void create1(char alg) PCB *p; int i,time; char na10; ready=NULL; /就緒隊列頭指針 finish=NULL; /完成隊列頭指針 run=NULL; /運行隊列頭指針 /輸入N個進程名和所需時間創(chuàng)立PCBfor(i=1;iname,na); p-cputime=0; p-needtime=time; p-state=W; p-prio=rand()%15+1; /隨機分配優(yōu)先數(shù)1,15if(ready!=NULL) /就緒隊列不空則調用插入函數(shù)插入 insert1(p); /對新進程插入就緒隊列els

19、e p-ne*t=ready; /創(chuàng)立就緒隊列的第一個PCB ready=p; system(cls);printf( 優(yōu)先數(shù)算法結果輸出n); printf(n);prt(alg); /輸出進程PCB信息 run=ready; /將就緒隊列的第一個進程投入運行 ready=ready-ne*t; run-state=R; void create2(char alg)PCB *p;int i; ready=NULL;run=NULL;finish=NULL;for(i=0;iname);printf(到達時間:);scanf(%d,&p-arrivetime);printf(需要時間:);sc

20、anf(%d,&p-servicetime); p-starttime=0; p-finishtime=0;p-state=W;if(ready!=NULL)insert2(p);/將新進程插入就緒隊列elsep-ne*t=ready;/創(chuàng)立就緒隊列的第一個ready=p;system(cls);printf( 先來先效勞算法結果輸出n);printf(n);prt(alg);void priority(char alg) while(run!=NULL) /當運行隊列不空時,有進程正在運行 run-cputime=run-cputime+1; run-needtime=run-needtim

21、e-1; run-prio=run-prio-1; /每運行一次優(yōu)先數(shù)-1 if(run-prioprio=0;if(run-needtime=0) /如果所需時間為0,即完成,將其插入完成隊列 run-ne*t=finish; finish=run; run-state=F; /置狀態(tài)為完成態(tài) run=NULL; /運行隊列頭指針為空 if(ready!=NULL) /如果就緒隊列不空 firstin(); /將就緒對列的第一個進程投入運行 else /沒有運行完同時優(yōu)先數(shù)不是最大,則將其變?yōu)榫途w態(tài)插入到就緒隊列if(ready!=NULL)&(run-prioprio) run-state

22、=W; /狀態(tài)改為就緒insert1(run);/將進程按優(yōu)先數(shù)大小插入firstin(); /將就緒隊列的第一個進程投入運行 prt(alg); /輸出進程PCB信息 void FCFS(char alg) int time=0;/系統(tǒng)時間從0開場dorun=ready;/就緒序列的第一個進程放入run隊列進展執(zhí)行run-state=R;/進程開場執(zhí)行ready=ready-ne*t;/指向下一個time=run-arrivetimetime run-arrivetime:time; run-starttime=time;/進程開場prt(alg);/顯示正在執(zhí)行的進程time=time+run-servicetime;/計算下個進程最小可開場時間run-finishtime=time;/進程完畢時間run-state=F;/完畢狀態(tài)標識prt(alg);/進程完畢再顯示run-ne*t=finish;finish=run;/進程完畢放入完畢隊列run=NULL;while(ready!=NULL);/*菜單顯示函數(shù)*/void Menu()system(cls);printf(tt+n); printf(tt| 進程調度算法 | n);printf(tt

溫馨提示

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

評論

0/150

提交評論