計算機(jī)操作系統(tǒng)-處理機(jī)調(diào)度實(shí)驗報告(共12頁)_第1頁
計算機(jī)操作系統(tǒng)-處理機(jī)調(diào)度實(shí)驗報告(共12頁)_第2頁
計算機(jī)操作系統(tǒng)-處理機(jī)調(diào)度實(shí)驗報告(共12頁)_第3頁
計算機(jī)操作系統(tǒng)-處理機(jī)調(diào)度實(shí)驗報告(共12頁)_第4頁
計算機(jī)操作系統(tǒng)-處理機(jī)調(diào)度實(shí)驗報告(共12頁)_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上中南大學(xué)實(shí)驗名稱:處理機(jī)調(diào)度課程名稱:計算機(jī)操作系統(tǒng)學(xué)生姓名 盛 希 玲 學(xué) 號 學(xué) 院 信息科學(xué)與工程學(xué)院 專業(yè)班級 電子信息工程0602 完成時間 2008年10月12日 目 錄一 實(shí)驗內(nèi)容選擇一個調(diào)度算法,實(shí)現(xiàn)處理機(jī)調(diào)度。二 實(shí)驗?zāi)康亩嗟老到y(tǒng)中,當(dāng)就緒進(jìn)程數(shù)大于處理機(jī)數(shù)時,須按照某種策略決定哪些進(jìn)程優(yōu)先占用處理機(jī)。本實(shí)驗?zāi)M實(shí)現(xiàn)處理機(jī)調(diào)度,以加深了解處理機(jī)調(diào)度的工作。三 實(shí)驗題目設(shè)計一個按優(yōu)先權(quán)調(diào)度和時間片輪轉(zhuǎn)算法實(shí)現(xiàn)處理機(jī)調(diào)度的程序。四 基本思想 先選擇時間片的個數(shù)和每個時間片需要的時間,正在運(yùn)行的進(jìn)程每運(yùn)行一秒其優(yōu)先權(quán)數(shù)目加一,即其優(yōu)先權(quán)減小。每個時間片運(yùn)行

2、結(jié)束后,選擇進(jìn)入時間片進(jìn)程優(yōu)先權(quán)數(shù)目最小的進(jìn)程,開始下一個時間片的運(yùn)行。如果有進(jìn)程運(yùn)行結(jié)束,則離開,再在就緒隊列中選擇優(yōu)先權(quán)數(shù)目最小的進(jìn)程進(jìn)入。在運(yùn)行期間,如果有新的進(jìn)程來到,按優(yōu)先權(quán)大小放入就緒隊列中。五 算法分析 定義一個結(jié)構(gòu)體,此包含了PCB的信息: struct PCB char PID5; /*進(jìn)程名*/ int needtime; /*要求運(yùn)行的時間*/ int cputime; /*已運(yùn)行時間*/ int priority; /*優(yōu)先權(quán)(越小越高)*/ int starttime; /*進(jìn)入就緒隊列的時間*/ int overtime; /*運(yùn)行完成的時間*/ int state

3、; /*狀態(tài):1就緒2運(yùn)行3完成*/ struct PCB *next;子函數(shù)struct PCB *create(int num,int n)用來建立一個按優(yōu)先級大小排列的就緒進(jìn)程鏈表和一個按時間先后循序排列的將進(jìn)入就緒進(jìn)程的鏈表。main()函數(shù)中用一while循環(huán)輸出進(jìn)入時間片的進(jìn)程狀態(tài)。六 流程圖開始調(diào)用creat()函數(shù),初始化進(jìn)程PCB,各進(jìn)程按優(yōu)先級排序按優(yōu)先級選擇緒隊列中進(jìn)程放入時間片運(yùn)轉(zhuǎn)是否開始運(yùn)行運(yùn)行,每運(yùn)行一秒優(yōu)先權(quán)和已運(yùn)行時間加一時間片結(jié)束,是否就緒進(jìn)程隊列不為零將進(jìn)入就緒隊列的進(jìn)程就緒隊列是否有新進(jìn)程進(jìn)入是否所有進(jìn)程運(yùn)行結(jié)束結(jié)束七 算法描述#define NULL 0

