进程调度vc++的代码计算机操作系统实验.docx
- 文档编号:29814300
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:17
- 大小:199.84KB
进程调度vc++的代码计算机操作系统实验.docx
《进程调度vc++的代码计算机操作系统实验.docx》由会员分享,可在线阅读,更多相关《进程调度vc++的代码计算机操作系统实验.docx(17页珍藏版)》请在冰豆网上搜索。
进程调度vc++的代码计算机操作系统实验
实验报告1
课程计算机操作系统实验名称进程调度第1页
班级11计本学号105032011130姓名风律澈
实验日期:
2013年10月4日报告退发(订正、重做)
一、实验目的:
多道系统中,当就绪进程数大于处理机数时,必须按照某种策略决定选取哪些进程占用处理器。
本实验模拟实现处理器调度,进一步加深对处理器调度算法的理解。
二、实验内容:
选择某种调度算法,设计一个实现处理器调度的程序。
三、实验环境:
VS2008,window7操作系统
四、实验步骤:
1、设计一个有N个进程并发的处理器调度程序,每个进程由一个PCB表示,PCB包含以下信息:
进程名、优先数、要求服务时间、进程状态。
2、可分别用链表表示就绪队列,用队列中的结构体结点表示进程。
3、已知各进程的的到达时间等如下:
进程名
到达时间
服务时间
优先数
A
0
3
12
B
1
5
31
C
2
2
21
D
3
4
10
4、分别实现下面两种调度算法
按FCFS调度算法实现处理器调度;
按优先数调度算法实现处理器调度。
五、实验程序:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~链表队列~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
此部分头文件名:
link.h
#include
usingnamespacestd;
////
//修改部分//
////
//节点定义
typedefstructlistnode{
listnode*prior;
charname;//进程名
intserve_time;//服务时间
intpriors;//优先权
intarrival_time;//到达时间
floatstart_time;//开始时间
floatfinish_time;//结束时间
floatturnover_time;//周转时间
floatt_t_s;//带权重周转时间
intstate;
listnode*next;
}progress;
//表头定义
typedefstruct{
listnode*head;
intlength;
}listlead,list;
//输出函数
voidcoutdata(listnode*p){
cout<<"进程名为"<
cout<<"服务时间为"<
cout<<"优先权为"<
cout<<"到达时间为"<
cout<<"开始时间为"<
cout<<"结束时间为"<
cout<<"周转时间为"<
cout<<"带权重周转时间为"< } //输入函数 voidcindata(listnode&e,charn,ints,intp,inttime){ e.name=n; e.serve_time=s; e.priors=p; e.arrival_time=time; } voidcindata(listnode&e){ cout<<"进程名为: ";cin>>e.name; cout<<"服务时间为: ";cin>>e.serve_time; cout<<"优先权为: ";cin>>e.priors; } //初始化 voidinitilead(listlead&L){ L.head=NULL; L.length=0; } voidinitinode(listnode&e,charn,ints,intp,inttime){ e.prior=NULL; e.next=NULL; e.finish_time=0; e.start_time=0; e.state=0; e.turnover_time=0; e.t_t_s=0; cindata(e,n,s,p,time); } //拷贝函数 voidcopy(listnode*p,listnode&e){ e.arrival_time=p->arrival_time; e.finish_time=p->finish_time; e.name=p->name; e.next=p->next; e.prior=p->prior; e.priors=p->priors; e.serve_time=p->serve_time; e.start_time=p->start_time; e.state=p->state; } //// //一些复用函数// //// listnode*fin_i(listleadL,inti){ while(i<1||i>L.length) {cout<<"i位置不合法! 请重新输入,位置为~"< listnode*p=L.head; intj=1; if(i<=(L.length/2)){ while(j<=i){ p=p->next; j++; } returnp; } else{ i=L.length-i; if(i==0){ returnL.head; } else{ while(j<=i){ p=p->prior; j++; } returnp; } } } //// //正式使用部分// //// //// //查找// //使用说明: L表示表头,i表示查找位置,e表示提取出该元素的备份// //// voidfin_elem(listleadL,inti,listnode&e){ listnode*p; p=fin_i(L,i); copy(p,e); } //// //*插入*// //使用说明: L表示表头,i表示位置,表尾i为L.Length+1,e表示插入元素,e必须是new出来的空间// //// voidinsert(listlead&L,inti,listnode&e){ while(i<1||i>L.length+1) {cout<<"i位置不合法! 请重新输入,位置为~"< if(i==1){//表头插入 if(L.length==0) {L.head=&e;e.next=&e; L.length++;}//空表首元插入 elseif(L.length==1){//一元表头插入 L.head->next=&e; e.next=L.head; L.head->prior=&e; L.length++; } else{//超一元表头插入 listnode*p=L.head->next; p->prior=&e; e.next=p; L.head->next=&e; L.length++; } } elseif(i>1&&i listnode*p,*q;//表中插入 p=fin_i(L,i)->prior; q=p->next; p->next=&e; e.next=q; q->prior=&e; e.prior=p; L.length++; } else{//表尾插入 listnode*p=L.head; e.next=p->next; e.prior=p; p->next=&e; L.head=&e; L.length++; } } //// //*优先插入*// //使用说明: L表示表头,e表示插入元素,e必须是new出来的空间// //使用时需要修改"比较元素",可以通过修改比大小来决定小头还是大头// voidprior_insert(listlead&L,listnode&e){ if(L.length==0) insert(L,1,e); else{ intin=1; inti=1; listnode*p=newlistnode(); initinode(*p,'x',0,0,0);//需要自适应部分// do{ fin_elem(L,in,*p); if(e.priors>p->priors)//需要自适应部分// break; else in++; }while(in<=L.length); insert(L,in,e); } } //删除// //使用说明: L表示表头,i表示删除位置// //// voiddel_elem(listlead&L,inti){ while(i<1||i>L.length) {cout<<"i位置不合法! 请重新输入,位置为~"< listnode*p,*q; if(i==1){//表头删除 if(L.length==1){//一元表头删除 deleteL.head; L.head=NULL; L.length=0; } elseif(L.length==2){//二元表头删除 listnode*p=L.head; listnode*q; q=p->next; p->next=p; p->prior=NULL; L.length--; } else{//多元表头删除 listnode*p=L.head; listnode*q; q=p->next; p->next=q->next; q->next->prior=NULL; deleteq; L.length--; } } elseif(i>1&&i p=fin_i(L,i)->prior; q=p->next; p->next=q->next; q->next->prior=p; deleteq; L.length--; } else{//表尾删除 listnode*p=L.head->prior; p->next=L.head->next; deleteL.head; L.head=p; L.length--; } } //// //修改// //使用说明: L表示表头,i表示修改元素的位置// //// voidmodify(listlead&L,inti){ listnode*p; p=fin_i(L,i); cindata(*p); } //// //释放// //使用说明: 直接释放表L的全部元素// //// voiddel_list(listlead&L){ listnode*p,*q; p=L.head; if(L.length==1){ del_elem(L,1); } else{ q=p->prior; while(q->prior! =NULL){ deletep; p=q; q=p->prior; } deleteq; L.head=NULL; L.length=0; } } ~~~~~~~~~~~~~~~~~~~~~~~~~本次实验算法部分~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 此部分头文件名: Assistandextension.h //// //适应小函数// voidthis_insert(list&ready,intType,listnode*x){ if(Type==1) insert(ready,ready.length+1,*x); elseif(Type==2) prior_insert(ready,*x); } //// //进程事件集合// //使用说明: 按照时间进度逐步开始发生,ABCD依时间触发后,进入链表// //type=1,则按时间顺序加入队列,type=2,则以权重大小加入队列// voidaccident(list&ready,inttime,intType){ if(time==0){ progress*x=newprogress(); initinode(*x,'A',3,12,time); this_insert(ready,Type,x); } elseif(time==1){ progress*x=newprogress(); initinode(*x,'B',5,31,time); this_insert(ready,Type,x); } elseif(time==2){ progress*x=newprogress(); initinode(*x,'C',2,21,time); this_insert(ready,Type,x); } elseif(time==3){ progress*x=newprogress(); initinode(*x,'D',4,10,time); this_insert(ready,Type,x); } elseif(time<0) cout<<"wrong"; } //// //调度处理// //解释说明: 本实验不论是用FCFS还是优先度,有区别的只是各个进程progress在// //就绪队列ready中的位置而已,每次使用只提取队列ready最前的进程progress进// //处理就可以了。 // voidhandle(list&ready,inttime){ if(ready.head->next->state==0){ ready.head->next->start_time=time; ready.head->next->state++; } elseif(ready.head->next->state>0){ if(ready.head->next->state==ready.head->next->serve_time){ ready.head->next->finish_time=time; ready.head->next->turnover_time=ready.head->next->finish_time-ready.head->next->arrival_time; ready.head->next->t_t_s=ready.head->next->turnover_time/ready.head->next->serve_time; coutdata(ready.head->next); ready.head->next->next->start_time=time; ready.head->next->next->state++; del_elem(ready,1); } else ready.head->next->state++; } else cout<<"wrong"< } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~main部分~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 此部分头文件名: main.cpp #include"link.h" #include"Assistandextension.h" voidmain(){ //变量声明// inttime=0; listready; intType=3; initilead(ready); //开始流程// cout<<"选择调度方式,输入1表示FCFS,输入2表示抢占式优先权调度算法"< cout<<"调度方式: "; cin>>Type; do { accident(ready,time,Type); handle(ready,time); time++; }while(ready.head! =NULL/*time<10*/); } 六、实验结果: FCFS调度方式 抢占式优先调度方式:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 进程 调度 vc 代码 计算机 操作系统 实验