第次 進程調模擬_第1頁
第次 進程調模擬_第2頁
第次 進程調模擬_第3頁
第次 進程調模擬_第4頁
第次 進程調模擬_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、操作系統課程實驗報告姓名學號系計算機科學與技術任課教師賀輝指導教師賀輝評閱教師賀輝實驗地點實驗時間實驗編號與實驗名稱:第5次 進程調度模擬實驗目的:進程調度是處理機管理的核心內容。通過本實驗可以加深理解有關進程控制塊(進程的概念)、進程隊列的概念及進程調度算法的理解并體會和了解優(yōu)先級和時間片輪轉調度算法的具體實施辦法。實驗內容及要求(詳見實驗講義):本實驗要求用C語言【也可以是其它你擅長的程序設計語言】編寫和調試一個簡單的進程調度模擬程序。須在實驗報告中給出詳細算法描述和流程圖。設計進程控制塊PCB表結構,分別適用于優(yōu)先級調度算法和輪轉調度算法。編制兩種進程調度算法:1)優(yōu)先級調度;2)輪轉調

2、度建立進程就緒隊列。對兩種不同算法編制入隊子程序【重點!】。實驗用到的軟件(:)Vs,word實驗內容、關鍵步驟(流程圖、代碼等)及結果分析(70分)1.優(yōu)先級調度(1)基本思想:為了防止高優(yōu)先級進程無休止地運行下去,調度程序可以在每個時鐘滴答(即每個時鐘中斷)降低當前進程的優(yōu)先級。(2)實現:即給每個進程被賦予一個優(yōu)先級,允許優(yōu)先級最高的可運行進程先運行。進程之間再以優(yōu)先級的高低,從高到低進行排序,之后開始執(zhí)行進程,在規(guī)定的時間片當中,如果進程能夠執(zhí)行完畢,就從進程隊列當中移除該進程,否則的話,減小該進程的優(yōu)先級(運行一次,優(yōu)先級-8),插入進程隊列當中,整個進程隊列依舊是按照優(yōu)先級從高到低

3、的順序進行排序,之后繼續(xù)執(zhí)行,判斷進程隊列是否為空,如果不為空,則就緒隊列的首進程投入運行。最后直到進程隊列為空,結束。(3)算法流程圖優(yōu)先級算法使用優(yōu)先級算法給新加的五個進程進行cpu處理。初始化PCB,輸入進程號及進程所需的cpu運行時間各進程由安照優(yōu)先級程度高到低排序(優(yōu)先級=100-所需cpu運行時間)就緒隊列為空將首進程置入到就緒隊列中,并運行。進程狀態(tài)變?yōu)镽。就緒隊列為空進程開始運行,當時間時間片使用完,cpu的使用時間+1,進程所需的時間-1,優(yōu)先級-8,狀態(tài)置為w。判斷進程所需cpu時間是否等于運行時間。如果等于,那么進程被cpu處理完,進程狀態(tài)變?yōu)镕,將cpu資源分配給其他進

4、程。重新對進程排序,按照進程的優(yōu)先級高低。如果所有進程狀態(tài)都為F,隊列為空,即表明所有進程都被cpu處理完,結束。(4)步驟說明1)char algo;printf("選擇算法:P/R(優(yōu)先級算法/時間片輪轉算法);輸入'e'結束n");scanf_s("%c", &algo);printf("輸入進程數:n");scanf_s("%d", &N);選擇算法,進程數量2)for (i = 1; i <= N; i+)p = (PCB *)malloc(sizeof(PCB);c

5、in >> na;cin >> time;strcpy_s(p->name, na);p->cputime = 0;p->needtime = time;p->state = 'w'p->prio = 100 - time;if (ready != NULL)insert1(p);elsep->next = ready;ready = p;初始化并創(chuàng)建進程,排序3)run = ready;ready = ready->next;run->state = 'R'將首進程進入就緒隊列4)run-

6、>cputime = run->cputime + 1;run->needtime = run->needtime - 1;run->prio = run->prio - 8;if (ready != NULL)change(run);elserun->next = ready;ready = run;run = ready;ready = ready->next;run->state = 'R'進程運行及重新排序。5)if (run->needtime = 0)run->next = finish;finish