4、#define LEN sizeof(struct PCB)#include"stdio.h"#include"stdlib.h"struct PCB char PID5; /*進(jìn)程名*/ int needtime; /*要求運(yùn)行的時間*/ int cputime; /*已運(yùn)行時間*/ int priority; /*優(yōu)先權(quán)(越小越高)*/ int starttime; /*進(jìn)入就緒隊列的時間*/ int overtime; /*運(yùn)行完成的時間*/ int state; /*狀態(tài):1就緒2運(yùn)行3完成*/ struct PCB *next;struct P

5、CB *create(int num,int n) /*創(chuàng)建進(jìn)程,并將進(jìn)程按優(yōu)先級順序插入隊列中*/ struct PCB *head,*p,*p1,*p2; int i; head=NULL; /*頭指針指零*/ for(i=1;i<=num;i+) /*循環(huán)建立所有進(jìn)程*/ printf("請輸入第%d個進(jìn)程的信息n",i); p=(struct PCB *)malloc(LEN); /*開辟一個空間*/ printf("進(jìn)程名:"); /*輸入進(jìn)程名*/ scanf("%s",p->PID); printf(&quo

6、t;要求運(yùn)行的時間:"); /*輸入要運(yùn)行的時間*/ scanf("%d",&p->needtime); p->cputime=0; /*占用處理機(jī)的時間賦為零*/ printf("優(yōu)先權(quán):"); /*輸入優(yōu)先權(quán)*/ scanf("%d",&p->priority); if(n=1) p->starttime=0; /*進(jìn)入就緒隊列的時間賦為零*/ else printf("進(jìn)入就緒隊列時間:"); /*輸入進(jìn)入就緒隊列的時間*/ scanf("%d&qu

7、ot;,&p->starttime); p->overtime=-1; /*運(yùn)行沒有結(jié)束所以運(yùn)行完成的時間賦為-1*/ p->state=1; /*狀態(tài)賦為就緒狀態(tài)*/ p1=head; /*p1指針指向頭指針*/ if(head=NULL) /*如果頭指針為零將頭指針指向新建立的進(jìn)程*/ head=p;head->next=NULL; else /*頭指針不為零的情況*/ if(n=1) while(p1!=NULL&&p->priority>p1->priority) /*查找插入點(diǎn)*/ p2=p1; p1=p1->n

8、ext; else while(p1!=NULL&&p->starttime>p1->starttime) /*查找插入點(diǎn)*/ p2=p1; p1=p1->next; if(head=p1) /*優(yōu)先權(quán)的值最小作為表頭*/ p->next=head;p2=head=p; else /*否則的話插入*/ p2->next=p;p->next=p1; return(head);void main() char now5; int cho,num,num1,timepiece,time,i,j,k,flag,choo,clock=0; str

9、uct PCB *head,*head1,*over,*later,*l,*l1,*l2,*p,*p0,*p1,*p2,*q,*q1,*q2,*q3; over=NULL; printf("初始化進(jìn)程.n"); printf("輸入總的就緒進(jìn)程數(shù):"); scanf("%d",&num); head=create(num,1); /*建立就緒進(jìn)程的鏈表*/ printf("輸入將會就緒的進(jìn)程數(shù):"); scanf("%d",&num1); /*建立將會進(jìn)入就緒進(jìn)程的鏈表*/ la

