版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上第6章 处理机管理软件121 金凯1. 实验题目:用FCFS、RR和优先级调度算法来模拟处理机调度FCFS:在多道程序或多任务系统中,系统中同时处于就绪态的进程又若干个,也就是说能运行的进程数远远大于处理机个数,为了使系统中的各个进程能有条不紊的运行,必须选择某种调度策略,以选择一进程占用处理机。RR:如果早就绪的进程排在就绪队列的前面,迟就绪的进程排在就绪队列的后面,那么先来先服务FCFS (first come first service)总是把当前处于就绪队列之首的那个到运行状态。也就说,它只考虑进程进入就绪队列的先后,而不考虑它的下一个CPU周期的长短及其他因
2、素。FCFS算法简单易行,但性能却不大好。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。优先级调度:(1)当该算法用于作业调度时,系统从后备作业队列中选择若干个优先级最高的,且系统能满足资源要求的作业装入内存运行。(2)当该算法用于进程调度时,将把处理机分配给就绪进程队列中优先级最高的进程。2.程序中使用的数据结构及主要符号说明struct task_struct char name10; /*进程名称*/ int number;
3、/*进程编号*/ float come_time; /*到达时间*/ float run_begin_time; /*开始运行时间*/ float run_time; /*运行时间*/ float run_end_time; /*运行结束时间*/ int priority; /*优先级*/ int order; /*运行次序*/ int run_flag; / *调度标志*/ tasksMAX;3. 程序流程图 1> main函数以及进程信息的输入用delete语句撤销dispatch对象调用显示进程调度信息的算法print()调用进程调度算法开始运行主函数结束主函数的运行输出选择进程调
4、度算法的提示信息输入数据满足要求否是根据满足要求的输入,调用dispatch的构造函数构生成相应的dispatch对象从文本文档lin.txt读入进程信息关闭lin/.txt文档2> 先来先服务进程调度算法(FCFS)调用FCFSS算法按到达时间顺序排列的PQueue进程队列是否为空?察看当前进程是否访问过?取出第PQueue中的队首元素,即PQueue队列中到达时间最早的进程否否输出错误提示模拟运行该进程,对总周转时间,总带权周转时间进行赋值,对end_time(结束时间)点赋值。并把当前进程插入Queue队列,并删除其在PQueue中的信息队列PQueue是否为空?是结束FCFS函数
5、调用源程序注:下列程序在c+编译器cfree上通过测试,vc6.0没有经过测试。1>先来先服务算法说明:这里建立了如教材127页上面的一个例子,模拟了3个作业请求处理的情况。具体可以对照教材说明进行查阅。#include<iostream>using namespace std;#define MAX 10struct task_struct char name; /*进程名称*/ int number; /*进程编号*/ float come_time; /*到达时间*/ float run_begin_time; /*开始运行时间*/ float run_time; /*
6、运行时间*/ float run_end_time; /*运行结束时间*/ int priority; /*优先级*/ int order; /*运行次序*/ int run_flag; /*调度标志*/ tasksMAX; int counter; /*实际进程个数*/int fcfs()/*先来先服务算法*/float time_temp=0;int i;int number_schedul;time_temp=e_time;for(i=0;i<counter;i+) tasksi.run_begin_time=time_temp; tasksi.run_end_
7、time=tasksi.run_begin_time+tasksi.run_time; tasksi.run_flag=1; time_temp=tasksi.run_end_time; number_schedul=i; tasksnumber_schedul.order=i+1;return 0;int pinput() /*进程参数的初始化,按照教材127页最上面的表格*/ int i; /初始化进程数 counter=3; /初始化每个到达系统的时间 e_time=0; e_time=0; e_time=0; /初始化每个进程
8、估计运行的时间 tasks0.run_time=28; tasks1.run_time=9; tasks2.run_time=3; /初始化每个进程的名字='A'='B'='C'cout<<"*先来先服务算法*"<<endl<<endl;for(i=0;i<counter;i+) tasksi.run_begin_time=0; tasksi.run_end_time=0; tasksi.order=0; tasksi.
9、run_flag=0;return 0;int poutput() /*调度结果输出*/int i;float turn_round_time=0,f1,w=0;cout<<"作业名 到达时间 运行时间 开始时间 停止时间 运行次序 周转时间"<<endl;for(i=0;i<counter;i+) f1=tasksi.run_end_e_time; turn_round_time+=f1; w+=(f1/tasksi.run_time); cout<<" "<<task
10、<<'t'<<" "<<e_time<<'t'<<" " <<tasksi.run_time<<'t'<<" "<<tasksi.run_begin_time<<'t'<<" " <<tasksi.run_end_time<<'t'<<t
11、asksi.order<<'t'<<f1<<'t'<<endl;cout<<"平均周转时间:"<<turn_round_time/counter<<endl;cout<<"平均带权周转时间:"<<w/counter<<endl;cout<<" "cout<<" 程序测试 BY:金凯"<<endl;cout<<"
12、; "cout<<"测试结果:符合先来先服务算法的要求和结果"<<endl;return 0;int main(void) pinput();fcfs();poutput();return 0;得到的结果如下:为了验证该程序的通用性,下面我把3个作业的调度顺序改为2、1、3,对于的程序片段修改如下:/初始化每个进程估计运行的时间 tasks0.run_time=9; tasks1.run_time=28; tasks2.run_time=3;然后得到了下面的结果:结果符合教材127页中提到的结果,平均作业时间为29ms,进一步说明的程序的正
13、确性和通用性。继续调整作业进入顺序,将进入顺序调整为3、2、1可以得到:该程序结果和教材上面的结果一致,FCFS算法测试完毕!2>时间片轮转法说明:这里我用了链表来存放各个进程中的信息,用环形链表来保证数据的输出。#include<iostream>using namespace std;struct node /建立链表来存放进程数据 char name5; /进程名称 int need_time; /所需要的时间 int allocation; /占用cpu的情况 char state; /目前的状态 R为运行,E为运行完毕 node *next; /链表的尾结点 ;in
14、t main(void)int n=0,num=0;node *head=NULL;node *tail=NULL;cout<<"*时间片轮转调度算法*"<<endl<<endl;cout<<"总共有多少个进程?"cin>>n; /输入进程数量 if(n<=1)cout<<"进程数应大于1,请重新输入!"<<endl; return 0;for(int i=0;i<n;i+) node *temp=new node; cout<<
15、;"请输入作业名和执行时间:" cin>>temp->name>>temp->need_time; temp->state='R' /初始状态每个进程均为运行态 temp->allocation=0;/初始时进程均不占用cpu num+=temp->need_time; /用num来限制循环的次数 if(!head) tail=head=temp; else tail->next=temp; tail=temp; tail->next=head; node *p;p=head;cout<
16、<endl<<"初始时刻:"<<endl;cout<<"进程"<<'t'<<"剩余时间"<<'t'<<"状态"<<'t'<<"占用cpu时间"<<endl;while(p!=tail)cout<<" "<<p->name<<'t'<<&
17、quot; "<<p->need_time<<'t'<<'t'<<p->state<<'t'<<" "<<p->allocation<<'s'<<endl;p=p->next;cout<<" "<<tail->name<<'t'<<" "<<tail-
18、>need_time<<'t'<<'t'<<p->state<<'t'<<" "<<p->allocation<<'s'<<endl;node *q;int label=1;int i=1;while(label=1&&i<=num)cout<<endl;label=0; while(!p->need_time) p=p->next; if(p->
19、need_time) p->need_time-;p->allocation+; if(p->need_time=0) p->state='E' label=1;p=p->next; cout<<"执行"<<i<<"秒后:"<<endl; q=head; cout<<"进程"<<'t'<<"剩余时间"<<'t'<<"状态&
20、quot;<<'t'<<"占用cpu时间"<<endl; while(q!=tail) cout<<" "<<q->name<<'t'<<" "<<q->need_time<<'t'<<'t'<<q->state<<'t'<<" "<<q->all
21、ocation<<'s'<<endl; q=q->next; cout<<" "<<tail->name<<'t'<<" "<<tail->need_time<<'t'<<'t'<<p->state<<'t'<<" "<<q->allocation<<'
22、s'<<endl; i+;cout<<endl<<" "cout<<" 程序测试 BY:金凯"<<endl;cout<<" "cout<<"测试结果:符合时间片轮转算法的要求和结果"<<endl;return 0;运行结果:输入的3个进程如下表作业号进入时间预计执行时间A02B01C03Ps:在这个程序我有时会遇到运行状态表示不准确的问题,比如两个进程就可以正确输出,但如果换成3个进程就可能会遇到某一进程已经运行
23、完毕,但程序却显示仍在运行(R),但通过分析程序并没有找到解决的办法。个人觉得是下面这个程序片段有误,故在此说明。if(p->need_time)p->need_time-;p->allocation+; if(p->need_time=0) p->state='E' label=1;p=p->next;3>优先级调度算法说明:本程序中优先级大小是按照数字来定义的,数字越大优先级越大,应该最先被执行。#include<iostream>using namespace std;#define MAX 10struct task
24、_struct char name; /*进程名称*/ int number; /*进程编号*/ float come_time; /*到达时间*/ float run_begin_time; /*开始运行时间*/ float run_time; /*运行时间*/ float run_end_time; /*运行结束时间*/ int priority; /*优先级*/ int order; /*运行次序*/ int run_flag; /*调度标志*/ tasksMAX; int counter; /*实际进程个数*/int ps() /*优先级调度*/float temp_time=0;in
25、t i=0,j;int number_schedul,temp_counter;int max_priority;max_priority=tasksi.priority;j=1;while (j<counter)&&(e_time=e_time) if (tasksj.priority>tasksi.priority) max_priority=tasksj.priority; i=j; j+; /*查找第一个被调度的进程*/*对第一个被调度的进程求相应的参数*/number_schedul=i;tasksnumber_sc
26、hedul.run_begin_time=tasksnumber_e_time;tasksnumber_schedul.run_end_time=tasksnumber_schedul.run_begin_time+tasksnumber_schedul.run_time;tasksnumber_schedul.run_flag=1;temp_time=tasksnumber_schedul.run_end_time;tasksnumber_schedul.order=1;temp_counter=1;while (temp_counter<counter) max
27、_priority=0; for(j=0;j<counter;j+) if(e_time<=temp_time)&&(!tasksj.run_flag) if (tasksj.priority>max_priority) max_priority=tasksj.priority; number_schedul=j; /*查找下一个被调度的进程*/ /*对找到的下一个被调度的进程求相应的参数*/ tasksnumber_schedul.run_begin_time=temp_time; tasksnumber_schedul.run_end_
28、time=tasksnumber_schedul.run_begin_time+tasksnumber_schedul.run_time;tasksnumber_schedul.run_flag=1;temp_time=tasksnumber_schedul.run_end_time;temp_counter+;tasksnumber_schedul.order=temp_counter; return 0;int pinput() /*进程参数的初始化*/ int i; /初始化进程数 counter=3; /初始化每个到达系统的时间 e_time=4; tasks1.c
29、ome_time=6; e_time=5; /初始化每个进程估计运行的时间 tasks0.run_time=5; tasks1.run_time=10; tasks2.run_time=8; /初始化每个进程的名字='A'='B'='C'/初始化优先级tasks0.priority=3;tasks1.priority=1; tasks2.priority=2;cout<<"*优先级调度算法*"<<endl<<
30、;endl;for(i=0;i<counter;i+) tasksi.run_begin_time=0; tasksi.run_end_time=0; tasksi.order=0; tasksi.run_flag=0;return 0;int poutput() /*调度结果输出*/int i;float turn_round_time=0,f1,w=0;cout<<"作业名 到达时间 运行时间 开始时间 停止时间 优先级 运行次序 周转时间"<<endl;for(i=0;i<1;i+) f1=tasksi.run_end_time-t
31、e_time; turn_round_time+=f1; w+=(f1/tasksi.run_time); cout<<" "<<<<'t'<<" "<<e_time<<'t'<<" " <<tasksi.run_time<<'t'<<" "<<tasksi.run_begin_
32、time<<'t'<<" " <<tasksi.run_end_time<<'t'<<'t'<<tasksi.priority<<'t'<<tasksi.order<<'t'<<f1<<'t'<<endl;for(i=1;i<counter;i+) f1=tasksi.run_end_e_time; turn_round_time+=f1; w+=(f1/tasksi.run_time); cout<<" "<<<<'t'<<" "<<e_time<<'t'<<" "
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 拉勾网产品经理岗位面试全解与技巧
- 肯德基餐饮行业餐厅管理岗位招聘面经详解
- 动脉粥样硬化药物治疗依从性
- 成考专业就业方向
- 护理追踪法实践操作
- 基于柔性生产的现代供应链策略研究
- 听力检测的质量控制
- 快递行业配送经理面试解析
- 客户关系管理策略及实践总结
- 2025年自动驾驶数据标注数据标注质量保证措施
- 芯片行业经销商制度规范
- IT技术介绍教学课件
- 【《某苹果采摘机械臂的总体方案设计案例》2300字】
- 2025年泰州职业技术学院单招职业技能测试题库附答案
- 2025中远海运财产保险自保有限公司高级管理人员招聘笔试历年典型考点题库附带答案详解
- 2025天津师范大学智能分子交叉科学研究院招聘部分博士层次专业技术岗位人员(公共基础知识)综合能力测试题带答案解析
- 肝硬化HRS合并肝肾综合征型肝肾联合损伤方案
- T/CI 366-2024新能源汽车动力电池用高抗拉强度超薄铜箔
- 2025年中南体育考研真题及答案
- 2025浙江金华市东阳市部分机关事业单位招聘编外人74人员(二)笔试考试参考试题及答案解析
- 2025年6月浙江省高考历史试卷真题(含答案解析)
评论
0/150
提交评论