版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、安徽师范大学皖江学院电子实验报告专业名称 实验课程 操作系统 实验名称 进程调度 组 长 成 员 实验日期 2015-11-22 1、 实验目的和要求在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实习模拟在单处理器情况下的处理器调度,帮助我们加深了解处理器调度的工作。 2、 实验内容利用高级语言模拟进程的时间片轮转调度算法,响应比高者优先调度算法。3、 实验程序分析与设计第一题:设计一个按时间片轮转法实现处理器调度的程序。算法设计思想:(1) 假定系统有五个进程,每一个进程用一个进程控制块PCB来代
2、表。进程控制块的格式为:进程名指针要求运行时间已运行时间状态其中,进程名作为进程的标识,假设五个进程的进程名分别为Q1,Q2,Q3,Q4,Q5。指针进程按顺序排成循环队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程的指针指出第一个进程的进程控制块首地址。要求运行时间假设进程需要运行的单位时间数。已运行时间假设进程已经运行的单位时间数,初始值为“0”。状态有两种状态,“就绪”和“结束”,初始状态都为“就绪”,用“R”表示。当一个进程运行结束后,它的状态为“结束”,用“E”表示。(2) 每次运行所设计的进程调度程序前,为每个进程任意确定它的“要求运行时间”。(3) 把五个进程按顺序排成
3、循环队列,用指针指出队列连接情况。另用一标志单元记录轮到运行的进程。(4) 处理器调度总是选择标志单元指示的进程运行。由于本实验是模拟处理器调度的功能,所以,对被选中的进程并不实际的启动运行,而是执行:已运行时间+1来模拟进程的一次运行,表示进程已经运行过一个单位的时间。请注意:在实际的系统中,当一个进程被选中运行时,必须置上该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片。在这时省去了这些工作,仅用“已运行时间+1”来表示进程已经运行满一个时间片。(5) 进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进
4、程。同时,应判断该进程的要求运行时间与已运行时间,若该进程的要求运行时间¹已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应指导它的状态修改成“结束”(E)且退出队列。此时,应把该进程的进程控制块中的指针值送到前面一个进程的指针位置。(6) 若“就绪”状态的进程队列不为空,则重复上面的(4)和(5)的步骤,直到所有的进程都成为“结束”状态。(7) 在所设计的程序中应有显示或打印语句,能显示或打印每次选中进程的进程名以及运行一次后进程队列的变化。(8) 为五个进程任意确定一组“要求运行时间”,启动所设计的处理器调度程序,
5、显示或打印逐次被选中的进程名以及进程控制块的动态变化过程。第二题:设计一个按响应比高者优先调度算法实现进程调度的程序。算法设计思想:(1) 假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块的格式为:进程名指针要求运行时间等待时间响应比状态其中,进程名作为进程的标识,假设五个进程的进程名分别为P1,P2,P3,P4,P5。指针按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“0”。要求运行时间假设进程需要运行的单位时间数。等待时间自最近一次调度运行至今等待的时间数,当进程被调度时等待时间清零。响应比进程调度程序运行前计算每个
6、进程的响应比,调度时总是选取响应比大的进程先执行,每次执行一个固定的时间片。状态可假设有两种状态,“就绪”状态和“结束”状态。五个进程的初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态为“结束”,用“E”表示。(2) 在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“等待时间”和“要求运行时间”。(3) 为了调度方便,把五个进程按给定的响应比从大到小连成队列。用一单元指出队首进程,用指针指出队列的连接情况。(4) 处理器调度总是选队首进程运行。采用动态改变响应比的办法,进程每运行一次重新计算各进程的响应比。由于本实验是模拟处理器调度,所以,对被选中的进程并不实际
7、的启动运行,而是执行:要求运行时间-1、等待时间为0。其它进程等待时间+1,重新计算各进程的响应比,并从大到小排序。提醒注意的是:在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行结束。在这里省去了这些工作。(5) 进程运行一次后,若要求运行时间¹0,则再将它加入队尾(因其响应比最小。);若要求运行时间=0,则把它的状态修改成“结束”(E),且退出队列。(6) 若“就绪”状态的进程队列不为空,则重复上面(4)和(5)的步骤,直到所有进程都成为“结束”状态。(7) 在所设计的程序中应有显示或打印语句,能显示或打印每次被选中进程的进程名
8、以及运行一次后进程队列的变化及各进程的参数。(8) 为五个进程任意确定一组“等待时间”和“要求运行时间”,启动所设计的进程调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。4、 运行结果五、实验代码#include<dos.h> #include<time.h> #include<stdlib.h> #include<stdio.h> #include<conio.h> #include<string.h>#include <iostream> #include <cstdlib&g
9、t;#define NUM 5 /假定系统中进程个数为5 /时间片结构体的定义typedef char string10; /* 定义string为含有10个字符元素的字符数组类*/ struct task string name; /*作业号*/ int arrTime; /* 作业到达时间*/ int serTime; /*作业要求服务时间*/ int waiTime; /*等待时间*/ int begTime; /*开始运行时间*/ int finTime; /*结束运行时间*/ int priority;/*优先权*/ int finish;/*是否已经完成*/ JCB10; int
10、num; /高响应比的结构体定义using namespace std; typedef struct PNode / PCB struct PNode *next; / 定义指向下一个节点的指针 char name10; / 定义进程名,并分配空间 int All_Time; / 定义总运行时间 int Runed_Time; / 定义已运行时间 char state; / 定义进程状态* Proc; / 指向该PCB的指针int ProcNum; /定义进程控制块数组 /创建新进程void InitPCB(Proc &H) cout<<"请输入总进程个数: &
11、quot; cin>>ProcNum; / 进程总个数 int Num=ProcNum; H=(Proc)malloc(sizeof(PNode); / 建立头节点 H->next=NULL; Proc p=H; /定义一个指针 cout<<"n总进程个数为"<<ProcNum<<" 个,请依次输入相应信息nn" while (Num-) p=p->next=(Proc)malloc(sizeof(PNode); cout<<"进程名 总运行时间 已运行时间 :n"
12、; cin>>p->name>>p->All_Time>>p->Runed_Time; p->state='R' p->next=NULL; p->next=H->next; cout<<endl<<"-进程列表-nn" /输出运行中的进程信息void DispInfo(Proc H) Proc p=H->next; do if (p->state != 'E') /如果该进程的状态不是End的话 cout<<&quo
13、t;进程名:"<<p->name<<"t总运行时间:"<<p->All_Time <<"t已运行时间:"<<p->Runed_Time <<"t状态:"<<p->state<<endl; p=p->next; else p=p->next; while (p != H->next); / 整个进程链条始终完整,只是状态位有差异 / 时间片轮转法void SJP_Simulator(Proc
14、 &H) cout<<endl<<"-开始-n" cout<<endl<<"【按时间片轮转法实现处理器调度】n" int flag=ProcNum; / 记录剩余进程数 int round=0; / 记录轮转数 Proc p=H->next; while (p->All_Time > p->Runed_Time) / 即未结束的进程 round+; cout<<endl<<"第 "<<round<<"
15、;轮- "<<p->name<<"- 进程正在运行"<<endl; p->Runed_Time+; / 更改正在运行的进程的已运行时间 DispInfo(H); / 输出此时为就绪状态的进程的信息 if (p->All_Time = p->Runed_Time) / 并判断该进程是否结束 p->state='E' flag-; cout<<endl<<"-"<<p->name<<".state= E,
16、该进程被删除!n" p=p->next; while (flag && p->All_Time = p->Runed_Time) p=p->next; / 跳过先前已结束的进程 cout<<endl<<"-结束-n" /高响应比的输入void input() int i; system("cls"); /清屏printf("n请输入作业数量: "); scanf("%d", &num); for(i=0;i<num;i+) pr
17、intf("n请输入作业NO.%d:n",i); printf(" 作业名称: "); scanf("%s",JCB); printf(" 到达时间: "); scanf("%d",&JCBi.arrTime); printf(" 服务时间: "); scanf("%d",&JCBi.serTime); JCBi.priority = 0; JCBi.finish =0; printf("-n"); prin
18、tf("-按优先级排序-n");printf(" 名称 到达时间 服务时间 n");for(i=0;i<num;i+)printf("%3s%9d%9d%n", JCB,JCBi.arrTime,JCBi.serTime);/按高响应比执行int HRN(int pre) int current=1,i,j;/* 优先权=(等待时间+服务时间)/服务时间*/ for(i=0; i<num; i+) JCBi.waiTime=JCBpre.finTime-JCBi.arrTime; /*等待时间=上一个作业的完成
19、时间-到达时间*/ JCBi.priority=(JCBi.waiTime+JCBi.serTime)/JCBi.serTime; for(i=0; i<num; i+) if(!JCBi.finish) current=i; /*找到第一个还没完成的作业*/ break; for( j=i; j<num; j+) /*和后面的作业比较*/ if( !JCBj.finish) /* 还没完成(运行)*/ if(JCBcurrent.arrTime<=JCBpre.finTime) /*如果作业在上一个作业完成之前到*/ if(JCBj.arrTime<=JCBpre.f
20、inTime && JCBj.priority>JCBcurrent.priority ) current=j;/* 找出到达时间在上一个作业完成之前,优先权高的作业*/ else /* 如果作业是在上一个作业完成之后到达*/ if(JCBj.arrTime<JCBcurrent.arrTime) current=j; /* 找出比较早到达的一个*/ if(JCBj.arrTime=JCBcurrent.arrTime) /* 如果同时到达*/ if(JCBj.priority>JCBcurrent.priority) current=j; /*找出服务时间比
21、较短的一个*/ return current;/*返回当前作业*/ /void runing(int i, int times, int pre, int staTime, int endTime) if(times=0) JCBi.begTime=JCBi.arrTime; JCBi.finTime=JCBi.begTime+JCBi.serTime; staTime=JCBi.begTime; else if(JCBi.arrTime>JCBpre.finTime) JCBi.begTime=JCBi.arrTime; else JCBi.begTime=JCBpre.finTime
22、; JCBi.finTime=JCBi.begTime+JCBi.serTime; if(times=num-1) endTime=JCBi.finTime; JCBi.finish=1; /高响应比输出函数void print(int i,int times) if(times=0) printf(" 名称 到达时间 服务时间 开始时间 完成时间 n"); printf("%3s%10d%10d%10d%12dn", JCB,JCBi.arrTime,JCBi.serTime, JCBi.begTime,JCBi.finTime); /vo
23、id check( ) int i; int staTime, endTime;int current=0, times=0, pre=0; JCBpre.finTime=0; for(i=0; i<num; i+) JCBi.finish=0; staTime, endTime; current=0;times=0; pre=0; JCBpre.finTime=0; printf("-n"); for(i=0; i<num; i+) JCBi.finish=0; staTime, endTime; current=0; times=0; pre=0; JCBp
24、re.finTime=0; printf("n-开始-n"); for(times=0; times<num; times+) current=HRN(pre); runing(current, times, pre, staTime, endTime); print(current, times); pre=current; printf("-n"); void main()/按动态优先数调度主程序 int x; printf("请选择1/2(时间片算法/优先级算法):"); scanf("%d",&x); while(x!=0) if(x=1) Proc H; InitPCB(H); / 数据初始化DispInfo(H); / 输出此刻的进程状态SJP_Sim
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医院大部室工作制度
- 医院内消杀工作制度
- 医院药药房工作制度
- 单位查验证工作制度
- 卫健局双拥工作制度
- 卫生站工作制度汇编
- 卫生院检验工作制度
- 印刷厂考勤工作制度
- 厨房蒸笼部工作制度
- 县委办信息工作制度
- 2026年消费维权竞赛试题及答案
- 2025年广东深圳市中考英语试卷真题及答案详解(精校打印版)
- 校医院内部财务管理制度
- 2026年兰考三农职业学院单招职业适应性测试题库附答案详解(黄金题型)
- 2025年一级建造师考试《矿业工程管理与实务》真题及答案
- 2025四川泸州市古蔺县考试选任聘副科级领导干部14人备考题库附答案
- 小学语文跨学科融合教学的实践探索课题报告教学研究课题报告
- 高校毕业生就业创业调查报告
- 山东省2026届高三12月大联考数学试题(含答案)
- 水晶产品采购合同范本
- 钢结构厂房组织方案
评论
0/150
提交评论