實驗一、進程調度實驗報告匯總_第1頁
實驗一、進程調度實驗報告匯總_第2頁
實驗一、進程調度實驗報告匯總_第3頁
實驗一、進程調度實驗報告匯總_第4頁
實驗一、進程調度實驗報告匯總_第5頁
已閱讀5頁,還剩12頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、精選優質文檔-傾情為你奉上廣東技術師范學院實驗報告學院:計算機科學學院專業:計算機科學與技術(師范)班級:成績:姓名:學號:組別:組員:實驗地點:實驗日期:指導教師簽名:預習情況操作情況考勤情況數據處理情況實驗名稱: 實驗一、進程調度實驗 一、實驗目的用高級語言編寫和調試一個進程調度程序,以加深對進程的概念及進程調度算法的理解二、實驗類別綜合性實驗。綜合高級語言編程、進程調度模型、進程調度算法及數據結構等多方面的知識三、實驗內容和步驟 1編寫并調試一個模擬的進程調度程序,采用“最高優先數優先”調度算法對五個進程進行調度。 “最高優先數優先”調度算法的基本思想是把CPU分配給就緒隊列中優先數最高

2、的進程。 靜態優先數是在創建進程時確定的,并在整個進程運行期間不再改變。 動態優先數是指進程的優先數在創建進程時可以給定一個初始值,并且可以按一定原則修改優先數。例如:在進程獲得一次CPU后就將其優先數減少1。或者,進程等待的時間超過某一時限時增加其優先數的值,等等該題根據老師給的代碼用Visual C+運行,結果以及分析如下:結果分析:根據上述輸入的三個進程的信息可以得到:優先級最高的是進程cc最先調度進程cc的狀態為運行態,需要執行的時間為10當前就緒隊列狀態為:進程aa先級比較高,處于就緒隊列前面,而進程bb先級是三者中最低的,所以處于就緒隊列的最后。而此時這兩個進程的狀態都為就緒態。結

3、果分析:當進程cc了一個時間片之后而它已占用 CPU時間已達到所需要的運行時間,則將它的優先級減1之后,再將三個進程按優先級的大小排列,從中選擇優先級大的進程進入運行狀態,則該次進入運行態的是進程aa按照這種方式一直運行下去:直到:結果分析:當進程bb的CPU占用時間等于它需要的執行時間時,進程bb度完成。則這時進程調度中還有兩個進程:進程aa進程cc結果分析:當調度進程中只剩下進程aa程cc這時根據進程優先級的大小,進程aa入運行態。當進程aa調度時,進程調度程序中直剩下進程cc這時進程cc進入運行態,而當前就緒隊列將為空。直到:結果分析:當進程i的CPU占用時間等于所需要的執行時間時,進程

4、cc調度完成,則這時進程調度中已經沒有需要調度的進程了,則整個進程調度完成。2、編寫并調試一個模擬的進程調度程序,采用“輪轉法”調度算法對五個進程進行調度。 輪轉法可以是簡單輪轉法、可變時間片輪轉法,或多隊列輪轉法。 簡單輪轉法的基本思想是:所有就緒進程按 FCFS排成一個隊列,總是把處理機分配給隊首的進程,各進程占用CPU的時間片相同。如果運行進程用完它的時間片后還為完成,就把它送回到就緒隊列的末尾,把處理機重新分配給隊首的進程。直至所有的進程運行完畢。將老師給的源程序修改成簡單的時間片輪轉法流程圖如下:進程完成,撤消該進程就緒隊列首進程投入運行時間片到,運行進程已占用CPU時間+1運行進程

5、已占用CPU時間已達到所需的運行時間把運行進程插入到下一個隊列的隊尾插入新的進程開始初始化PCB,輸入進程信息所有隊列都為空各進程按FCFS原則排隊等待調度時間片輪轉法#include<stdio.h>#include<stdlib.h>#include<conio.h>#define getpch(type) (type*)malloc(sizeof(type)#define NULL 0#define TIME 2/時間片長度/typedef struct pcb /進程管理塊char name10;/進程名字char state;/進程狀態int qu

6、eue;/進程所在的隊列int ntime;/進程需要運行的時間int rtime;/進程已經運行的時間int etime;/進程在本隊列可運行的時間片struct pcb *link;PCB;PCB*ready = NULL, *pinsert = NULL, *pfend = NULL,*p =NULL;/*就緒隊列,進程插入位置的變量*/int geti()/使用戶僅能輸入整數char ch;int i = 0;fflush(stdin);ch = getchar();while(ch = 'n')printf("tf輸入不能為空.請重新輸入n");f

