进程调度模拟设计.docx
- 文档编号:9451768
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:25
- 大小:122.73KB
进程调度模拟设计.docx
《进程调度模拟设计.docx》由会员分享,可在线阅读,更多相关《进程调度模拟设计.docx(25页珍藏版)》请在冰点文库上搜索。
进程调度模拟设计
目录
1 设计目的与功能1
1.1设计目的1
1.2设计功能1
2 需求分析,数据结构或模块说明(功能与框图)1
2.1需求分析1
2.2框图2
2.3数据结构和模块说明2
2.3.1主要数据结构2
2.3.2程序中主要函数3
3 源程序的主要部分3
3.1main函数部分3
3.1.1 main函数代码3
3.2进程调度方法部分4
3.2.1时间片轮转法函数代码4
3.2.2时间片轮转法打印函数代码6
3.2.3优先级法函数代码6
3.2.4优先级法打印函数代码7
4 测试用例,运行结果与运行情况分析8
4.1测试用例8
4.2运行结果8
5 自我评价与总结9
5.1本次课程设计做得比较好地方9
5.2什么地方做得不太好,以后如何改正10
5.3从本设计得到的收获10
6.参考文献10
附录11
进程调度模拟设计
——时间片轮转、优先级法
1 设计目的与功能
1.1设计目的
进程调度是处理机管理的核心内容。
本实验要求用高级语言编写模拟进程调度程序,以便加深理解有关进程控制快、进程队列等概念,并体会和了解优先数算法和时间片轮转算法的具体实施办法。
1.2设计功能
模拟进程调度,能够处理以下的情形:
⑴能够选择不同的调度算法(要求中给出的调度算法);
⑵能够输入进程的基本信息,如进程名、优先级、到达时间和运行时间等;
⑶根据选择的调度算法显示进程调度队列;
⑷根据选择的调度算法计算平均周转时间和平均带权周转时间。
2 需求分析,数据结构或模块说明(功能与框图)
2.1需求分析
无论是在批处理系统、分时系统还是实时系统,用户进程数一般都多于处理机数,这将导致用户进程互相争夺处理机。
另外,系统进程也同样需要使用处理机。
这就要求进程调度程序按照一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。
进程调度的主要任务是按照某种策略和方法选取一个处于就绪状态的进程占用处理机。
这次课程设计所要求使用的方法是时间片轮转和优先级法,并且能够选择不同的算法。
而时间片轮转法的基本思路是让每个进程在就绪队列中的等待时间与享受服务的时间成比例。
时间片轮转法的基本概念是将CPU的处理时间分成固定大小的时间片。
如果一个进程选中之后用完了系统规定的时间片,但未完成要求的任务,则它自行释放自己所占有的CPU而排到就绪队列的末尾,等待下一次调度。
同时,进程调度程序又去调度当前就绪队列中的第一个进程或作业。
优先级法是系统或用户按某种原则为作业或进程指定一个优先级来表示该作业或进程所享有的调度优先权。
优先级高的作业或进程优先调度。
2.2框图
2.3数据结构和模块说明
2.3.1主要数据结构
structTime_Node{
charpid[20];//进程名
intparrive_time;//进程到达时间
intpend_time;//进程结束时间
intprun_time;//进程执行时间
Time_Node*next;//下一个进程
intpnumber;
};
structnode{
charname[20];
intarrive_time;
intend_time;
intrun_time;
intpriority;
node*next;
};
2.3.2程序中主要函数
voidtime_create()
voidtime_print(Time_Node*p_h)
voidCreate()
voiddispatch()
voidprint()
voidmain()
3 源程序的主要部分
本次程序主要由以下几个函数组成:
voidtime_create();voidtime_print(Time_Node*p_h);voidCreate();voiddispatch();voidprint();voidmain()
3.1main函数部分
3.1.1 main函数代码
voidmain()
{
intchose;
while(chose!
=0)
{
cout<<"进程调度模拟设计--时间片轮转、优先级法"< cout<<"选择不同的调度算法: "< cout<<"1: 时间片轮转"< cout<<"2: 优先级法"< cout<<"3: 退出"< cin>>chose; switch(chose) { case1: { cout<<"请输入进程数: "; cin>>MAXSIZE; Time_Node*head; time_create(); head=Time_dispatch(phead,ptail); time_print(head); break; } case2: { cout<<"请输入进程数: "; cin>>MAXSIZE; Create(); dispatch(); print(); break; } case3: { exit(0); } default: break; } } } 3.2进程调度方法部分 3.2.1时间片轮转法函数代码 voidtime_create(){//建立进程就绪链表 inti=1; cout<<"请输入进程名: "<<"进程到达时间: "<<"进程执行时间: "< if(pcurrent==NULL){ pcurrent=newTime_Node; cin>>pcurrent->pid; cin>>pcurrent->parrive_time; cin>>pcurrent->prun_time; pcurrent->pnumber=i; i++; Exe_time[i-2]=pcurrent->prun_time;//进程执行用时备份; pcurrent->pend_time=0;//初始化 pcurrent->next=NULL; phead=ptail=pcurrent; } do{ pcurrent=newTime_Node; cin>>pcurrent->pid; cin>>pcurrent->parrive_time; cin>>pcurrent->prun_time; pcurrent->pnumber=i; i++; Exe_time[i-2]=pcurrent->prun_time;//进程执行用时备份; pcurrent->pend_time=0;//初始化; pcurrent->next=NULL; ptail->next=pcurrent; ptail=pcurrent; if(i>MAXSIZE)time_judge=1; }while(time_judge==0); } Time_Node*Time_dispatch(Time_Node*ph,Time_Node*pt){ Time_Node*p_head=NULL; Time_Node*p_tail=NULL; inttime_count=0;//计时器 while(ph! =NULL){ time_count+=TIMESIZE;//当前时间 cout<<"计时器值为: --------"< cout<<"进程: "< "< ph->prun_time-=TIMESIZE; cout<<"剩余执行时间: "< if(ph->prun_time<=0){//当前进程执行完 time_count=time_count+ph->prun_time; if(p_head==NULL){ p_head=p_tail=ph;//处于完成态的进程的链表的表头与表尾 p_head->pend_time=time_count; cout<<"第一个完成: "< "< ph=ph->next;//改变就绪进程链表的表头 pt->next=NULL; p_tail->next=NULL;//结束进程的表尾next的域置空 } else{ p_tail->next=ph; p_tail=ph; p_tail->pend_time=time_count;//记录结束时间 ph=ph->next;//改变就绪进程链表的表头 p_tail->next=NULL; } } else{//当前目标进程未处理完时的处理方式 pt->next=ph;//将当前未完成的进程链到就绪链表表尾 pt=ph; ph=ph->next; pt->next=NULL; } } returnp_head; } 3.2.2时间片轮转法打印函数代码 voidtime_print(Time_Node*p_h){ pcurrent=p_h; doublea=0.0; doubleb=0.0; doublec=0.0; while(pcurrent! =NULL){ c=(pcurrent->pend_time-pcurrent->parrive_time)/Exe_time[pcurrent->pnumber-1]; cout<<"进程名: "< "< "结束时间: "< " <
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 进程 调度 模拟 设计