




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、操作系統實驗報告(二)實驗題目:進程調度算法實驗環境:C+實驗目的:編程模擬實現幾種常見的進程調度算法,通過對幾組進程分別使用不同的調度算法,計算進程的平均周轉時間和平均帶權周轉時間,比較各種算法的性能優劣。實驗內容:編程實現如下算法:1.先來先服務算法;2.短進程優先算法;3.時間片輪轉調度算法。設計分析:程序流程圖:1.先來先服務算法初始化PCB,輸入進程信息開始各進程按先來先到的順序進入就緒隊列就緒隊列?結束運行運行進程所需CPU時間取消該進程2.短進程優先算法3.時間片輪轉調度算法實驗代碼:1. 先來先服務算法#include <iostream.h>#define n 2
2、0typedef struct int id; /進程名 int atime; /進程到達時間 int runtime; /進程運行時間fcs;void main() int amount,i,j,diao,huan; fcs fn;
3、cout<<"請輸入進程個數:"<<endl; cin>>amount; for(i=0;i<amount;i+) cout<<"請輸入進程名,進程到達時間,進程運行時間:"<<endl; cin>>fi.id; cin>>fi.atime; cin>>fi.runtime; for(i=0;i<amount;i+)
4、0; /按進程到達時間的先后排序 /如果兩個進程同時到達,按在屏幕先輸入的先運行 for(j=0;j<amount-i-1;j+)
5、0; if(fj.atime>fj+1.atime) diao=fj.atime; fj.atime=fj+1.atime; fj+1.atime=diao; huan=fj.id; fj.id=fj+1.id; fj+1.id=huan; for(i=0;i<amount;i+)
6、cout<<"進程:"<<fi.id<<"從"<<fi.atime<<"開始"<<","<<"在" <<fi.atime+fi.runtime<<"之前結束。"<<endl; fi+1.atime=fi.atime+fi.runtime; 2. 短進程優先算法#include<stdio.h>#def
7、ine n 5#define num 5#define max 65535typedef struct pro int PRO_ID; int arrive_time;int sum_time;int flag;Pro;/整數排序 int bubble(int temp) int i,j,tem=0; for(i=1;i<num;i+) int lastX=1;for(j=0;j<num-i;j+) if(tempj>tempj+1) tem=tempj; tempj=tempj+1; tempj+1=tem; lastX=0;if(lastX=1) break;return
8、 temp0; /進程排序 Pro bubble(Pro p) int i,j;Pro temp=0;Pro snum;for(i=0;i<num;i+) si=pi; for(i=1;i<num;i+)int lastX=1;for(j=0;j<num-i;j+)if(sj.sum_time>sj+1.sum_time) temp=sj; sj=sj+1; sj+1=temp; lastX=0;if(lastX=1) break;return s0; void SPF(int p)if(n>0) int i,j,k,l,tc=0;Pro seqn;Pro tem
9、p_seqn;printf("短進程優先調度算法SPFn");printf("請依次輸入5個進程的進程號、到達時間和執行時間n");printf("成員變量用逗號隔開;進程間用回車隔開n"); for(i=0;i<n;i+) scanf("%d,%d,%d",&seqi.PRO_ID,&seqi.arrive_time,&seqi.sum_time);printf("調度順序是:n");/初始化tcint tempnum;for(i=0;i<num;i+) t
10、empi=seqi.arrive_time;tc=bubble(temp);/tc是斷點啊 /flag 表示對應i的pro的隊列情況/-1表示未進入過隊列,0表示在隊列中,1表示被清除了for(i=0;i<n;i+)seqi.flag=-1; for(i=0;i<n;i+) for(j=0;j<n;j+) if(seqj.flag!=1&&seqj.arrive_time<=tc) seqj.flag=0; for(j=0;j<n;j+) temp_seqj=seqj; if(seqj.flag!=0) temp_seqj.sum_time=max
11、; l=bubble(temp_seq).PRO_ID;for(j=0;j<n;j+)if(l=seqj.PRO_ID)k=j; tc=tc+bubble(temp_seq).sum_time; seqk.flag=1; printf("%d",l);printf("n");void main()SPF(n);3. 時間片輪轉調度算法頭文件RR.h#include<iostream>#include<stdio.h>#include<string.h>#include<stdlib.h>#includ
12、e<ctype.h>#define MaxNum 100typedef struct pcb /定義進程控制塊char NameMaxNum; /進程名int arrivetime; /到達時間int runtime; /運行時間int wholetime; /固定運行時間int FinishTime; /完成時間double WeightTime; /周轉時間double WeightWholeTime; /帶權周轉時間char state; /運行后的狀態struct pcb *next;PCB;/全局變量int N; /實際進程數double SumWT; /周轉時間之和do
13、uble SumWWT; /帶權周轉時間之和double AverageWT; /平均周轉時間double AverageWWT; /平均帶權周轉時間typedef struct /定義隊列,封裝頭結點,指針分別指向隊頭和隊尾PCB *front,*rear;queue;queue *init() /進程隊列置空queue *head;head=(queue*)malloc(sizeof(queue);head->front=NULL;head->rear=NULL;return head;int empty(queue *head) /檢驗隊列是否為空return (head-&
14、gt;front?0:1);queue *append(queue *head,char cMaxNum,int a,int r,char s) /進程隊列入隊,往后插入PCB *p;p=(PCB *)malloc(sizeof(PCB);strcpy(p->Name,c);p->arrivetime=a;p->runtime=r;p->wholetime=r;p->state=s;/p->FinishTime=0;/p->WeightTime=0;/p->WeightWholeTime=0;p->next=NULL;if(empty(he
15、ad)head->front=head->rear=p;elsehead->rear->next=p;head->rear=p;return head;queue *creat(queue *head) /創建進程隊列char cMaxNum;char s='R'int a,r,i;printf("請輸入共有幾個進程:n");scanf("%d",&N);for(i=1;i<=N;i+)printf("請輸入第%d 個進程的進程名:n",i);getchar();gets(c
16、);printf("請輸入第%d 個進程的到達時間:n",i);scanf("%d",&a);printf("請輸入第%d 個進程的服務時間:n",i);scanf("%d",&r);head=append(head,c,a,r,s);return head;void print(queue *head) /輸入創建的進程隊列PCB *p;p=head->front;if(!p)printf("時間片輪轉調度隊列為空!n");while(p)printf("Nam
17、e=%s arrivetime=%d runtime=%d state=%c",p->Name,p->arrivetime,p->runtime,p->state);printf("n");p=p->next;/*時間片輪轉法調度算法的實現*/void RR(queue *head,int q)int t=head->front->arrivetime, lt=head->rear->arrivetime;if(head->front->runtime<q)t=t+head->front
18、->runtime;elset=t+q;/*進程隊列為不空才可調度*/while(!empty(head)PCB *p1,*p2; printf("n時刻 進程 運行后的狀態n");/*第一種情況:當前運行的時間小于最后一個進程到達時間做一下操作*/while(t<lt)p1=head->front;printf("%2d %s",t,p1->Name);p1->runtime=p1->runtime-q;/1.運行時間小于0,刪除隊首if(p1->runtime<=0)p1->state='
19、C'printf(" %cn",p1->state);p1->FinishTime=t;p1->WeightTime=p1->FinishTime-p1->arrivetime;p1->WeightWholeTime=p1->WeightTime/p1->wholetime; SumWT+=p1->WeightTime;SumWWT+=p1->WeightWholeTime;printf("時刻%2d進程%s運行結束,進程%s周轉時間=%5.2f,帶權周轉時間=%5.2fn",t,p1-
20、>Name,p1->Name,p1->WeightTime,p1->WeightWholeTime);head->front=p1->next;free(p1);/2.運行時間大于0,向后找位置插入elseprintf(" %cn",p1->state);p2=p1->next;while(p2->next && p2->arrivetime != t)p2=p2->next;/此時無新進入隊列的進程,有兩種情況:1.不用找位置往后插入,隊首不變,不做操作/2.找位置往后插入if(p2->
21、;arrivetime != t)PCB *p3=p1,*p4;while(p3->next && p3->arrivetime<t)p4=p3;p3=p3->next;if(p3->arrivetime>t)if(p4!=p1) /p1插在p4后,頭為p1->nexthead->front=p1->next;p1->next=p4->next;p4->next=p1;else /不做操作p4=p3=p2=NULL;elsep4=p3=p2=NULL;/此時有新進入隊列的進程時:p1插在新進入隊列的進程p2
22、后,隊首為p1->nextelsehead->front=p1->next;p1->next=p2->next;p2->next=p1;/時刻變化 if(head->front->runtime<q)t=t+head->front->runtime;elset=t+q;/*第一種情況結束*/*第二種情況:當期運行的時間大于最后一個進程到達的時間做以下操作*/while(t>=lt)p1=head->front;printf("%2d %s",t,p1->Name);p1->runtim
23、e=p1->runtime-q;/1.運行時間小于0,刪除隊首if(p1->runtime<=0)p1->state='C'printf(" %cn",p1->state); p1->FinishTime=t;p1->WeightTime=p1->FinishTime-p1->arrivetime;p1->WeightWholeTime=p1->WeightTime/p1->wholetime; SumWT+=p1->WeightTime;SumWWT+=p1->Weight
24、WholeTime;printf("時刻%2d進程%s運行結束,進程%s周轉時間=%5.2f,帶權周轉時間=%5.2fn",t,p1->Name,p1->Name,p1->WeightTime,p1->WeightWholeTime);/printf("時刻%2d進程%s運行結束",t,p1->pname);head->front=p1->next;free(p1);/2.運行時間大于0,直接插在隊尾elseprintf(" %cn",p1->state);/若原隊列只有一個進程,不必往隊尾插 if(!p1->next)head->front=p1; /若原隊列有多個進程elsehead->front=p1->next; head->rear->next=p1;head->rear=p1;p1-
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 五年級下冊數學教學計劃(19篇)
- 自我鑒定怎么寫(6篇)
- 2025年秋季開學升旗演講稿范文(6篇)
- 房屋承包租賃合同(18篇)
- 幼兒園班主任工作計劃總結(32篇)
- 施工項目變更管理協議
- 正規裝修官方合同協議
- 德國大棚買賣合同協議
- 恒企教育培訓合同協議
- 品牌化妝品代銷合同協議
- 2023年小型水庫雨水情測報和大壩安全監測設施項目-實施方案
- (2024年)面神經炎課件完整版
- 減鹽減油健康教育教案反思
- 特斯拉國產供應鏈研究報告
- 如何進行醫療垃圾的安全運輸
- 公共停車場建設項目可行性研究報告
- 保安服務標準及工作流程
- 2024年中考數學幾何模型歸納(全國通用):18 全等與相似模型之十字模型(學生版)
- 外科疾病分級目錄
- 國家級教學成果的培育提煉與申報
- 海南師范大學《高等數學》2020-2021期末試卷B
評論
0/150
提交評論