7、 = run;run->state = 'F'run = NULL;if (ready != NULL)firstin();進程處理完,將cpu資源交予其他進程。(5)子函數關系圖先選擇優(yōu)先級算法,再輸入進程數傳入create1函數。再利用create1創(chuàng)建進程。將新建進程傳入insert1()函數進行從優(yōu)先級程度高到低排序(優(yōu)先級=100-所需cpu運行時間)將進程傳進prt1()函數輸出信息。將進程傳進prt()函數。將進程傳進prt2()函數輸出排序后,進程的所有信息。跳轉到priority()函數,并傳入參數即進程數量。進程開始運行,時間片使用完,cpu的使用時間

8、+1,進程所需的時間-1,優(yōu)先級-8,狀態(tài)置為w。并判斷進程是否被處理完,處理完將cpu資源給予其他進程。判斷進程所需cpu時間是否等于運行時間。如果等于,那么進程被cpu處理完,進程狀態(tài)變?yōu)镕,將cpu資源分配給其他進程。將進程傳入change()函數,重新對進程排序,按照進程的優(yōu)先級高低。(6)結果結果分析:和優(yōu)先級算法結果一樣。2. 輪轉調度基本思想:每個進程被分配一個時間段,稱為時間片,即允許改進程在該時間段中運行。如果時間片結束時改進程還在運行,則將剝奪cpu并分配給另一個進程。如果該進程在時間片結束前阻塞或結束,則cpu立即進行切換。實現:每個進程都會被分配一個相同的時間片,并按照

9、先來先服務進行排序,允許該進程在該時間段中運行。如果在時間片結束時該進程還在運行,則將剝奪CPU并分配給另一個進程。如果該進程在時間片結束前阻塞或結束,則CPU立即進行切換。其中每個進程分配的相同時間片的大小設計為2,一個進程如果在該時間片當中沒有結束,則將會被強制結束,將CPU分配給下一個進程,該進程將會被插入整個進程隊列的最后,如果一個進程在規(guī)定的時間結束,則將CPU立刻分配給下一個進程,該進程從進程隊列中移除。(3)算法流程圖時間輪轉算法先來先服務算法初始化PCB,輸入進程號及進程所需的cpu運行時間先來先創(chuàng)建,先排序,后創(chuàng)建的插在隊列后就緒隊列為空將首進程置入到就緒隊列中,并運行。進程

10、狀態(tài)變?yōu)镽。進程開始運行,當時間時間片使用完,占用cpu時間+2,進程所需的時間-2,計數+1,時間片長度不變,狀態(tài)置為w。并將進程置于隊尾。判斷進程所需cpu時間是否等于計數*2。如果等于,那么進程被cpu處理完,進程狀態(tài)變?yōu)镕,將cpu資源分配給其他進程。進程被插入到隊尾。如果所有進程狀態(tài)都為F,隊列為空,即表明所有進程都被cpu處理完,結束。(4) 步驟說明1)char algo;printf("選擇算法:P/R(優(yōu)先級算法/時間片輪轉算法);輸入'e'結束n");scanf_s("%c", &algo);printf(&q

11、uot;輸入進程數:n");scanf_s("%d", &N);選擇算法,進程數量2)p = (PCB *)malloc(sizeof(PCB);cin >> na;cin >> time;strcpy_s(p->name, na);p->cputime = 0;p->needtime = time;p->count = 0;p->state = 'w'p->round = 2;if (ready != NULL)insert2(p);elsep->next = ready;

12、ready = p;tail = p;初始化并創(chuàng)建進程,按照先來先服務排序3)run = ready;ready = ready->next;run->state = 'R'將首進程進入就緒隊列4)run->cputime = run->cputime + 2;run->needtime = run->needtime - 2;if (run->needtime < 0)run->needtime = 0;run->count = run->count + 1;prt(alg);進程運行5)if (run->

13、;needtime = 0)run->next = finish;finish = run;run->state = 'F'run = NULL;if (ready != NULL)firstin();elseif (run->count*2 = run->round)run->count = 0;if (ready != NULL)run->state = 'w'insert2(run);firstin();處理過的或者處理完的都插入隊尾。當所有都為F時,結束。(5)子函數關系圖選擇輪轉調度算法,再輸入進程數傳入create

14、2函數。再利用create2創(chuàng)建進程。將新建進程傳入insert2()函數。按照進程先創(chuàng)建先服務,進行排序。將進程傳進prt1()函數輸出信息。將進程傳進prt()函數將進程傳進prt2()函數輸出排序后,進程的所有信息。跳轉到roundrun()函數,并傳入參數即進程數量。進程開始運行,當時間時間片使用完,占用cpu時間+2,進程所需的時間-2,計數+1,時間片長度不變,狀態(tài)置為w。并將進程置于隊尾。并判斷進程是否被處理完。將處理完的進程,由函數firstin()將cpu資源給予其他進程,改變其他狀態(tài)變?yōu)榫途w狀態(tài)。通過傳入處理完進程到insert2()函數,并將此進程置于隊尾。(6) 結果結