7、flush(stdin);ch = getchar();while(ch != 'n')if(ch > '9' | ch < '0')printf("t輸入有誤!輸入只能為正整數,請重新輸入.n");fflush(stdin);i = 0;ch = getchar();elsei = i*10 + (ch - '0');ch = getchar();return i;void findpos()/更新狀態量PCB *ps = pfend;if(!ps | !ps -> link | (ps-&

8、gt; link->queue - ps->queue) > 1) pinsert = ps;elsewhile (ps->link && ps ->link->queue != (pfend ->queue +2)ps = ps->link;pinsert = ps;void insert()/插入進程if(!ready )ready = p;pfend = p;pinsert = p;else if(ready ->queue = 1) /第一隊列存在p->link = pfend->link;pfend-&

9、gt;link = p;pfend = p;findpos();Elsep->link = ready;ready = p;findpos();void input()/*建立進程控制塊函數*/int i,num;printf("n請輸入進程的個數:");num = geti();for(i=0; i < num; i+)printf("n進程號No.%d:n",i+1);p=getpch(PCB);printf("n輸入進程名:");scanf("%s",p->name);printf(&quo

10、t;n輸入進程運行時間:");p ->ntime = geti();printf("n");p->rtime=0;p->state='w'p->queue =1;p->etime = TIME;p->link=NULL;insert();/*調用insert函數*/void disp(PCB *pr)/*建立進程現實函數,用于顯示當前進程*/printf("nnamet statet queuet ntimet rtimet在隊列可停留時間t n");printf("|%st&quo

11、t;,pr->name);printf(" |%ct",pr->state);printf(" |%dt",pr->queue);printf(" |%dt",pr->ntime);printf(" |%dt",pr->rtime);printf(" |%dt",pr->etime);printf("n");void check()/*建立進程查看函數*/PCB *pr;printf("n *當前正在運行的進程是:%s"

12、,ready->name);/*顯示當前運行的進程*/disp(ready);pr= ready ->link;printf("n*當前就緒隊列狀態為:n");/*顯示就緒隊列狀態*/while(pr!=NULL)disp(pr);pr=pr->link;void sort()/調整進程隊列if(!ready->link |ready->queue < ready->link->queue) return;p = ready ->link;ready ->link = pinsert ->link;pinse

13、rt ->link = ready;pinsert = ready;ready = p;if (ready && ready -> queue = pinsert ->queue)findpos();void addnew()/添加新的進程if(ready ->queue != 1)(ready -> queue)+;ready->etime *= 2;ready -> state='w'sort();/*調用sort函數*/input();elseinput();void destroy()/*建立進程撤銷函數(進程運

14、行結束,撤銷進程)*/printf("n進程%s已完成.n",ready->name);p = ready;ready = ready->link;free(p);if (ready && ready -> queue = pinsert ->queue)findpos();void running()/*建立進程就緒函數(進程運行時間到,置就緒狀態)*/(ready -> rtime)+;ready ->etime -;if(ready->rtime = ready->ntime)destroy();retu

15、rn;else if(ready ->etime = 0)int time = 2;(ready -> queue)+;for(int i = 2; i != ready->queue; +i)time *= 2;ready->etime = time;ready -> state='w'sort();/*調用sort函數*/void main()char ch;input();while(ready != NULL)printf("nThe execute name:%sn",ready ->name);ready -&

16、gt;state = 'R'check();running();printf("n按i鍵添加新進程.按其他任意鍵繼續運行.");fflush(stdin);ch = getchar();if (ch = 'i'| ch='I')addnew();printf("nn 進程已經完成n");getchar();運行結果如下:根據題意輸入五個進程按任意鍵繼續四、實驗問題及原因  (1)本次試驗,思路設計不難在這個多級反饋的實驗中,我采取了用一條實際上的鏈表隊列來模擬多個邏輯上的隊列,通過維護幾個鏈表的狀態信息來找到每個進程運行完后應該插入的地方,還有一個標志位Fend用來表明新插入的隊列的位置。  (2)在建立優先數就緒隊列時主要運用,鏈表插入模型。但是由于本題是從建立、

溫馨提示

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

評論

0/150

提交評論