10、ter=create(num1,2); printf("cpu是否開始運(yùn)行:1是 2不是-"); scanf("%d",&cho); if(cho=1) /*處理機(jī)開始進(jìn)行調(diào)度*/ printf("現(xiàn)在的時間是:"); scanf("%s",now); printf("顯示所有就緒的進(jìn)程:n"); p2=head; printf("進(jìn)程名t要求運(yùn)行時間t已運(yùn)行時間t優(yōu)先權(quán)t狀態(tài)(1就緒2運(yùn)行3結(jié)束)n"); while(p2!=NULL) printf("%

11、st%dtt%dtt%dt%dn",p2->PID,p2->needtime,p2->cputime,p2->priority,p2->state);p2=p2->next; printf("請輸入時間片總數(shù):"); scanf("%d",&timepiece); printf("請輸入時間片的時間:"); scanf("%d",&time); printf("運(yùn)行正式開始!n"); head1=head; printf("

12、tt進(jìn)程名t要求運(yùn)行時間t已運(yùn)行時間t優(yōu)先權(quán)t狀態(tài)n"); for(i=1;i<=timepiece;i+) /*將進(jìn)入時間片運(yùn)行的進(jìn)程用頭指針head1指示,并改變就緒進(jìn)程頭指針head的指向*/ if(head!=NULL) p=head;head=head->next; else break; p->next=NULL; while(head1!=NULL) /*就緒進(jìn)程頭指針不為零就循環(huán)*/ head1->state=2; /*狀態(tài):1就緒2運(yùn)行3完成*/ for(j=1;j<=time;j+) /*每個時間片所需時間的循環(huán)*/ clock+;

13、/*定時器每秒加1*/ if(later!=NULL&&clock=later->starttime) /*如果將進(jìn)入就緒隊列的進(jìn)程時間到達(dá)加入就緒隊列*/ l=later; l1=head; later=later->next; if(head=NULL)head=l;head->next=NULL;else while(l1!=NULL&&l1->priority<=l->priority) l2=l1;l1=l1->next; if(l1=head) l->next=head; head=l; else l2

14、->next=l; l->next=l1; flag=0; printf("n%3d秒 時間片第%d秒 ",clock,j); q=head1; if(head1->needtime>head1->cputime) /*以運(yùn)行時間和優(yōu)先權(quán)都加1*/ head1->cputime+; head1->priority+; while(q) /*運(yùn)行隊列不為零輸出其信息*/if(q=head1) printf("%st%dtt%dtt%dt%dn",q->PID,q->needtime,q->cput

15、ime,q->priority,q->state); else printf("tt %st%dtt%dtt%dt%dn",q->PID,q->needtime,q->cputime,q->priority,q->state); q=q->next; if(head1->needtime=head1->cputime) /*運(yùn)行完成將其放入over為頭指針的鏈表中*/ head1->state=3;head1->overtime=clock;if(over=NULL) over=head1;head1=

16、head1->next;over->next=NULL; else if(over!=NULL&&head1!=NULL) p1=head1->next; p0=over; over=head1; over->next=p0; head1=p1; flag=1; if(flag=1) break; if(flag=1) /*有進(jìn)程結(jié)束的情況*/ if(head!=NULL) /*就緒隊列不為零將優(yōu)先權(quán)最高的放入運(yùn)行鏈表中*/ q1=head; head=head->next;q2=head1; while(q2!=NULL&&q2-

17、>priority<=q1->priority)q3=q2;q2=q2->next; if(q2=head1) q1->next=head1; head1=q1; else q3->next=q1; q1->next=q2; else /*無進(jìn)程結(jié)束的情況,尋找優(yōu)先權(quán)最高的運(yùn)行*/ head1->state=1; q1=head1; head1=head1->next; q2=head1; while(q2!=NULL&&q2->priority<=q1->priority) q3=q2;q2=q2->next; if(q2=head1) q1->next=head1;head1=q1; else q3->next=q1;q1->next=q2; printf("cpu結(jié)束運(yùn)行!n"); printf("是否輸出所有結(jié)束的進(jìn)程:1是2不是-");scanf("%d",&choo);if(choo=1) /*輸出所有完成運(yùn)行的進(jìn)程*/ printf("

溫馨提示

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

評論

0/150

提交評論