ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:557.38KB ,
资源ID:11672838      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11672838.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统实验指导4.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

操作系统实验指导4.docx

1、操作系统实验指导4实验四 带优先级的时间片轮换的进程调度算法的实现实验学时:2实验类型:设计实验要求:必修一、实验目的(1)掌握进程状态转换过程(2)掌握时间片轮转的进程调度算法;(3)掌握带优先级的进程调度算法;二、实验内容(1)自定义PCB的数据结构;(2)使用带优先级的时间片轮转法调度进程,每运行一个时间片,优先级减1。(3)命令集A)create 随机创建进程,进程的优先级与所需要的时间片随机决定;B)round 执行1次时间片轮转操作,其方法为运行高优先级队列的第1个,再降低其优先级,插入到相应的队列中。C)ps 查看当前进程状态D)sleep 命令将进程阻塞E)awake 命令唤醒

2、1个被阻塞的进程F)kill 命令删除进程G)quit命令退出(4)选用面向对象的编程方法。三、实验原理或算法本实验结合了进程状态转换、优先级调度、时间片轮转调度三方面的内容,根据进程状态转换图,设置SLEEP命令,将1个进程阻塞,AWAKE命令唤醒1个被阻塞的进程(从阻塞状态到就绪状态)。1) 优先级优先级体现了进程的重要程度或紧迫程度,在大多数现代操作系统中,都采用了优先级调度策略。在本实验中按数值大小决定优先级,数值大的优先级高(如 0-2)。2) 基于时间片调度将所有的就绪进程按照先来先服务的原则,排成一个队列,每次调度时,将 cpu 分配给队首进程,并令其执行一个时间片。当时间片用完

3、时,由一个计时器发出时钟中断请求,调度程序把此进程终止,并放到其他队列的队尾。在该实验中,时间片以 QUANTUM=2为单位进行模拟。在调度过程中,需要循环模拟进程的执行时间,当该进程执行时间时间片大小时,进行调度。3) 高优先级调度优先级高的进程优先得到 cpu,等该进程执行完毕后,另外的进程才能执行。4) 基于时间片的高优先级调度在调度算法中,只有处于就绪状态的进程才能被调度,调度算法结合了优先级调度和时间片轮转调度算法,约定:从最高优先级队列取第1个就绪状态的进程进行调度,时间片到后降低其优先级(减半),然后插入到低优先级队列的尾部,每次调度后,显示进程的状态。四、程序清单#includ

4、e #include #include /#include #include /定义进程数#define LEN 10/定义最高优先级#define MAXPIOR 3/ 定义时间片#define QUANTUM 2#define PCB sizeof(struct pcb)struct pcb /PCBint ident;/标识符 int state;/状态 0-就绪,1运行,2堵塞 int pior;/优先级,MAXPIOR为最高优先级*/ int life;/生命期*/ struct pcb *next;/*指针*/ *arrayMAXPIOR;/ 定义优先级队列static int i

5、dlistLEN;/*标识符表,标识进程是否被创建,0为未创建*/int life=0;/*总生命期初始化为0*/char str20;char command710;void init();int create();void kill(int x);void process();void round();void ps();/初始化命令void init() int i=0; for (i=0;iMAXPIOR;i+) arrayi=NULL; sprintf(command0,quit); sprintf(command1,ps); sprintf(command2,create); sp

