操作系统实验五.docx
- 文档编号:8838223
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:13
- 大小:64.66KB
操作系统实验五.docx
《操作系统实验五.docx》由会员分享,可在线阅读,更多相关《操作系统实验五.docx(13页珍藏版)》请在冰点文库上搜索。
操作系统实验五
贵州大学实验报告
学院:
计算机科学与信息学院专业:
网络工程班级:
091
姓名
邱东生
学号
0908060327
实验组
实验时间
12.08
指导教师
王道书
成绩
实验项目名称
实验五进程调度实验
实验目的
设计一个有N个进程并行的进程调度程序。
采用最高优先级优先的调度算法进行进程调度的模拟。
实验要求
编程模拟进程调度算法,采用最高优先级优先的调度算法
实验原理
每个进程用一个进程控制块(PCB)表示。
进程控制块可以包含进程名、优先级、到达时间、需要运行时间、已用CPU时间、进程状态等等。
进程的运行时间以时间片为单位进行计算。
每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
进程名、优先级、需要运行时间通过键盘输入。
就绪进程获得CPU后都只能运行一个时间片。
用已占用CPU时间加1来表示。
运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,否则将进程的优先级减1(即降低一级),然后把它插入就绪队列等待CPU。
每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。
重复以上过程,直到所有进程都完成为止。
实验仪器
PC机或工作站一台;
RedHat9.0操作系统;
VC++6.0
实验步骤
实验内容
设计思路:
“最高优先数优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。
静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变。
动态优先数是指进程的优先数在创建进程时可以给定一个初始值,并且可以按一定原则修改优先数。
例如:
在进程获得一次CPU后就将其优先数减少1。
1、题目要求每个进程有一个进程控制块表示:
structpcb
{
charname[20];//进程的名字
intprio;//进程的优先级
intcputime;//CPU执行时间
intneedtime;//进程执行所需要的时间
charstate;//进程的状态,W--就绪态,R--执行态,F--完成态
structpcb*next;//链表指针
};
typedefstructpcbPCB;
2、每个进程有三种状态:
运行、就绪、完成态。
PCB*ready=NULL,*run=NULL,*finish=NULL;//定义三个队列,就绪队列,执行队列和完成队列
3、定义一个取得第一个就绪队列函数:
voidGetFirst()//取得第一个就绪队列节点
4、定义一个将完成进程插入完成队列尾部函数
voidInsertFinish(PCB*in)//将进程插入到完成队列尾部
5、定义一个按优先级输出队列函数
voidPOutput()//优先级算法输出队列信息
6、定义一个对输入进程按优先级大小对进程排列函数
voidSortPrio(PCB*in)//创建优先级队列,规定优先数越大,优先级越高
7、定义一个进程输入函数
voidPrioCreate()//优先级调度输入函数
#definegetpch(type)(type*)malloc(sizeof(type))//malloc申请内存空间
tmp=getpch(PCB);每次申请一块内存输入一个进程的全部信息。
8、定义一个优先级调度执行函数
voidPriority()//按照优先级调度,每次执行一个时间片
在里面调用GetFirst()、InsertFinish(PCB*in)、SortPrio(PCB*in)函数。
9、设置主函数调用函数运行程序
intmain()
{
cout<<"请输入要创建的进程数目:
"< cin>>num; PrioCreate();//优先级调度输入函数 Priority();//按照优先级调度 POutput();//优先级输出输出 return0; } 遇到的问题: 1、在写进程排序函数SortPrio(PCB*in)时,“移动指针查找第一个别它小的元素的位置进行插入”这一步不知道如何下手。 2、在写进程输入函数PrioCreate()时,不知道如何设置依次从键盘输入每个进程的相关信息,后来才知道要申请一个内存块。 实验数据 实验结果截图: 上图为输入进程相关信息步骤。 下面为程序运行状况: 分析: 程序运行后先输入进程数目,然后依次输入相应进程的进程名字、进程运行所需时间、优先级等相关信息。 然后按运行后便会显示进程一步一步运行的相关状态等信息。 最终都变成完成态,需要时间变为0,如上图所示。 实验总结 1、本次实验为设计按最高优先级调度法进行进程调度实验。 在调度算法流程图的帮助下才弄懂程序设计的主要思想。 2、通过本实验初步明白了最高优先级调度算法的相关思想。 学会设计进程控制块并通过函数调用实现程序调度运行实验。 3、由于调度算法有点难,程序比较长,因此在设计时遇到了一些问题,但经过查阅资料和询问他人,最终得以解决。 指导教师意见 签名: 年月日 注: 各学院可根据教学需要对以上栏木进行增减。 表格内容可根据内容扩充。 程序清单如下: #include #include #include usingnamespacestd; #definegetpch(type)(type*)malloc(sizeof(type))//malloc申请内存空间 structpcb { charname[20];//进程的名字 intprio;//进程的优先级 intcputime;//CPU执行时间 intneedtime;//进程执行所需要的时间 charstate;//进程的状态,W--就绪态,R--执行态,F--完成态 structpcb*next;//链表指针 }; typedefstructpcbPCB; PCB*ready=NULL,*run=NULL,*finish=NULL;//定义三个队列,就绪队列,执行队列和完成队列 intnum; voidGetFirst()//取得第一个就绪队列节点 { run=ready;//指针指向同一个节点 if(ready! =NULL) { run->state='R';//处于执行状态,run为执行队列 ready=ready->next;//就绪队列 run->next=NULL; } } voidInsertFinish(PCB*in)//将进程插入到完成队列尾部 { PCB*first; first=finish;//完成队列 if(finish==NULL) { in->next=finish; finish=in; } else { while(first->next! =NULL) { first=first->next; } in->next=first->next; first->next=in; } } voidPOutput()//优先级算法输出队列信息 { PCB*p; cout<<"进程名\t优先级\tcpu时间\t需要时间\t进程状态"< p=run; while(p! =NULL) { cout< p=p->next; } p=ready; while(p! =NULL) { cout< p=p->next; } p=finish; while(p! =NULL) { cout< p=p->next; } cout< } voidSortPrio(PCB*in)//创建优先级队列,规定优先数越大,优先级越高 { PCB*first,*second; first=second=ready; if(ready==NULL)//如果队列为空,则为第一个元素 { in->next=ready; ready=in; } else//查到合适的位置进行插入 { if((in->prio)>=(first->prio))//比第一个还要大,则插入到队头 { in->next=ready; ready=in; } else { while(first->next! =NULL)//移动指针查找第一个别它小的元素的位置进行插入 { second=first->next; if((in->prio)>(second->prio)) {in->next=second; first->next=in; } first=first->next; } if(first->next==NULL)//已经搜索到队尾,则其优先级数最小,将其插入到队尾即可 { in->next=first->next; first->next=in; } } } } voidPrioCreate()//优先级调度输入函数 { PCB*tmp; inti; cout<<"输入进程名字、进程所需时间和进程优先级: "< for(i=0;i { cout<<"进程号: "< tmp=getpch(PCB); cout<<"输入进程名字: "; cin>>tmp->name; cout<<"输入进程运行所需时间: "; cin>>tmp->needtime; cout<<"输入进程优先级: "; cin>>tmp->prio;//设置其优先级,需要的时间越多,优先级越低 tmp->cputime=0; tmp->state='W'; SortPrio(tmp);//按照优先级从高到低,插入到就绪队列 } } voidPriority()//按照优先级调度,每次执行一个时间片 { intflag=1; GetFirst(); while(run! =NULL)//当就绪队列不为空时,则调度进程如执行队列执行 { POutput();//输出每次调度过程中各个节点的状态 while(flag) { run->prio-=1;//优先级减去一 run->cputime++;//CPU时间片加一 run->needtime--;//进程执行完成的剩余时间减一 if(run->needtime==0)//如果进程执行完毕,将进程状态置为F,将其插入到完成队列 { run->state='F'; InsertFinish(run); flag=0; } else//将进程状态置为W,入就绪队列 { run->state='W'; SortPrio(run); flag=0; } } flag=1; GetFirst();//继续取就绪队列队头进程进入执行队列 } } intmain() { cout<<"请输入要创建的进程数目: "< cin>>num; PrioCreate();//优先级调度输入函数 Priority();//按照优先级调度 POutput();//优先级输出输出 return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验