《操作系统实验之调度算法(31页).doc》由会员分享,可在线阅读,更多相关《操作系统实验之调度算法(31页).doc(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-安徽师范大学 数计 学院实验报告专业名称软件工程实 验 室2号201实验课程操作系统实验实验名称调度算法姓 名周*学 号110*同组人员无实验日期2013.4.6注:实验报告应包含(实验目的,实验原理,主要仪器设备和材料,实验过程和步骤,实验原始数据记录和处理,实验结果和分析,成绩评定)等七项内容。具体内容可根据专业特点和实验性质略作调整,页面不够可附页。1.实验目的 理解基于时间片轮转的处理机调度算法,更好的掌握算法的思想,结合实验理解算法更直观,深刻具体。通过对时间片轮转法处理机的调度算法的模拟实验可以清楚的了解处理机是如何调度的,以及加深对进程的执行的过程的了。2. 实验原理实现对时间
2、片轮转法处理机调度算法的模拟,本程序只对进程的运行模拟不实际启动,而是将其运行时间加一,判断要求运行时间与已运行时间是否相等,若相等则表示进程结束,进程退出调度,释放资源。因只需了解其算法故,本实验只模拟进程的时间片轮转算法不实际运行进程。3.实验过程和步骤(1) 假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。进程控制块的格式为: 进程名 指针 要求运行时间 已运行时间 状态 其中,进程名作为进程的标识,假设五个进程的进程名分别为Q1,Q2,Q3,Q4,Q5。 指针进程按顺序排成循环队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程的指针指出第一个进程的进程控制块首地址
3、。 要求运行时间假设进程需要运行的单位时间数。 已运行时间假设进程已经运行的单位时间数,初始值为“0”。 状态有两种状态,“就绪”和“结束”,初始状态都为“就绪”,用“R”表示。当一个进程运行结束后,它的状态为“结束”,用“E”表示。(2) 每次运行所设计的处理器调度程序前,为每个进程任意确定它的“要求运行时间”。 (3) 把五个进程按顺序排成循环队列,用指针指出队列连接情况。另用一标志单元记录轮到运行的进程。例如,当前轮到P2执行,则有: (4) 处理器调度总是选择标志单元指示的进程运行。由于本实习是模拟处理器调度的功能,所以,对被选中的进程并不实际的启动运行,而是执行: 已运行时间+1 来
4、模拟进程的一次运行,表示进程已经运行过一个单位的时间。当一个进程被选中运行时,必须置上该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片 (5) 进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。同时,应判断该进程的要求运行时间与已运行时间,若该进程的要求运行时间已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应指导它的状态修改成“结束”(E)且退出队列。此时,应把该进程的进程控制块中的指针值送到前面一个进程的指针位置。 (6) 若“就绪”
5、状态的进程队列不为空,则重复上面的(4)和(5)的步骤,直到所有的进程都成为“结束”状态。 (7) 在所设计的程序中应有显示或打印语句,能显示或打印每次选中进程的进程名以及运行一次后进程队列的变化。 (8) 为五个进程任意确定一组“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中的进程名以及进程控制块的动态变化过程。 本程序主要是实现对时间片轮转法调度算法的模拟,假定系统有五个进程 将五个进程按顺序拍成循环队列,处理器按顺序选择进程执行,当执行后若没有结束则进程的优先级变为最低下论循环时再运行,若结束则退出队列。 程序先用void InitPCB(Proc &H)void In
6、itPCB(Proc &H)void InitPCB(Proc &H)void InitPCB(Proc &H)函数从键盘输入读取进程需要运行的时间和初始化队列及进程控制块PCB,调用时间片轮转函数void SJP_Simulatovoid SJP_Simulatovoid SJP_Simulatovoid SJP_Simulator(Proc r(Proc r(Proc r(Proc &H)&H)&H)&H)模拟执行时间片处理机对进程的调度,然后调用void DispInfo(Proc H)void DispInfo(Proc H)void DispInfo(Proc H)void Disp
7、Info(Proc H)函数输出每次执行的结果。进程的数据结构如下: typedef struct PNode struct PNode *next; char name10; int All_Time; int Runtime; char state;* Proc;int ProcNum;主函数main()调用各个子函数实现本程序的功能如:数据初始化InitPCB(H),输出此刻的进程状态DispInfo(H),时间片轮转法,SJP_Simulator(H)子函数的说明如下: 初始化就绪队列 void InitPCB(Proc &H) coutProcNum; int Num=ProcNum
8、; H=(Proc)malloc(sizeof(PNode);H-next=NULL; Proc p=H; cout总进程个数为 ProcNumnext=(Proc)malloc(sizeof(PNode); coutp-namep-All_Timep-Runed_Time; p-state=R; p-next=NULL; p-next=H-next; /- void DispInfo(Proc H) Proc p=H-next; do if (p-state != E) cout进程名:namet总运行时间:All_Timet已运行时间:Runed_Time t状态:statenext; e
9、lse p=p-next; while (p != H-next); /时间片轮转法 VoidSJP_Simulator(Proc&H) coutendlnext; while (p-All_Time p-Runed_Time) round+; coutendlRound round-正在运行 name 进程Runed_Time+; DispInfo(H); if (p-All_Time = p-Runed_Time) p-state=E; flag-; coutnamenext; while(flag&p-All_Time=p-Runed_Time) p=p-next; coutendl-E
10、ND-n; 调试分析调试分析调试分析调试分析: 本次试验主要是实现处理器按照时间片轮转法实现调度,按照设计思想是在设定的时间片内某一进程在时间片内运行,当时间片到后,进入下一个进程再次按照时间片轮转法调度,就按照这个循环一直运行下去,如果某一个进程时间结束就跳出队列,跳向下一个进程,直到所有的进程都结束,本程序结束。 运行程序后,实现了上述所有的功能,虽然只是简单的实现,但是也符合了本次课程设计的基本要求。在时间片上,进程是按照这个实行调度的,直到所有进程都结束了,那么本程序就结束.使用说明使用说明使用说明使用说明: 程序中数据的输入格式为: 1) 输入进程总数 2) 输入各进程信息 3) 进
11、程信息的输入格式为:进程名 总运行时间 已运行时间 4) 输入结束回车运行 5) 结果分析与实验体会结果分析与实验体会结果分析与实验体会结果分析与实验体会 6) 时间片轮转算法中,系统将所有的就绪程序按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。当执行的时间片用完时,调度程序停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。实验21、 实验目的: 应用银行家算法验证进程安全性检查及分配资源。 2、 实验内容: 编制模拟银行家算法的程序,并以以下例子验证程序的正确性。 3、实验步骤: 1
12、) 根据算法流程图编制可执行程序 2)用以下两个例子验证程序的正确性。3)按照上述两个例子,输出执行的结果。#include #define N 20 #define M 20 int f(int aNM,int bNM,int m,int k) int j; for(j=0;jbk-1j)return 0; return 1; int g(int aNM,int b,int m,int k) int j; for(j=0;jbj)return 0; return 1; int h(int a,int n) for(int i=0;in;i+) if(!ai)return 0; return
13、1; int p(int a,int bNM,int m,int k) int j; for(j=0;jbk-1j)return 0; return 1; int q(int a,int b,int m) int j; for(j=0;jbj)return 0; return 1; int safe(int FinishN,int WorkM,int NeedNM,int AllocationNM,int n,int m) int i,j,k; int tN;for(i=0;in;i+) ti=1; cout安全性检查!endl; for(i=0;in;) if(Finishi=0)&g(Ne
14、ed,Work,m,i) k=i; ti=0; coutp(k+1):endl; coutWorkm:; for(j=0;jm;j+) coutWorkj; Workj=Workj+Allocationij; Finishi=1; coutendl; coutNeedm:; for(j=0;jm;j+) coutNeedij ;coutendl; coutAllocationm:; for(j=0;jm;j+) coutAllocationij ; coutendl; cout(Work+Allocation)m:; for(j=0;jm;j+) coutWorkj ; coutendl; c
15、outFinishk+1:; coutFinishi ; coutendl; break; else i+; if(g(Need,Work,m,k) for(i=0;in;i+) if(ti) if(g(Need,Work,m,i) coutp(i+1):endl; coutWorkm:; for(j=0;jm;j+) coutWorkj; Workj=Workj+Allocationij; Finishi=1; coutendl; coutNeedm:; for(j=0;jm;j+) coutNeedij ; coutendl; coutAllocationm:; for(j=0;jm;j+
16、) coutAllocationij ; coutendl; cout(Work+Allocation)m:; for(j=0;jm;j+) coutWorkj ; coutendl; coutFinishi+1:; coutFinishi ; coutendl; ti=0; else return 0; if(h(Finish,n)return 1; else return 0; void r(int FinishN,int WorkM,int AvailableM,int NeedNM,int AllocationNM,int MaxNM,int n,int m) int RequestM
17、; char b; int i,j,k; coutn要申请资源,请按y或Y,否则按n或Nb; if(b!=y&b!=Y) if(safe(Finish,Work,Need,Allocation,n,m) cout此时刻系统安全!n; else cout此时刻系统不安全!n; else coutn请输入申请资源的进程编号(1,2,n):k; while(kn) cout您输入了错误的进程号,请核查后重新输入:k; coutn请输入进程p(k)申请各类资源的数量:endl; for (j=0; jRequestj; if(p(Request,Need,m,k) if(q(Request,Avail
18、able,m) for(j=0;jm;j+) Availablej=Availablej-Requestj; Allocationk-1j=Allocationk-1j+Requestj; Needk-1j=Needk-1j-Requestj; Workj=Availablej; cout试分配!endl; cout各种资源可利用的数量Availablem: endl; for(j=0;jm;j+) coutAvailablej ; coutendl; coutn已分配资源Allocationm: endl; for (i=0; in; i+) for(j=0;jm;j+) coutAlloc
19、ationij ; coutendl; coutn最大需求矩阵Maxnm: endl; for (i=0; in; i+) for(j=0;jm;j+) coutMaxij ; coutendl; coutn需求矩阵Neednm: endl; for (i=0; in; i+) for(j=0;jm;j+) coutNeedij ; coutendl; if(safe(Finish,Work,Need,Allocation,n,m) cout系统处于安全状态!; coutn申请资源成功!endl; else coutn当前状态不安全!; for (j=0; jm; j+) Availablej
20、=Availablej+Requestj; Allocationk-1j=Allocationk-1j-Requestj; Needk-1j=Needk-1j+Requestj; Workj=Availablej; for(i=0; in; i+) Finishi=0; coutn恢复数据:endl; cout各种资源可利用的数量Availablem: endl; for(j=0;jm;j+) coutAvailablej ; coutendl; coutn已分配资源Allocationm: endl; for (i=0; in; i+) for(j=0;jm;j+) coutAllocati
21、onij ; coutendl; coutn最大需求矩阵Maxnm: endl; for (i=0; in; i+) for(j=0;jm;j+) coutMaxij ; coutendl; coutn需求矩阵Neednm: endl; for (i=0; in; i+) for(j=0;jm;j+) coutNeedij ; coutendl; cout系统中尚无足够的资源满足进程pk的申请,pk必须等待!endl; else cout出错,进程所需要的资源数目已超过它所宣布的最大值!endl; Void main() cout-endl; cout-模拟银行家算法-endl; cout-e
22、ndl; cout-江之风海之韵-endl; cout-QuQu-endl; cout-endl; int AvailableM; int MaxNM; int AllocationNM; int NeedNM; int WorkM; int FinishN; int i,j,n,m; coutn; coutm; cout输入各种资源可利用的数量Availablem: endl; for (j=0; jAvailablej; Workj=Availablej;/初始化Workj coutn输入各进程对各类资源的最大需求数Maxnm: endl; coutn请严格按照(nm)的距阵输入:endl
23、; for (i=0; in; i+) for (j=0; jMaxij; coutn请输入各进程当前已分配的资源数量Allocationnm: endl; coutn请严格按照(nm)的距阵输入:endl; for (i=0; in; i+) Finishi=0; for(j=0;jAllocationij; Needij= Maxij-Allocationij; r(Finish,Work,Available,Need,Allocation,Max,n,m); for(i=0;in;i+) Finishi=0; r(Finish,Work,Available,Need,Allocation,Max,n,m); for(i=0;in;i+) Finishi=0; r(Finish,Work,Available,Need,Allocation,Max,n,m); for(i=0;in;i+) Finishi=0; r(Finish,Work,Available,Need,Allocation,Max,n,m); for(i=0;in;i+) Finishi=0;成绩评定:1、 根据实验情况和实验报告质量作出写事性评价2、 评分 综合评分折合成等级指导教师签名:时间: 年 月 日班级实验报告提交情况统计表序号课程名称班级名称应交份数实交份数教师签名日期备注-第 31 页-