6、rintf(command3,kill); sprintf(command4,round); sprintf(command5,sleep); sprintf(command6,awake);/创建进程int create() int i=0,pior=0; struct pcb *p,*q,*s; while (idlisti!=0&iident=i; s-state=0; s-pior=pior; s-life=1+rand()%20;/进程有生命期假设为120 s-next=NULL; life=life+(s-life); p=arraypior;/建立同优先级队列(链表) if (p

7、=NULL) arraypior=s; else while(p!=NULL) q=p; p=p-next; q-next=s; printf(success create process id=%d, current process state disp below:n,s-ident); ps(); /printf(end displayn); return 1;/显示每个优先级队列中的所有进程信息void ps()int i=0; struct pcb *p; for (i=0;iident,p-state,p-pior,p-life); p=p-next; /阻塞进程void slee

8、p(int x)/寻找X所在指针,提示:参考kill(int x)函数/如果找不到,输出错误信息,如果找到,修改p-state的状态/显示每个优先级队列中的所有进程信息int i=0,test=0; struct pcb *p=NULL,*q=NULL; while(test=0&i!=MAXPIOR)/ p=arrayi; if (i!=MAXPIOR & p=NULL) i+;continue; while(p!=NULL) if (p-ident=x) test=1;break; else q=p;p=p-next; if (test=0) i+; /*寻找X所在指针*/ if(i=MA

9、XPIOR) printf(Invaild process number); else if(p-state=2) printf(the process %d has blocked,cannot sleep again,p-ident); else p-state=2; ps();void awake(int x)/代码同sleep(int x)函数/寻找X所在指针,提示:参考kill(int x)函数/如果找不到,输出错误信息,如果找到,修改p-state的状态/显示每个优先级队列中的所有进程信息int i=0,test=0; struct pcb *p=NULL,*q=NULL; whi

10、le(test=0&i!=MAXPIOR)/ p=arrayi; if (i!=MAXPIOR & p=NULL) i+;continue; while(p!=NULL) if (p-ident=x) test=1;break; else q=p;p=p-next; if (test=0) i+; /*寻找X所在指针*/ if(i=MAXPIOR) printf(Invaild process number); else if(p-state=0) printf(the process %d has blocked,cannot awake again,p-ident); else p-sta

11、te=0; ps();void kill(int x)int i=0,test=0; struct pcb *p=NULL,*q=NULL; while(test=0&i!=MAXPIOR)/ p=arrayi; if (i!=MAXPIOR & p=NULL) i+;continue; while(p!=NULL) if (p-ident=x) test=1;break; else q=p;p=p-next; if (test=0) i+; /*寻找X所在指针*/ if (i=MAXPIOR) /找不到X所在指针 printf(Invaild process number.); else /

12、找到X所在指针,则将其从优先级队列中删除 if (p=arrayi) arrayi=arrayi-next; idlistx=0; free(p); else q-next=p-next; idlistx=0; life=life-(p-life); free(p); /对输入命令的处理void process()int i=0,ii=0; for (i=0;i=0&arrayi=NULL) i=i-; if(istate!=0) pr=r; r=r-next; i-; while(r=NULL); printf(the one in the highest piror process wil

13、l execute 1 quantum.); r-state=1; printf(process id=%d is running,r-ident); /从高优先队列开始,队列中寻找一个就绪进程以调度它,让其执行一个时间片 /执行过程: /首先让进程处于运行状态,并给出“第x个进程正在运行”的提示信息 /其次,用下面用循环模拟延时,自己也可以采用其他方法 for (int k=1;k600000;k+) for(int k1=1;k1pior = (r-pior)/2; r-state=0; if(r-life-QUANTUM0) r-life=r-life-QUANTUM; life=lif

14、e-QUANTUM; else life=life-r-life; r-life=0; if(r-life=0) printf(the process %d has success run and release it,r-ident); kill(r-ident); else if(pr=r) arrayi+1=r-next; else pr-next=r-next; t=r-pior; pp=arrayt; qq=NULL; while(pp!=NULL) qq=pp; pp=pp-next; if(qq=NULL) arrayt=r; else qq-next=r; r-next!=NU

15、LL; printf(after.); ps(); printf(n 1 quantum seccessful run!n);/运行结束,并给出“第x个进程运行结束”的提示信息/将进程优先级减半/让进程处于就绪状态/将进程的生命期减少,此时需要判断,如果该进程当前生命期QUANTUM,/则直接减去一个时间周期QUANTUM,否则,直接将进程当前生命期减为0/进程的生命期为0,说明进程运行完成,KILL它,/否则,将该进程结点从原队列中删除,并将其加入到相应低优先级队列中的最后/调用ps()输出运行一个周期后,所有优先级队列中的所有进程信息/输出信息,提示一个周期成功运行/*int main()

16、init(); printf(Welcome to the Process Scheduling system. This program simulate the Round-Robin with piror Scheduling alogrithm. n); printf(c:); scanf(%s,str); process(); while (strcmp(str,quit)!=0) printf(nc:); scanf(%s,str); process(); 五、实习报告要求:1. 代码补充: 请利用提供的代码框架补充代码,完成sleep,awake和round函数。补充代码如上!2.思考题:读懂程序并画出您所用的数据结构简图;至少包含:连续创建进程05的过程中,得到的按优先级存放的结构;3. 对不同的执行结果进行截图,并对截图进行说明,截图至少要包含创建后的初始状态,阻塞部分进程后的状态,再唤醒部分进程后的状态,删除部分进程后的状态,运行1个时间周期、3个时间周期和个5时间周期的各优先级队列的进程状态截图;4. 给出round和sleep,awake函数的代码,本次实习不用单独交代码。补充代码如上!六实验总结本次代码结合老师给的示例以及和同学交流之后完成,通过这次实验我学到了很多。对于时间片轮转有了更深的认识!

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1