




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、操作系统实验报告(二)实验题目:进程调度算法 实验环境:C+实验目的:编程模拟实现几种常见的进程调度算法, 通过对几组进程分别使用不 同的调度算法,计算进程的平均周转时间和平均带权周转时间,比较各种算法的性能优劣。实验内容:编程实现如下算法:1. 先来先服务算法;2. 短进程优先算法;3. 时间片轮转调度算法设计分析:程序流程图:1. 先来先服务算法2. 短进程优先算法3.时间片轮转调度算法实验代码:1.先来先服务算法#include <iostream.h>#define n 20typedef structint id;进程名int atime;/进程到达时间int runti
2、me;/进程运行时间 fcs;void main()(int amount,i,j,diao,huan;fcs fn;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+)/按进程到达时间的先后排序(
3、/如果两个进程同时到达,按在屏幕先输入的先运行for(j=0;j<amount-i-1;j+)( 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+)(cout<<"进程:"<<fi.id<<"从"<<fi.atime<<"开始"<<&q
4、uot;,"<<"在"<<fi.atime+fi.runtime<<"之前结束。"<<endl;fi+1.atime=fi.atime+fi.runtime;2.短进程优先算法#include<stdio.h>#define n 5#define num 5#define max 65535typedef struct pro( int PRO_ID;int sum_time;int flag;Pro;/整数排序int bubble(int temp)(int i,j,tem=0;fo
5、r(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 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&g
6、t;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 temp_seqn;printf("短进程优先调度算法SPFn");printf("请依次输入5个进程的进程号、到达时间和执行时间n");printf("成员变量用逗号隔开;进程间用回车隔开 n");for(i=0;i<n;i+)scanf("%d,%d
7、,%d'',&seqi.PRO_ID,&seqi.arrive_time,&seqi.sum_time);printf("调度顺序是:n");/初始化tcint tempnum;for(i=0;i<num;i+)tempi=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+)i
8、f(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;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()S
9、PF(n);3. 时间片轮转调度算法头文件RR.h#include<iostream>#include<stdio.h> #include<string.h>#include<stdlib.h>#include<ctype.h>#define MaxNum 100typedef struct pcb /定义进程控制块char NameMaxNum;/ 进程名int arrivetime; / 到达时间int runtime;/运行时间int wholetime;/固定运行时间int FinishTime; / 完成时间double W
10、eightTime; / 周转时间double WeightWholeTime;/ 带权周转时间char state;/运行后的状态struct pcb *next;PCB;全局变量int N;/实际进程数double SumWT;/周转时间之和double SumWWT;/带权周转时间之和double AverageWT;/平均周转时间double AverageWWT;/平均带权周转时间typedef struct/定义队列,封装头结点,指针分别指向队头和队尾PCB *front,*rear;queue;queue *init()/进程队列置空(queue *head;head=(queu
11、e*)malloc(sizeof(queue);head->front=NULL;head->rear=NULL;return head;int empty(queue *head) / 检验队列是否为空(return (head->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
12、->wholetime=r;p->state=s;/p->FinishTime=0;/p->WeightTime=0;/p->WeightWholeTime=0;p->next=NULL;if(empty(head)head->front=head->rear=p;else(head->rear->next=p;head->rear=p;return head;queue *creat(queue *head)/ 创建进程队列(char cMaxNum;char s='R'int a,r,i;printf(&qu
13、ot;请输入共有几个进程:n");scanf("%d”,&N);for(i=1;i<=N;i+)(printf("请输入第%d个进程的进程名:n”,i);getchar();gets(c);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(que
14、ue *head)输入创建的进程队列PCB *p;p=head->front;if(!p)printf("时间片轮转调度队列为空!n");while(p)printf("Name=%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->
15、;front->arrivetime, lt=head->rear->arrivetime;if(head->front->runtime<q)t=t+head->front->runtime;elset=t+q;/*进程队列为不空才可调度*/while(!empty(head)PCB *p1,*p2;printf("n时刻 进程 运行后的状态n");/*第一种情况:当前运行的时间小于最后一个进程到达时间做一下操作*/while(t<lt)p1=head->front;printf("%2d %s&quo
16、t;,t,p1->Name);p1->runtime=p1->runtime-q;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
17、+=p1->WeightWholeTime;printf("时刻%2d 进程%s 运行结束,进程%s 周转时间=%5.2f,带权周转时间=%5.2fn",t,p1->Name,p1->Name,p1->WeightTime,p1->WeightWholeTime);head->front=p1->next;free(p1);/2.运行时间大于0,向后找位置插入else(printf(" %cn",p1->state);p2=p1->next;while(p2->next && p
18、2->arrivetime != t)(p2=p2->next;此时无新进入队列的进程,有两种情况:1.不用找位置往后插入,队首不变,不做操作/2.找位置往后插入if(p2->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->next(head->front=p1->next;p1->
19、;next=p4->next;p4->next=p1;else /不做操作p4=p3=p2=NULL;elsep4=p3=p2=NULL;此时有新进入队列的进程时:pl插在新进入队列的进程p2后,队首为p1->nextelse(head->front=p1->next;p1->next=p2->next;p2->next=p1;时刻变化if(head->front->runtime<q)t=t+head->front->runtime;elset=t+q;/* 第一种情况结束 */*第二种情况:当期运行的时间大于最后
20、一个进程到达的时间做以下操作*/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='C'printf(" %cn”,p1->state);p1->FinishTime=t;p1->WeightTime=p1->FinishTime-p1->arrivetime;p1->Weig
21、htWholeTime=p1->WeightTime/p1->wholetime;SumWT+=p1->WeightTime;SumWWT+=p1->WeightWholeTime;printf("时刻%2d 进程%s 运行结束,进程%s 周转时间=%5.2f,带权周转时间=%5.2fn",t,p1->Name,p1->Name,p1->WeightTime,p1->WeightWholeTime);/printf("时刻 2d 进程%s 运行结束",t,p1->pname);head->fro
22、nt=p1->next;free(p1);/2.运行时间大于0,直接插在队尾else(printf(" %cn",p1->state);/若原队列只有一个进程,不必往队尾插if(!p1->next)head->front=p1;/若原队列有多个进程else(head->front=p1->next;head->rear->next=p1;head->rear=p1;p1->next=NULL;/时刻变化,队列为空时不做时刻变化 if(empty(head)return;else(if(head->front-
23、>runtime<q)t=t+head->front->runtime;elset=t+q; /* 第二种情况结束 */ 主程序Main.cpp#include<iostream> #include<stdio.h>#include<string.h>#include<stdlib.h>#include<ctype.h>#include "RR.h"void main()(queue *head;int q;head=init();head=creat(head);printf("n您输入的时间片轮转进程队列为:n");print(head);printf("n请输入时间片轮转调度的时间片为:");
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公路ppp合同范本
- 分红比例合同范本
- 公路规划合同范本
- 协议合同范本写法
- 兼职还款合同范本
- pos机推广合同范本
- 入股店铺协议合同范本
- 义齿加工合同范本模板
- 京东入职合同范本
- 医院整体转让合同范本
- 安全生产责任制考核制度和考核表(完整版)
- 19J102-1 19G613混凝土小型空心砌块墙体建筑与结构构造
- 建筑垃圾清运及处置 投标方案(技术方案)
- 2024年常州信息职业技术学院单招职业技能测试题库及答案解析
- 《中国陶瓷史》课件-1-中国陶瓷史概述
- 英语教师课堂提问省公开课一等奖全国示范课微课金奖课件
- 经皮式气管切开术
- 2024嘉兴市城南街道招聘笔试参考题库附带答案详解
- 个人维修收款收据
- 代办电瓶车车牌照委托书
- 智慧农业中的智能农机与农具技术
评论
0/150
提交评论