15、果分析:和時間片輪轉調度算法結果一樣。3.代碼/ ConsoleApplication4.cpp : 定義控制臺應用程序的入口點。/#include "stdafx.h"#include "stdio.h"#include "stdlib.h"#include "string.h"#include "ctype.h"#include "conio.h"#include "malloc.h"#include <iostream>using nam

16、espace std;typedef struct nodechar name10;int prio;int round;int cputime;int needtime;int count;char state;struct node *next;PCB;PCB *finish, *ready, *tail, *run;int N;void firstin()run = ready;run->state = 'R'ready = ready->next;void prt1(char a)if (toupper(a) = 'P')printf(&qu

17、ot; 進程號 已占用CPU時間 所需時間 優(yōu)先數 狀態(tài)n");elseprintf(" 進程號 已占用CPU時間 所需時間 計數 時間片長度 狀態(tài)n");void prt2(char a, PCB *q)if (toupper(a) = 'P')printf(" %-10s%-15d%-10d%-7d %cn", q->name,q->cputime, q->needtime, q->prio, q->state);elseprintf(" %-12s%-12d%-12d%-12d%-1

18、2d %-cn", q->name,q->cputime, q->needtime, q->count, q->round, q->state);void prt(char algo)PCB *p;prt1(algo);if (run != NULL)prt2(algo, run);p = ready;while (p != NULL)prt2(algo, p);p = p->next;p = finish;while (p != NULL)prt2(algo, p);p = p->next;getchar();void insert1

19、(PCB *q)PCB *p1, *s, *r;int b;s = q;p1 = ready;r = p1;b = 1;while (p1 != NULL) && b)if (p1->prio >= s->prio)r = p1;p1 = p1->next;elseb = 0;if (r != p1)r->next = s;s->next = p1;elses->next = p1;ready = s;void insert2(PCB *p2)tail->next = p2;tail = p2;p2->next = NULL

20、;void change(PCB *q)PCB *p1, *s, *r;int b;q->state = 'w's = q;p1 = ready;r = p1;b = 1;while (p1 != NULL) && b)if (p1->prio >= s->prio)r = p1;p1 = p1->next;elseb = 0;if (r != p1)r->next = s;s->next = p1;elses->next = p1;ready = s;void create1(char alg, int N)PC

21、B *p;int i, time;char na10;ready = NULL;finish = NULL;run = NULL;printf("輸入進程號、運行時間:n");for (i = 1; i <= N; i+)p = (PCB *)malloc(sizeof(PCB);cin >> na;cin >> time;strcpy_s(p->name, na);p->cputime = 0;p->needtime = time;p->state = 'w'p->prio = 100 - tim

22、e;if (ready != NULL)insert1(p);elsep->next = ready;ready = p;printf(" 優(yōu)先數算法輸出信息:n");printf("*n");prt(alg);run = ready;ready = ready->next;run->state = 'R'void create2(char alg, int N)PCB *p;int i, time;char na10;ready = NULL;finish = NULL;run = NULL;printf("

23、輸入進程號、運行時間:n");for (i = 1; i <= N; i+)p = (PCB *)malloc(sizeof(PCB);cin >> na;cin >> time;strcpy_s(p->name, na);p->cputime = 0;p->needtime = time;p->count = 0;p->state = 'w'p->round = 2;if (ready != NULL)insert2(p);elsep->next = ready;ready = p;tail =

24、 p;printf(" 輪轉調度算法輸出信息n");printf("*n");prt(alg);run = ready;ready = ready->next;run->state = 'R'void priority(char alg)while (run != NULL)run->cputime = run->cputime + 1;run->needtime = run->needtime - 1;run->prio = run->prio - 8;if (run->needti

25、me = 0)run->next = finish;finish = run;run->state = 'F'run = NULL;if (ready != NULL)firstin();if (ready != NULL)change(run);elserun->next = ready;ready = run;run = ready;ready = ready->next;run->state = 'R'prt(alg);void roundrun(char alg)while (run != NULL)run->cputime = run->cputime + 2;run->needtime = run->needt

溫馨提示

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

評論

0/150

提交評論