




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
进程管理与调度的算法实现一、 实验目的进程调度是处理机管理的核心内容。本设计要求用高级语言编写与调试一个简单的进程调度程序。通过本实验可以加深理解有关进程控制块、进程队列的概念,并体会与了解优先权调度算法与时间片轮转调度算法的具体实施办法。二、 实验内容1 设计进程控制块PCB表结构,分别适用于优先权调度算法与时间片轮转调度算法。2 PCB结构包括以下信息:进程名、进程优先数(或轮转时间片),进程所占用的CPU时间,进程的状态,当前队列指针等。根据调度算法的不同,PCB结构的内容可以作适当的增删。3 建立进程就绪队列。对两种不同算法编制入链子程序。4 编制两种进程调度算法:a)优先数调度;b)时间片轮转调度。允许用户在程序运行时选择使用某一种调度算法。三、 编程工具:C、Java、VC或其它可视化语言平台任选四、 具体设计要求及有关说明选用优先数算法与简单时间片轮转法对五个进程进行调度,每个进程可有三种状态:运行状态(RUN)、就绪状态(READY)与完成状态。并假定初始状态为就绪状态。1 设计进程控制块PCB结构如下:NAME/进程标识符;PRIO/ROUND/ PRIO表示进程优先数,ROUND表示进程轮转时间片大小;CPUTIME/进程占用CPU时间;COUNT/计数器;NEEDTIME/进程到完成还要的CPU时间;STATE/进程的状态;NEXT/链指针2 进程控制块链结构如图所示。READYFINISHRUNTAIL其中:RUN当前运行进程指针;READY就绪队列头指针;TAIL就绪队列尾指针;FINISH完成队列头指针。为了便于处理,程序中进程的运行时间以时间片为单位计算。各进程的优先数或轮转时间片数以及进程需运行的时间片数的初值均由用户给定。3 程序说明:a)在优先数算法中,进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1。在轮转法中,采用固定时间片,时间片数为2,进程每执行一次,CPU时间片数加2,进程还需要的时间片数减2,并排到就绪队列的尾上。b)程序结构说明如下:整个程序由CREATE,FIRSTIN,INSERT1,INSERT2,PRINT,PRISCH与ROUNDSCH过程组成。其中:CREATE的功能是创建新的进程,即创立进程的PCB,并将此PCB链入到就绪队列中去。FIRSTIN的功能是将就绪队列中的第一个进程投入运行。INSERT1的功能是把还未完成且优先数小于别的进程PCB按进程优先数的顺序插入到就绪队列中。INSERT2是轮转法使用的过程,将执行了一个单位时间片数(为2)且还未完成的进程的PCB插入到就绪队列的队尾。PRINT打印每执行一次后的所有进程的状态,这里,就绪(等待)用“W”代表。PRISCH按优先数算法调度进程。ROUNDSCH按时间片轮转法调度进程。c)主程序中定义了PCB的结构与其它变量NUMBER进程数,ALGO为10个字符长的字符串,存放要求输入的算法的名,输入“PRIORITY”表示调用优先数算法,输入“ROUNDROBIN”表示调用循环轮转法,要求用户在程序运行时输入其中的一个。实现代码:#includeiostream #includestring #includecstring #includeiomanip using namespace std; #define N 50 /函数声明 void CREATE(); void INSERT1(struct PCB *,int); void INSERT2(struct PCB *); void INSERT3(struct PCB *); void FIRSTIN(); void PRISCH(); void ROUNDSCH(); void PRINT(); /定义进程PCB struct PCB char NAMEN; int PRIO; int ROUND; int CPUTIME; int COUNT; int NEEDTIME; char STATE; struct PCB *NEXT; ; struct PCB *READY,*TAIL,*RUN,*FINISH; int number; string ALGO; /主函数 int main() string name; int j=0; READY=NULL;TAIL=NULL;RUN=NULL;FINISH=NULL; /初始化各队列 loop: cout*endl; cout* 进程管理与调度 *endl; cout* PRIORITY (优先数法) *endl; cout* ROUNDROBIN (轮转法) *endl; cout* EXIT(退出) *endl; cout*endl; coutALGO; if(ALGO=priority|ALGO=PRIORITY|ALGO=roundrobin|ALGO=ROUNDROBIN) CREATE(); /创建进程PCB cin.get(); /吸收回车符 if(ALGO=priority|ALGO=PRIORITY) PRISCH(); /按优先数法调度进程 else ROUNDSCH(); /按时间片轮转法调度进程 else if(ALGO=exit|ALGO=EXIT) cout退出程序!endl; exit(0); /退出程序 else coutendl输入错误!请重新输入.endlPRIONEXT=READY; READY=q; else pt=READY; while(pt-NEXT!=NULL&pt-NEXT-PRIO=prio) pt=pt-NEXT; if(pt-NEXT=NULL) pt-NEXT=q; TAIL=q; q-NEXT=NULL; else q-NEXT=pt-NEXT; pt-NEXT=q; /按顺序将进程插入到队列队尾 void INSERT2(struct PCB *q) struct PCB *pt; pt=READY; while(pt-NEXT!=NULL) pt=pt-NEXT; pt-NEXT=q; q-NEXT=NULL; /TAIL=q-NEXT; /按顺序将进程插入到完成队列队尾 void INSERT3(struct PCB *q) struct PCB *pt; if(FINISH!=NULL) pt=FINISH; while(pt-NEXT!=NULL) pt=pt-NEXT; pt-NEXT=q; q-NEXT=NULL; else q-NEXT=FINISH; FINISH=q; FINISH-NEXT=NULL; /创建进程PCB void CREATE() struct PCB *p; int i; char nameN; int prio; int round; int needtime; int cputime; coutnumber; /按优先数创建进程 if(ALGO=priority|ALGO=PRIORITY) int k=0; for(i=0;inumber;i+) p=(struct PCB *)malloc(sizeof(struct PCB); cout请输入进程i+1名称(以#结束):; for(k=0;knamek; if(namek=#)break; namek=0; strcpy(p-NAME,name); coutprio; p-PRIO=prio; coutneedtime; p-NEEDTIME=needtime; coutcputime; p-CPUTIME=cputime; p-COUNT=0; p-STATE=W; if(READY!=NULL)INSERT1(p,p-PRIO); else p-NEXT=READY; READY=p; READY-NEXT=NULL; TAIL=p; /按时间片创建进程 if(ALGO=roundrobin|ALGO=ROUNDROBIN) int k=0; for(i=0;inumber;i+) p=(struct PCB *)malloc(sizeof(struct PCB); cout请输入进程i+1名称(以#结束):; for(k=0;knamek; if(namek=#)break; namek=0; strcpy(p-NAME,name); coutneedtime; p-NEEDTIME=needtime; coutround; p-ROUND=round; p-COUNT=0; p-STATE=W; p-CPUTIME=round; if(READY!=NULL)INSERT2(p); else p-NEXT=READY; READY=p; READY-NEXT=NULL; TAIL=p; /将就绪队列第一个进程投入运行 void FIRSTIN() RUN=READY; RUN-STATE=R; READY=READY-NEXT; /打印进程信息 void PRINT() struct PCB *pt; if(ALGO=priority|ALGO=PRIORITY) coutsetw(12)namesetw(10)countsetw(10)cputimesetw(10)needtime; coutsetw(9)priosetw(9)stateendl; if(RUN!=NULL) coutsetw(12)NAMEsetw(9)COUNTsetw(8)CPUTIMEsetw(11)NEEDTIME; coutsetw(9)PRIOsetw(9)STATEendl; pt=READY; while(pt!=NULL) coutsetw(12)NAMEsetw(9)COUNTsetw(8)CPUTIMEsetw(11)NEEDTIME; coutsetw(9)PRIOsetw(9)STATENEXT; pt=FINISH; while(pt!=NULL) coutsetw(12)NAMEsetw(9)COUNTsetw(8)CPUTIMEsetw(11)NEEDTIME; coutsetw(9)PRIOsetw(9)STATENEXT; if(ALGO=roundrobin|ALGO=ROUNDROBIN) coutsetw(12)namesetw(9)countsetw(10)cputimesetw(10)needtime; coutsetw(9)roundsetw(9)stateendl; if(RUN!=NULL) coutsetw(12)NAMEsetw(8)COUNTsetw(9)CPUTIMEsetw(10)NEEDTIME; coutsetw(10)ROUNDsetw(9)STATEendl; pt=READY; while(pt!=NULL) coutsetw(12)NAMEsetw(8)COUNTsetw(9)CPUTIMEsetw(10)NEEDTIME; coutsetw(10)ROUNDsetw(9)STATENEXT; pt=FINISH; while(pt!=NULL) coutsetw(12)NAMEsetw(8)COUNTsetw(9)CPUTIMEsetw(10)NEEDTIME; coutsetw(10)ROUNDsetw(9)STATENEXT; coutendlpress any key to continue.endl; cin.get(); /按优先数法调度进程 void PRISCH() coutendl开始状态.PRIO=RUN-PRIO-3; RUN-NEEDTIME=RUN-NEEDTIME-RUN-CPUTIME; RUN-CPUTIME=RUN-CPUTIME+1; RUN-COUNT=RUN-COUNT+1; PRINT(); if(RUN-NEEDTIME=0) RUN-STATE=F; INSERT3(RUN); RUN=NULL; else RUN-STATE=W; if(READY!=NULL)INSERT1(RUN,RUN-PRIO); else RUN-NEXT=READY; READY=RUN; RUN-NEXT=NULL; RUN=NULL; cout任务已完成.endl; PRINT(); /按时间片轮转法调度进程 void ROUNDSCH() coutendl开始状态.C
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 东莞光伏工程方案(3篇)
- 北京市大兴区2025年中考生物学试卷附真题答案
- 辽阳教师招聘面试题库及答案
- 农业产业链2025年农产品质量安全追溯体系建设策略分析报告
- 安全教育培训通稿课件
- 矿山会计面试题及答案
- 安全教育培训资料课件
- 客服压力面试题库及答案
- 2025年农产品质量安全追溯体系在农产品质量安全监管中的溯源技术人才培养报告
- 2025年新能源行业协同创新新能源产业技术创新平台建设报告
- 2024年四川遂宁川能水务有限公司招聘笔试参考题库含答案解析
- 射频同轴电缆组件市场需求分析报告
- 第1课 社会主义在中国的确立与探索【中职专用】高一思想政治《中国特色社会主义》(高教版2023基础模块)
- 社区工作-徐永祥-高教出版社-全要点课件
- 传统建筑元素在现代建筑中应用
- 王道勇保障和改善民生
- 医疗法律法规知识培训
- 血友病课件完整版
- 临床职业素养
- 种子学-种子的化学成分课件
- 手术室无菌技术 课件
评论
0/150
提交评论