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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

操作系统的进程调度实验报告.docx

1、操作系统的进程调度实验报告计算机操作系统2实验报告 实验一题目:操作系统的进程调度姓名: 学号:12125807 实验日期:2014.12 实验要求:1. 设计一个有n个进程工行的进程调度程序。每个进程由一个进程控制块(PCB)表示。进程控制块通常应包含下述信息:进程名、进程优先数、进程需要运行的时间、占用CPU的时间以及进程的状态等,且可按调度算法的不同而增删。2. 调度程序应包含23种不同的调度算法,运行时可任意选一种,以利于各种算法的分析比较。3. 系统应能显示或打印各进程状态和参数的变化情况,便于观察诸进程的调度过程实验目的:1. 进程是操作系统最重要的概念之一,进程调度又是操作系统核

2、心的主要内容。本实习要求学生独立地用高级语言编写和调试一个简单的进程调度程序。调度算法可任意选择或自行设计。例如,简单轮转法和优先数法等。本实习可加深对于进程调度和各种调度算法的理解。实验内容:1. 编制和调试示例给出的进程调度程序,并使其投入运行。2. 自行设计或改写一个进程调度程序,在相应机器上调试和运行该程序,其功能应该不亚于示例。3. 直观地评测各种调度算法的性能。示例:1 题目 本程序可选用优先数法或简单轮转法对五个进程进行调度。每个进程处于运行R(run)、就绪W(wait)和完成F(finish)三种状态之一,并假设起始状态都是就绪状态W。为了便于处理,程序进程的运行时间以时间片

3、为单位计算。各进程的优先数或轮转时间片数、以及进程需要运行的时间片数,均由伪随机数发生器产生。 进程控制块结构如下:PCB进程标识数链指针优先数/轮转时间片数占用CPU时间片数进程所需时间片数进程状态 进程控制块链结构如下:其中: RUN当前运行进程指针; HEAD进程就绪链链首指针; TAID进程就绪链链尾指针。2 算法与框图(1) 优先数法。进程就绪链按优先数大小从高到低排列,链首进程首先投入运行。每过一个时间片,运行进程所需运行的时间片数减1,说明它已运行了一个时间片,优先数也减3,理由是该进程如果在一个时间片中完成不了,优先级应该降低一级。接着比较现行进程和就绪链链首进程的优先数,如果

4、仍是现行进程高或者相同,就让现行进程继续进行,否则,调度就绪链链首进程投入运行。原运行进程再按其优先数大小插入就绪链,且改变它们对应的进程状态,直至所有进程都运行完各自的时间片数。(2) 简单轮转法。进程就绪链按各进程进入的先后次序排列,进程每次占用处理机的轮转时间按其重要程度登入进程控制块中的轮转时间片数记录项(相当于优先数法的优先数记录项位置)。每过一个时间片,运行进程占用处理机的时间片数加1,然后比较占用处理机的时间片数是否与该进程的轮转时间片数相等,若相等说明已到达轮转时间,应将现运行进程排到就绪链末尾,调度链首进程占用处理机,且改变它们的进程状态,直至所有进程完成各自的时间片。(3)

5、 程序框图如下图所示。实验步骤建立每个进程的数据结构,也就是计算机中的PCB。PCB有以下一些要素构成。 进程ID:用来唯一标识每个进程(本次实验中随机给出) priority:这个属性就在P算法中有用,数字越大优先级越高,每次执行后优先级减3,以此来照顾优先级略小的小作业。 cputime:表示已经占用的cpu时间资源。 needtime:表示距离完成还需要的cpu时间资源,needtime和cputime此消彼长(cputime+needtime=初始的needtime) round:这个属性就在RR算法中有用,表示该进程“已经轮到了多少次”state:表示进程的三个状态:就绪,工作,完成

6、各个进程通过链表链接,指针指向下一个进程的pcb表格实验运行结果:P算法:输入进程数4以后,由srand函数随机给出各个进程的needtime和priority。之后寻找priority最大的优先做,做的过程就是将cputime=cputime+1,needtime=needtime-1做完之后将priority=priority-3,再次开始寻找新的高优先级进程。RR算法: 在输入了进程数3,时间片大小3之后,由srand()函数给出每个函数的needtime。然后从位置靠前的进程开始,工作3个单位时间的cputime,之后cputime=cputime+3,needtime=needtim

7、e-3,若needtime小于3,则置0.,round=round+1.由于同一个时间片只能分配给一个进程,不能分割,因此每个cputime总是时间片大小的整数倍。实验感想: 这个实验在编程上的要求很高,由于在数据结构语法上的不扎实,在实现的时候出处碰壁。在老师给的参考的帮助下,完成了这个实验。在实现的过程中,对于书上概念的理解更加深入。例如pcb在内存中利用链表的数据结构链接,pcb中也有各种进程相关的信息。在模拟真机进程调度的同时,对每一个进程的每一步变化都很清晰。在比较这两个算法时,如果时间片过大,就会浪费时间cpu时间(因为在进程的最后可能只需要时间片的前面一小部分),造成资源浪费。在

8、P算法中,优先级每次减少的数也很关键,若是过小了,不能达到照顾低优先级的小进程的作用,若是过大了,优先级这个属性的作用就不明显了。具体的取值还要参考优先数的大小和进程needtime的大小。思考题:(1) 示例中的程序,没有使用指针型(pointer)数据结构,如何用指针型结构改写本实例,使更能体现C语言的特性。答:将示例程序中的“下一个进程的进程号”把改为int *next;的数据类型,即:struct pcb int id;/进程号 int *next;/下一个进程的进程号 int pri;/进程优先数 int ct;/占用CPU的时间片数 int at;/进程总共所需的时间片数 int

