欢迎来到装配图网! | 帮助中心 装配图网zhuangpeitu.com!
装配图网
ImageVerifierCode 换一换
首页 装配图网 > 资源分类 > DOC文档下载
 

操作系统课程设计-进程调度的模拟实现

  • 资源ID:67354437       资源大小:420KB        全文页数:21页
  • 资源格式: DOC        下载积分:20积分
快捷下载 游客一键下载
会员登录下载
微信登录下载
三方登录下载: 微信开放平台登录 支付宝登录   QQ登录   微博登录  
二维码
微信扫一扫登录
下载资源需要20积分
邮箱/手机:
温馨提示:
用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

操作系统课程设计-进程调度的模拟实现

精选优质文档-倾情为你奉上课程设计题目 进程调度算法模拟编程 学生姓名 学号 专 业 计算机科学与技术 班级 指导教师 完成日期2012年12月18日进程调度的模拟实现摘要:进程管理是操作系统中的重要功能,用来创建进程、撤消进程、实现进程状态转换,它提供了在可运行的进程之间复用CPU的方法。在进程管理中,进程调度是核心,因为在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态,当就绪进程个数大于处理器数目时,就必须依照某种策略决定哪些进程优先占用处理器。本文通过两种算法模拟实现了进程之间的调度。关键词:进程创建,先来先服务,优先级调度。一前言在操作系统中,调度的实质是一种资源分配,调度算法即指:根据系统的资源分配策略所规定的资源分配算法。对于不同的系统和系统目标,通常采用不同的调度算法,如在批处理系统中,为照顾为数众多的短作业,采用短作业有限调度算法;在分时系统中,为保证系统具有合理的响应时间,采用轮转法进行调度。采用算法时,则要考虑多方面因素,以便达到最佳效果。做好这个课程设计,有利于加深对操作系统进程调度知识的理解。二. 系统总体框架设计本程序采用两种算法(最高优先级数优先的调度算法和先来先服务算法)对多个进程进行调度,每个进程有三个状态,初始状态为就绪状态。最高优先级数优先的调度算法中,程序的某进程运行时间以时间片为单位计算。各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。在优先级数优先的调度算法中,优先级数的值设计为100与运行时间的差值,即Pro_time-process->needtime。进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1。对于遇到优先数一致的情况,采用先来先服务策略解决。程序设计组成框图数据项作用pro_name进程名称time_submit进程创建时刻pro_id进程号,当进程有相同名称时,用来区分进程time_start进程启动时刻time_exe进程要求运行时间time_end进程结束的时刻pro_priority进程优先级图1-2 进程控制块CpuModel类成员作用Cpurun()Cpu模拟运行函数CreatePcb()进程创建函数ShowPcb()进程显示函数PriModel()实现优先级调度算法FcfsModel()实现先来先服务算法pcbnum进程数量freetimeCpu空闲时间allturn总周转时间allaver总带权周转时间PcbList进程就绪队列的实现图1-3CpuModel类开始程序流程图创建进程及属性先来先服务算法优先数调度算法显示进程执行状态结束1.可强占优先调度算法实现过程流程图: 2先来先服务调度算法实现过程流图三 数据结构设计1.设计创建进程的结构类型定义和结构变量说明struct ProcessPcb,定义PCB相关变量: ProcessPcb()next=NULL;char pro_name20; /进程的名字int time_submit ; /提交时间,从时间为1开始计时int time_exe ; /进程所需的运行时间 int pro_id ; /进程ID(系统生成)int pro_priority ; /进程优先级int time_start ; /开始执行的时间int time_end ; /结束的时间 int time_wait ; /等待的时间int pro_state ; /进程的状态 (就绪,执行,完成)int time_left ; /还需多少时间单位,初始化为所需的执行时间int time_turn ; /周转时间double time_aver ; /带权周转时间2.创建PCB类class CpuModel,定义程序中使用的各函数:CpuModelCpuModel()pcbnum=0; void cpurun(); /cpu模拟运行函数bool GetPcb(); /进程输入函数void ShowPcb(); /将输入的进程展示出来void PriModel(); /可强占的优先进程调度模式void FcfsModel(); /先到先服务调度模式ProcessPcb PcbList100;/按提交时间排的未就绪进程队列()四 测试结果及分析 1.开始运行,显示: 2.输入进程数,各进程属性: 关于提交时间执行时间等,将检测输入是否数字,不是数字即退出程序。 3.显示已创建的各进程及其属性:此处的优先级数,是用100减去执行时间。对于优先级数相同,则默认FIFO。4.测试可强占的优先进程调度:一次调度完成,将计算此次运行中CPU的利用率。 5. 先到先服务调度算法运行情况: 6. 选择5,回车,退出程序。五设计心得在学完操作系统课程之后,一直对进程调度这一块不是很理解,借着做课程设计的机会,我就选择了进程调度模拟编程这个题目,打算在做课程设计的过程中好好的再学习一下这块的知识。我在做课程设计的过程中,遇到了许多的问题,通过请教同学,上网查资料等途径一一解决。通过这次操作系统的课程设计,我研究了进程调度的相关知识,加深了对进程调度的理解。课程设计和平时的实验课比较起来有很大的差距,实验课只是将这一章的一部分内容练习操作一遍,而课程设计需要的是他们综合起来的东西,这要更难一些。总体来说我认为操作系统这门学科在计算机科学当中是非常重要的,这次操作系统的课程设计收获颇丰,复习了许多东西,也从新学会了许多东西,我想这也许就是课程设计的最终目的吧。参考文献1刘振安、刘燕君著.C+程序设计课程设计.北京: 机械工业出版社,20042美Abraham Silberschatz, Peter Baer Galvin, Greg Gagne 著. 郑扣根 译. 操作系统概念(第六版). 北京: 高等教育出版社,20043陈向群,向勇 等. Windows操作系统原理(第二版). 北京:机械工业出版社,2004.4费翔林,李敏,叶保留等.Linux操作系统实验教程.北京:高等教育出版社,2009附录:#include <iostream.h>#include <queue>#include <string>#include <windows.h> #include <malloc.h>using namespace std ; /进程的状态#define UNREADY 0 /未就绪#define READY 1 /就绪#define EXECUTE 2 /执行#define END 3 /完成 /进程的PCB结构类型定义和结构变量说明struct ProcessPcb ProcessPcb() next=NULL; char pro_name20; /进程的名字 int time_submit ; /提交时间,从时间的1开始计时 int time_exe ; /进程所需的运行时间 int pro_id ; /进程ID(系统生成) int pro_priority ; /进程优先级 int time_start ; /开始执行的时间 int time_end ; /结束的时间 int time_wait ; /等待的时间 int pro_state ; /进程的状态 (就绪,执行,完成) int time_left ; /还需多少时间单位,初始化为所需的执行时间 int time_turn ; /周转时间 double time_aver ; /带权周转时间 ProcessPcb *next; /封装CPU调度与分配程序模块。进程类class CpuModelpublic:CpuModel()pcbnum=0;void cpurun(); /cpu模拟运行函数bool CreatePcb(); /进程输入函数void ShowPcb(); /将输入的进程展示出来void PriModel(); /可强占的优先进程调度模式void FcfsModel(); /先到先服务调度模式private:ProcessPcb PcbList100; /按提交时间排的未就绪进程队列int pcbnum ; /进程数量int freetime ; /cpu空闲时间int allturn ; /总周转时间float allaver ; /总带权周转时间;#include<algorithm> /cpu模拟运行函数void CpuModel:cpurun() int choose = 0 ; while(1) cout<<"* 主菜单 *"<<endl;cout<<"-"<<endl;cout<<"* 1: 创建进程 *"<<endl;cout<<"* 2: 显示已创建的进程 *"<<endl;cout<<"* 3: 可强占的优先进程调度 *"<<endl;cout<<"* 4: 先到先服务调度 *"<<endl;cout<<"* 5: 退出系统 *"<<endl;cout<<"n* 请选择 : " ;cin>>choose ;cout<<endl ; switch(choose) case 1:CreatePcb(); /创建进程break;case 2:ShowPcb(); /显示已创建的进程break;case 3: PriModel(); /可强占的优先进程方式 break; case 4: FcfsModel(); /先到先服务调度方式 break;case 5:return ; /结束程序 cout<<endl; /按进程提交时间排序的比较函数bool cmp(ProcessPcb a,ProcessPcb b) if(a.time_submit<b.time_submit) return true; return false; /判断是否数字int isnumber(char a) int len=strlen(a); int i,num=0; if(a0>'0'&&a0<='9') num=a0-'0' else return -1; for(i=1;i<len;i+) if(ai>='0'&&ai<='9') num=num*10+ai-'0' else return -1; return num; /进程输入函数bool CpuModel:CreatePcb() char num10; cout<<"n*请输入你想建立的进程个数: " cin>>num; /输入进程个数 pcbnum=isnumber(num); if(pcbnum<=0) cout<<"*输入有错*n" return 0; int i; for(i=0;i<pcbnum;i+) /输入进程信息 cout<<"*请依次输入第"<<i+1<<"个进程的信息*"<<endl ; cout<<"*名字:" ; cin>>PcbListi.pro_name ; cout<<"*提交时间:" cin>>num; PcbListi.time_submit=isnumber(num); if(PcbListi.time_submit<=0)cout<<"*输入有错*n" return 0; cout<<"*执行时间:" cin>>num; PcbListi.time_exe=isnumber(num); if(PcbListi.time_exe<=0) cout<<"*输入有错*n" return 0; PcbListi.time_left=PcbListi.time_exe; /设置剩余执行时间 PcbListi.pro_state=UNREADY; /设置状态为未就绪 PcbListi.pro_priority=100-PcbListi.time_exe; /设置优先级,优先级=100-执行时间 cout<<endl ; sort(PcbList,PcbList+pcbnum,cmp); /按提交时间排序 for(i=0;i<pcbnum;i+) PcbListi.pro_id=i+1; /设置Id,根据提交时间 return 1; /展示所需执行进程信息void CpuModel:ShowPcb() int i; cout<<"n*所需执行的进程信息如下*n" for(i=0;i<pcbnum;i+) cout<<" 进程编号: "<<PcbListi.pro_id<<" 进程名字: " <<PcbListi.pro_name<<" 提交时间: "<<PcbListi.time_submit <<" 执行时间: "<<PcbListi.time_exe<<" 优先级数:" <<PcbListi.pro_priority<<endl ; cout<<endl; /可强占的优先进程调度模式void CpuModel:PriModel() cout<<"*可强占的优先进程调度过程如下*n" freetime=0; /初始化系统空闲时间为0 int time=0; /时间 int nextid=0; int pnum=0; /已就绪进程数目 ProcessPcb *head; /就绪队列 ProcessPcb *pcb,*pcb1,*pcb2;head=(ProcessPcb*)malloc(sizeof(ProcessPcb); head->next=NULL; /head 指针不用,head->next开始为就绪队列 /模拟cpu开始工作 while(head->next!=NULL|pnum<pcbnum) Sleep(1000); time+; /时间片为1cout<<"*Time: 第"<<time<<"秒"<<endl; /打印 / 进程就绪(查看未就绪的进程中在该时间片是否可以进入就绪队列) while(pnum<pcbnum && PcbListpnum.time_submit<=time) pcb=(ProcessPcb*)malloc(sizeof(ProcessPcb);*pcb=PcbListpnum+;/进入就绪队列 pcb->next=head->next; /插在head之后 head->next=pcb; /查找在time时间片应该运行的进程 if(head->next=NULL) cout<<" 没有可运行的进程"<<endl; freetime+; else pcb2=head; pcb=head->next; pcb1=head->next;/查找当前优先级最高的就绪进程 while(pcb1->next!=NULL) if(pcb->pro_priority<=pcb1->next->pro_priority) pcb2=pcb1;pcb=pcb1->next; pcb1=pcb1->next; /运行优先级最高的进程 if(pcb->time_left=pcb->time_exe) /该进程是否已开始pcb->time_start=time; /设置开始时间 pcb->pro_state=EXECUTE; /设置状态为执行 pcb->pro_priority=pcb->pro_priority-3; /优先级数减3 pcb->time_left-; /剩余执行时间减去时间片1/打印该进程信息 cout<<" 进程编号: "<<pcb->pro_id<<" 进程名字:" <<pcb->pro_name<<" 提交时间: " <<pcb->time_submit<<" 执行时间: "<<pcb->time_exe <<"n开始时间: "<<pcb->time_start <<" 还剩时间: "<<pcb->time_left<<" 优先级数:" <<pcb->pro_priority<<endl ;/该进程是否执行结束 if(pcb->time_left=0) pcb2->next=pcb2->next->next;/将其在就绪队列中出列 pcb->time_end=time; /设置结束时间 pcb->time_turn=pcb->time_end-pcb->time_submit+1; /计算周转时间 pcb->time_aver=pcb->time_turn/(double)pcb->time_exe;/计算带权周转时间 pcb->pro_state=END; cout<<"n进程"<<pcb->pro_id<<"运行结束:"<<"n进程名字: " <<pcb->pro_name<<" 提交时间: " <<pcb->time_submit<<" 执行时间: " <<pcb->time_exe<<" 开始时间: " <<pcb->time_start <<" 结束时间: "<<pcb->time_end<<"n周转时间: " <<pcb->time_turn<<"带权周转时间: " <<pcb->time_aver<<endl ; /模拟CPU工作结束 cout<<"n 所有进程运行完毕!"<<endl; double c=(time-freetime)/(double)time*100; cout<<"n cpu利用率:"<<c<<"%"<<endl; /可强占的优先进程调度模式结束 /先到先服务调度模式void CpuModel:FcfsModel() cout<<"*先到先服务进程调度过程如下*n" freetime=0; /初始化系统空闲时间为0 int time=0; /时间 int pnum=0; /已就绪进程数目 ProcessPcb que100; /就绪队列 int quef=0,quee=0; /就绪队列的头指针和尾指针 /模拟cpu开始工作 while(quef<quee|pnum<pcbnum) Sleep(1000); time+; /时间片为1 cout<<"*Time: 第"<<time<<"秒"<<endl; /打印 /进程就绪(查看未就绪的进程中在该时间片是否可以进入就绪队列) while(pnum<pcbnum && PcbListpnum.time_submit<=time) quequee+=PcbListpnum+; /查找time时间片的运行进程 if(quef=quee) cout<<" 没有可运行的进程"<<endl; freetime+; else /运行进程 if(quequef.time_left=quequef.time_exe) /该进程是否已开始 quequef.time_start=time; /设置开始时间 quequef.pro_state=EXECUTE; /设置状态为执行 quequef.time_left-; /剩余执行时间减去时间片1 /打印进程信息 cout<<"进程编号: "<<quequef.pro_id<<" 进程名字: " <<quequef.pro_name<<" 提交时间: " <<quequef.time_submit<<" 执行时间: "<<quequef.time_exe <<"n开始时间: "<<quequef.time_start<<" 还剩时间: " <<quequef.time_left<<endl ; /该进程是否执行结束 if(quequef.time_left=0) quequef.time_end=time; quequef.time_turn= quequef.time_end-quequef.time_submit+1; quequef.time_aver= quequef.time_turn/(double)quequef.time_exe; quequef.pro_state=END; cout<<"n进程"<<quequef.pro_id<<"运行结束:"<<"n进程名字: " <<quequef.pro_name<<" 提交时间: " <<quequef.time_submit<<" 执行时间: " <<quequef.time_exe<<" 开始时间: " <<quequef.time_start<<" 结束时间: " <<quequef.time_end<<"n周转时间: "<<quequef.time_turn <<" 带权周转: "<<quequef.time_aver<<endl ; quef+; /pcb出队列 / CPU模拟结束cout<<"n所有进程运行完毕!"<<endl;double c=(time-freetime)/(double)time*100;cout<<"ncpu利用率:"<<c<<"%"<<endl;/主函数int main()cout<<" * 进程调度模拟程序*n"cout<<"-n"cout<<" *专业:计算机科学与技术软件工程班*n"cout<<"* 学号:*n"cout<<" *姓名: 张洪*n"cout<<" *指导老师: 张莉莉*n"cout<<" -n" cout<<" n" cout<<" n" CpuModel cpu; cpu.cpurun(); return 0;专心-专注-专业

注意事项

本文(操作系统课程设计-进程调度的模拟实现)为本站会员(94****0)主动上传,装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知装配图网(点击联系客服),我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!