完整word版操作系统作业调度实验报告多道批处理Word文档下载推荐.docx
《完整word版操作系统作业调度实验报告多道批处理Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《完整word版操作系统作业调度实验报告多道批处理Word文档下载推荐.docx(29页珍藏版)》请在冰豆网上搜索。
![完整word版操作系统作业调度实验报告多道批处理Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2023-1/5/6da7cbd6-c134-4576-8163-bcf4ea1ee2bc/6da7cbd6-c134-4576-8163-bcf4ea1ee2bc1.gif)
作业的平均带权周转时间:
W=全部进程的带权周转时间/进程个数
1、先来先服务调度算法(FCFS):
每次调度都是从后备作业队列中,选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。
在进程调度中采用FCFS算法时,这每次调度是从就绪队列中,选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。
该进程一直运行到完成或发生某事件阻赛后,才放弃处理机。
2、最短作业优先(SJF):
每次从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。
对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,并比较各种算法的优缺点。
3、多道作业调度算法:
将作业按FCFS原则排好队,在输入井中按作业到达的先后次序来挑选作业,先进入输入井的作业优先被挑选,当系统中现有的尚未分配的资源不能满足先进入输入井的作业时,那么顺序挑选后面的作业,把不能满足要求的放回输入井尾部等待,当作业执行结束进入完成状态时,做好释放资源等善后工作。
四、流程图
1、FCFS算法和SJF算法:
2.多道作业调度算法
五、给出程序中源程序名和执行程序名:
源程序名:
FCFSandSJF,执行程序名:
fcfsandsjf.cpp
DUODAO执行程序名:
duodao.cpp
六、程序清单
1.FCFS和SJF算法
#include"
stdio.h"
#include<
stdlib.h>
conio.h>
#definegetpch(type)(type*)malloc(sizeof(type))
structjcb{
charname[10];
charstate;
intatime;
//作业到达时间
intbtime;
//作业开始运行时间
intftime;
//作业完成时间
intntime;
//作业估计运行时间
intrtime;
//作业执行时间
intttime;
//周转时间
floatwtime;
//带权周转时间(周转时间/估计运行时间)
structjcb*link;
}*ready=NULL,*p;
//ready指向队头,p指向正被调度的作业
typedefstructjcbJCB;
intT=0;
//初始化时间量
floattotal;
//记录所有作业的总时间
doubleweight;
//记录所有作业的带权周转时间
voidsort()/*建立对作业进行到达时间排列函数*/
{
JCB*first,*second;
intinsert=0;
if((ready==NULL)||((p->
atime)<
(ready->
atime)))/*作业到达时间最短的,插入队首*/
{
p->
link=ready;
ready=p;
T=p->
atime;
//更改时间量
}
else/*作业比较到达时间,插入适当的位置中*/
first=ready;
second=first->
link;
while(second!
=NULL)
if((p->
(second->
atime))/*若插入作业比当前队尾作业到达时间短,*/
{/*插入到当前队尾作业前面*/
link=second;
first->
link=p;
second=NULL;
insert=1;
else/*插入作业到达时间最长,则插入到队尾*/
first=first->
second=second->
if(insert==0)first->
}
voidshortjob()//获取队列中的最短作业
JCB*pr,*min,*qr;
min=ready;
//min指向作业对头
qr=ready;
pr=ready->
while(pr!
if((pr!
=NULL)&
&
(T>
=pr->
atime)&
(pr->
ntime)<
(min->
ntime))
{//当插入作业到达时间要比时间量T小
min=pr;
//min指向pr
qr->
link=pr->
//qr的下一个指向pr的下一个
pr->
pr=pr->
else//当pr的需要时间不小于min的需要时间
{qr=pr;
}
ready=min;
//把最终获取的min的需要时间赋给ready,开始执行
voidinput()/*建立作业控制块函数*/
inti;
printf("
\n请输入4个作业:
"
);
for(i=0;
i<
4;
i++)
\n请输入作业号NO.%d:
\n"
i);
p=getpch(JCB);
输入作业名:
scanf("
%s"
p->
name);
\n输入作业到达时间:
%d"
&
atime);
\n输入作业运行时间:
ntime);
rtime=0;
btime=0;
ftime=0;
ttime=0;
wtime=0;
state='
W'
;
link=NULL;
sort();
intspace()/*查看作业个数*/
{
intl=0;
JCB*pr=ready;
while(pr!
=NULL)
l++;
pr=pr->
return(l);
voiddisp(JCB*pr)/*建立作业显示函数,用于显示当前作业*/
\nqname\tstate\tatime\tntime\tbtime\trtime\tftime\tttime\twtime\n"
|%s\t"
pr->
|%c\t"
state);
|%d\t"
btime);
rtime);
ftime);
ttime);
|%.2f\t"
wtime);
voidcheck()/*建立作业查看函数*/
JCB*pr;
\n****当前正在运行的作业是:
/*显示当前运行作业*/
disp(p);
pr=ready;
\n****当前就绪队列状态为:
/*显示就绪队列状态*/
disp(pr);
voiddestroy()
\n作业[%s]已完成。
free(p);
voidrunning(JCB*pr)//计算各个时间
if(T>
atime)pr->
btime=T;
//插入作业的到达时间比时间量小,T为该作业的开始时间
elsepr->
btime=pr->
//否则该作业到达时间为它的开始时间
ftime=pr->
btime+pr->
ntime;
wtime=(float)pr->
ttime/(float)pr->
total+=pr->
ttime;
weight+=pr->
wtime;
T=pr->
ftime;
//T为该上一个作业的完成时间
voidrunning1(JCB*pr)//分离出要执行的当前作业
voidrunning2(JCB*pr)//判断运行时间和需要运行时间的关系
while(pr->
rtime<
pr->
ntime)
R'
(pr->
rtime)=(pr->
\n\n****该作业执行完毕时的状态:
state='
F'
destroy();
intmain()
inti,len,h=0;
charch;
total=0;
weight=0;
*********************************************************\n"
\n"
FCFS算法或SJF算法\n"
input();
len=space();
\n选择算法:
"
i);
switch(i)
case1:
FCFS算法:
break;
case2:
SJF算法:
default:
printf("
FAULSE"
if(i==1||i==2)
while((len!
=0)&
(ready!
=NULL))
ch=getchar();
if(i==2)shortjob();
h++;
\nTheexecutenumber:
%d\n"
h);
p=ready;
/*将队首指针赋给p*/
ready=p->
/*ready指向原p的下一个进程*/
/*p的link赋空*/
btime=p->
running1(p);
check();
running(p);
running2(p);
\n按任一键继续..."
\n\n作业已完成。
\n******************************************************\n"
\n平均周转时间:
%f"
total/(float)4);
\n平均带权周转时间:
%lf"
weight/(float)4);
2.多道作业调度算法:
#definesource15
charusername[10];
charjobname[10];
//作业的运行时间
intnsource;
//作业所需系统资源
intasource;
//已分配的资源
intneed1;
//ready指向就绪队列的队头,p指向正被调度的作业
intrsource=15;
//剩下资源
intnum,i=0;
//num为作业个数,i为记录不能满足作业要求调度的次数
voiddestroy(JCB*pr)
free(pr);
nsource<
=source)&
(rsource>
=0)&
(p->
nsource>
asource))
{//需要资源要在系统资源范围内,分配资源要在需要资源范围内,剩下资源不能小于0
if((ready==NULL)||((p->
}
else
destroy(p);
voidsort1()/*对作业进行排列函数*/
JCB*first;
if(ready==NULL)/*如果就绪队列为空*/
{
/*将新建作业放入队列中,将ready指向队首作业*/
}
else/*队列中有作业在等待,将新建作业插入到队尾*/
/*first指针指向队首作业*/
while(first->
link!
=NULL)first=first->
/*当first指针没有指向队尾时,指针后移*/
/*将p指向的作业插入队尾*/
\n请输入作业个数:
num);
for(i=0;
i<
num;
i++)
输入作业用户名:
username);
\n输入作业名:
jobname);
\n输入作业到达时间:
\n输入作业运行时间:
\n输入作业所需资源:
nsource);
\n输入作业已分配资源:
asource);
need1=p->
nsource-p->
asource;
//还需要资源=需要资源-已分配资源
link=NULL;
intl=0;
JCB*pr=ready;
=NULL)
\n用户N\t作业N\t状态S\t到达T\t服务T\t所需S\t已分S\t还需S\n"
need1);
voidcheck()
JCB*pr;
\n****当前正在运行的作业是:
\n****当前输入井队列状态为:
=NULL)
voidrunning(JCB*p)//对输入井队列中满足资源要求的作业进行服务
while(p->
(p->
rtime)++;
\n****作业运行完成后状态:
\n用户名[%s]的作业[%s]已完成。
username,p->
voidrunning1()//计算剩下资源
for(pr=ready;
pr!
=NULL;
pr=pr->
link)
{rsource=rsource-pr->
voidrunning2(JCB*pr)
if(pr->
need1<
=rsource)
rsource-=pr->
need1;
asource+=pr->
need1=0;
\t********************************************\n"
\n分配给作业后所剩的资源是:
%d\n"
rsource);
running(pr);
rsource=rsource+pr->
nsource;
\n释放后的资源是:
destroy(pr);
printf("
该作业不能满足要求,调度下一个作业"
sort1();
i++;
voidmain()