9、state;/进程状态(1.运行、2.就绪、3.完成);(2) 如何在程序中真实地模拟进程运行的时间片?答:通过建立一个time进行自增运算,从而真实地模拟时间片运行。(3) 如果增加进程的“等待”状态,即进程因请求输入输出等问题而挂起的状态,如何在程序中实现?通过增加一个判断语句,if(有请求输入输出)挂起程序,即时间片自增,但是进程需要运行的时间,还有优先级均不变。若没有输入输出,则继续原来的操作。实验源代码:#include #include #include #include #include #include enum state /进程的状态 Ready, Working, Fin

10、ish;struct pcb /PCB数据结构 int pid; int priority; int cputime; int needtime; int round; state process; pcb *next;int timepiece;pcb *get_process() /优先数算法-输入进程个数 int proc; pcb *q; pcb *t; pcb *p; int i=0; cout proc; while (proc10) cout endl Illegal Input! endl endl proc; /cout endl endl Start Scheduling!

11、nn; getch(); srand(unsigned)time(NULL); /初始化随机数种子发生器 while (ipid=rand()%10000; q-needtime=rand()%10+1; q-cputime=0; q-priority=rand()%100; q-process=Ready; q-next=NULL; /利用随机数生成进程信息 if (i=0) p=q; t=q; else t-next=q; t=q; /尾插法建立PCB节点 i+; /while return p;void display(pcb *p) /优先数算法结果输出 coutProcessID C

12、putime Needtime Priority Stateendl; while(p) cout pid; couttt; coutcputime; coutt; coutneedtime; coutneedtime=0) coutDone; else coutpriority; coutprocess) case Ready:coutReadyendl;break; case Working:coutWorking-endl;break; case Finish:coutFinishnext; int process_finish(pcb *q) /判断是否所有进程都已完成,是则返回1 i

13、nt bl=1; while(bl&q) bl=bl&q-needtime=0; q=q-next; return bl;void cpuexe(pcb *q) /优先数算法模拟进程执行函数 pcb *t=q; int tp=-1; while(q) if (q-process!=Finish) /未完成的进程置Ready,完成的进程置Finish q-process=Ready; if(q-needtime=0) q-process=Finish; if(tppriority&q-process!=Finish) /找到下一个优先数最高且未完成的进程 tp=q-priority; t=q;

14、q=q-next; if(t-needtime!=0) /修改正在执行的进程的信息,并置其状态为Working t-priority-=3; if(t-prioritypriority=0; t-needtime-; t-process=Working; t-cputime+; void priority_cal() /优先数算法主控函数 pcb *p; system(cls); p=get_process(); int cpu=0; char key; system(cls); coutCPUTime:cpuendl; display(p); coutendl; getch(); while

15、(!process_finish(p) /当不是所有进程都完成时不断执行进程并显示信息 cpu+; coutCPUTime:cpuendl; cpuexe(p); display(p); coutendl; key=getch(); if(key=q) exit(0); printf(All processes are finished!); getch();pcb *get_process_round() /时间片算法-输入进程个数及CPU时间片 int proc; pcb *q; pcb *t; pcb *p; int i=0; coutproc; while(proc10) couten

16、dlYour process is out of order,please try again!endlendlproc; couttimepiece; while(timepiece5) coutendlIllegal Input!endlendltimepiece; /cout endl endl Start Scheduling!nn; getch(); srand(unsigned)time(NULL); /初始化随机数种子发生器 while (ipid=rand()%10000; q-needtime=rand()%10+1; q-cputime=0; q-round=0; q-pr

17、ocess=Ready; q-next=NULL; if (i=0) /尾插法建立PCB节点 p=q; t=q; else t-next=q; t=q; i+; /while return p;void cpu_round(pcb *p,pcb *q) /时间片算法模拟进程执行函数 while(p) if (p-needtime=0) /完成的进程置Finish,其它置Ready p-process=Finish; if (p-process=Working) p-process=Ready; p=p-next; q-cputime+=timepiece; /修改正在执行进程的信息,并置其状态

18、为Working q-needtime-=timepiece; if(q-needtimeneedtime=0; q-round+; q-process=Working;pcb *get_next(pcb *k,pcb *head) /得到下一个应执行的进程 pcb *t; t=k; do t=t-next; while (t & t-process=Finish); if(t=NULL) t=head; while (t!=k & t-process=Finish) t=t-next; return t;void display_round(pcb *p) /时间片算法输出结果 coutPr

19、ocessID Cputime Needtime Round Stateendl; while(p) cout pid; couttt; coutcputime; coutt; coutneedtime; coutt; coutround; coutprocess) case Ready:coutReadyendl;break; case Working:coutWorking-endl;break; case Finish:coutFinishnext; void round_cal() pcb * p; pcb * r; system(cls); p=get_process_round()

20、; int cpu=0; char key; system(cls); coutCPUTime:cpuendl; display_round(p); coutendl; getch(); r=p; while(!process_finish(p) cpu+=timepiece; cpu_round(p,r); r=get_next(r,p); coutCPUTime:cpuendl; display_round(p); coutendl; key=getch(); if(key=q) exit(0); void display_menu() cout1 Priorityendl; cout2 Round Robinendl; cout3 Exitendl; cout key; switch(key) case 1:priority_cal();break; case 2:round_cal();break; case 3:exit(0); return 0;

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

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