实验4优先级调度算法设计实验.docx
- 文档编号:12728168
- 上传时间:2023-06-07
- 格式:DOCX
- 页数:11
- 大小:67.61KB
实验4优先级调度算法设计实验.docx
《实验4优先级调度算法设计实验.docx》由会员分享,可在线阅读,更多相关《实验4优先级调度算法设计实验.docx(11页珍藏版)》请在冰点文库上搜索。
实验4优先级调度算法设计实验
实验4优先级调度算法设计实验
1.实验目的
在操作系统的调度算法中,优先级调度算法是一种常用的调度算法。
采用优先级调度算法要求每个进程都有一个优先级与其关联,具有最高优先级的进程会分配到CPU,具有相同优先级的进程按FCFS(FirstComeFirstServed)顺序调度。
本次实验要求在Linux操作系统上用C语言编写和调试一个基于优先级优先运行算法的进程调度程序。
2.实验内容
1)优先级简介
动态优先数是指在进程创建时先确定一个初始优先数,以后在进程运行中随着进程特性的改变不断修改优先数,这样,由于开始优先数很低而得不到CPU的进程,就能因为等待时间的增长而优先数变为最高而得到CPU运行。
例如:
在进程获得一次CPU后就将其优先数减少1,或者进程等待的时间超过某一时限时增加其优先数的值,等等。
2)详细设计
优先权调度算法:
1.设定系统中有五个进程,每一个进程用一个进程控制块(PCB)表示,进程队列采用链表数据结构。
进程控制块包含如下信息:
进程名、优先数、需要运行时间、已用CPU时间、进程状态等等。
在每次运行设计的处理调度程序之前,由终端输入五个进程的“优先数”和“要求运行时间”。
进程的优先数及需要的运行时间人为地指定,进程的运行时间以时间片为单位进行计算。
2.采用优先权调度算法,将五个进程按给定的优先数从大到小连成就绪队列。
用头指针指出队列首进程,队列采用链表结构。
处理机调度总是选队列首进程运行。
采用动态优先数办法,进程每运行一次优先数减“1”,同时将已运行时间加“1”。
进程运行一次后,若要求运行时间不等于已运行时间,则再将它加入就绪队列;否则将其状态置为“结束”,且退出就绪队列。
“就绪”状态的进程队列不为空,则重复上面6,7步骤,直到所有进程都成为“结束”状态。
3.在设计的程序中有输入语句,输入5个进程的“优先数”和“要求运行时间”,也有显示或打印语句,能显示或打印每次被选中进程的进程名、运行一次后队列的变化,以及结束进程的进程名。
最后,为五个进程任意确定一组“优先数”和“要求运行时间”,运行并调试所设计的程序,显示或打印出逐次被选中进程的进程名及其进程控制块的动态变化过程。
3)流程图:
最高优先级优先调度算法流程图
3.实验内容
要求:
1)运行程序后显示一个友好的界面,上面显示实验者的实验题目、班级、姓名、学号及完成实验的日期,示例界面如下:
2)要求模拟进程的参数有分5次输入,每次输入1个进程名称、优先级以及运行时间;
3)5个进程输入完成后,每按一次回车键,相当于队列首进程运行了一个CPU的时间,运行完毕后,如果要求运行时间不等于已运行时间,则再将它加入就绪队列;否则将其状态置为“结束”,且退出就绪队列;
4)重复5次操作,直到进程运行完毕位置,如下图所示:
5)将每步的执行界面拷屏插入到实验报告中。
思考题:
在此程序基础上,实现8个任务的动态优先级调度。
示例源程序:
#include"stdio.h"
#include
#definegetch(type)(type*)malloc(sizeof(type))
#defineNULL0
structpcb{/*定义进程控制块PCB*/
charname[10];//进程名
charstate;//进程状态
intsuper;//进程优先级
intntime;//进程需要运行时间
intrtime;//进程已经运行的时间
structpcb*link;
}*ready=NULL,*p;
typedefstructpcbPCB;
voidinunization()//初始化界面
{
printf("\n\n\t\t*********************************************\t\t\n");
printf("\t\t\t\t基于最高优先级优先运行的进程调度\n");
printf("\t\t*********************************************\t\t\n");
printf("\n\n\n\t\t\t\t\t15电子**班\n");
printf("\t\t\t\t\t姓名:
*****\n");
printf("\t\t\t\t\t学号:
*****\n");
printf("\t\t\t\t\t完成时间:
2017年**月**日\n\n\n\n");
printf("请输入任意键进入演示过程\n");
getchar();
}
voidsort()/*建立对进程进行优先级排列函数*/
{
PCB*first,*second;
intinsert=0;
if((ready==NULL)||((p->super)>(ready->super)))/*优先级最大者,插入队首*/
{
p->link=ready;
ready=p;
}
else/*进程比较优先级,插入适当的位置中*/
{
first=ready;
second=first->link;
while(second!
=NULL)
{
if((p->super)>(second->super))/*若插入进程比当前进程优先数大,*/
{/*插入到当前进程前面*/
p->link=second;
first->link=p;
second=NULL;
insert=1;
}
else/*插入进程优先数最低,则插入到队尾*/
{
first=first->link;
second=second->link;
}
}
if(insert==0)first->link=p;
}
}
voidinput()/*建立进程控制块函数*/
{
inti;
system("cls");/*清屏*/
printf("\n请输入五个进程信息:
\n");
for(i=0;i<5;i++)
{
printf("\n进程号No.%d:
\n",i);
p=getch(PCB);
printf("\n输入进程名:
");
scanf("%s",p->name);
printf("\n输入进程优先数:
");
scanf("%d",&p->super);
printf("\n输入进程运行时间:
");
scanf("%d",&p->ntime);
printf("\n");
p->rtime=0;p->state='w';
p->link=NULL;
sort();/*调用sort函数*/
}
}
intspace()//计算进程控制块的个数
{
intl=0;PCB*pr=ready;
while(pr!
=NULL)
{
l++;
pr=pr->link;
}
return(l);
}
voiddisp(PCB*pr)/*建立进程显示函数,用于显示当前进程*/
{
printf("\nqname\tstate\tsuper\tndtime\truntime\n");
printf("|%s\t",pr->name);
printf("|%c\t",pr->state);
printf("|%d\t",pr->super);
printf("|%d\t",pr->ntime);
printf("|%d\t",pr->rtime);
printf("\n");
}
voidcheck()/*建立进程查看函数*/
{
PCB*pr;
printf("\n****当前正在运行的进程是:
%s",p->name);/*显示当前运行进程*/
disp(p);
pr=ready;
printf("\n****当前就绪队列状态为:
\n");/*显示就绪队列状态*/
while(pr!
=NULL)
{
disp(pr);
pr=pr->link;
}
}
voiddestroy()/*建立进程撤消函数(进程运行结束,撤消进程)*/
{
printf("\n进程[%s]已完成.\n",p->name);
free(p);
}
voidrunning()/*建立进程就绪函数(进程运行时间到,置就绪状态*/
{
(p->rtime)++;
if(p->rtime==p->ntime)
destroy();/*调用destroy函数*/
else
{(p->super)--;
p->state='w';
sort();/*调用sort函数*/
}
}
voidyouxian()//高优先级优先算法的程序入口
{
intlen,h=0;
charch;
system("cls");
input();
len=space();
while((len!
=0)&&(ready!
=NULL))
{
ch=getchar();
h++;
printf("\nTheexecutenumber:
%d\n",h);
p=ready;
ready=p->link;
p->link=NULL;
p->state='R';
check();
running();
printf("\n按任一键继续......");
}
printf("\n\n进程已经完成.\n");
ch=getchar();
}
voidmenu()//菜单
{intm;
system("cls");
printf("\n\n\t\t*********************************************\t\t\n");
printf("\t\t\t\t进程调度演示\n");
printf("\t\t*********************************************\t\t\n");
youxian();//高优先级优先算法的程序入口
system("cls");
menu();
}
main()/*主函数*/
{
inunization();
menu();
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 优先级 调度 算法 设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)