操作系统进程调度实验Word下载.docx
《操作系统进程调度实验Word下载.docx》由会员分享,可在线阅读,更多相关《操作系统进程调度实验Word下载.docx(15页珍藏版)》请在冰点文库上搜索。
![操作系统进程调度实验Word下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/11/282fe556-3c32-4bf7-ae86-ac116eedd8b4/282fe556-3c32-4bf7-ae86-ac116eedd8b41.gif)
设计一个有N个进程共行的进程调度程序。
进程调度算法:
采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。
每个进程有一个进程控制块(PCB)表示。
进程控制块可以包含如下信息:
进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
进程的优先数以及需要的运行时间可以实现人为的指定(也可以由随机数产生)。
进程的到达时间为进程输入的时间。
进程的运行时间以时间片为单位进行计算。
每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
就绪进程获得CPU后都只能运行一个时间片。
用已占用CPU时间加一来表示。
如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤销该进程,如果运行一个时间片后进程的已占用CPU时间还未达到所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减一(即降低一级),然后把它插入就绪队列等待CPU。
每进行一次调度程序都将打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。
重复以上过程,直到所要进程都完成为止。
调度算法的流程图如下:
进程调度源程序如下:
#include"
stdio.h"
#include<
stdlib.h>
conio.h>
#definegetpch(type)(type*)malloc(sizeof(type))
#defineNULL0
structpcb{
charname[10];
//进程名
charstate;
//进程状态
intsuper;
//进程优先级
intntime;
//进程需要运行时间
intrtime;
//进程已经运行时间
structpcb*link;
}*ready=NULL,*p;
typedefstructpcbPCB;
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->
(second->
super))/*若插入进程比当前进程优先数大*/
{/*插入到当前进程前面*/
p->
link=second;
first->
link=p;
second=NULL;
insert=1;
}
else/*插入进程优先数最低,则插入到队尾*/
{
first=first->
second=second->
}
if(insert==0)first->
}
voidinput()/*建立进程控制块函数*/
inti;
system("
cls"
);
/*清屏*/
printf("
\n请输入进程信息:
\n"
for(i=0;
i<
5;
i++)
printf("
\n进程号NO.%d:
i);
p=getpch(PCB);
\n输入进程名:
"
scanf("
%s"
p->
name);
\n输入进程优先数:
%d"
&
p->
super);
\n输入进程运行时间:
ntime);
rtime=0;
state='
w'
;
link=NULL;
sort();
/*调用sort函数*/
intspace()//计算进程控制的个数
intl=0;
PCB*pr=ready;
while(pr!
l++;
pr=pr->
return(l);
voiddisp(PCB*pr)/*建立进程显示函数,用于显示当前进程*/
\nqname\tstate\tsuper\tndtime\truntime\n"
|%s\t"
pr->
|%c\t"
state);
|%d\t"
rtime);
voidcheck()/*建立进程查看函数*/
PCB*pr;
\n***当前正在运行的进程是:
disp(p);
pr=ready;
\n****当前就绪队列状态为:
while(pr!
disp(pr);
pr=pr->
voiddestroy()/*建立进程撤销函数*/
\n进程[%s]已完成.\n"
free(p);
voidrunning()/*建立进程就绪函数*/
(p->
rtime)++;
if(p->
rtime==p->
ntime)
destroy();
/*调用destroy函数*/
else
(p->
super)--;
state='
/*调用sort函数*/
voidmain()//高级优先算法的程序入口
intlen,h=0;
charch;
input();
len=space();
while((len!
=0)&
&
(ready!
=NULL))
ch=getchar();
h++;
\nTheexecutenumber:
%d\n"
h);
p=ready;
ready=p->
R'
check();
running();
\n按任一键继续..."
\n\n进程已经完成.\n"
ch=getchar();
四、实验结果
1、运行成功
2、输入数据
3、运行结果
实验运行结果:
进程2完成
继续
进程4完成
进程1完成
五、实验总结
本次实验,任务是用c语言代码实现进程调度模拟系统,从而观察进程的运行过程及加深对进程的了解。
这次实验,加深了我对进程概念及进程调度的理解;
熟悉了进程调度算法。
使得理论知识得到的实践,也使我的编程能力得到了进一步提高。
实验中,我们共同学习、共同努力,虽然在实验中遇到了一些问题,但在查阅资料后都解决了。
实验过程也让我认识到自己的不足,好多知识已经模糊不清,在今后自己要多一些实验及相关的小项目,来提高自己的编程能力。