广东工业大学操作系统实验报告4份全Word文档格式.docx
《广东工业大学操作系统实验报告4份全Word文档格式.docx》由会员分享,可在线阅读,更多相关《广东工业大学操作系统实验报告4份全Word文档格式.docx(81页珍藏版)》请在冰点文库上搜索。
charstate;
/*进程状态*/
intsuper;
/*优先数*/
intntime;
/*需要运行的时间*/
intrtime;
/*已占用的CPU时间*/
structpcb*link;
}*ready=NULL,*p;
typedefstructpcbPCB;
/*pcb表*/
sort()/*建立对进程进行优先级排列函数*/
{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->
}
}
input()/*建立进程控制块函数*/
{inti,num;
clrscr();
/*清屏*/
printf("
\n请输入进程号?
"
);
scanf("
%d"
&
num);
for(i=0;
i<
num;
i++)
{printf("
\n进程号No.%d:
\n"
i);
p=getpch(PCB);
\n输入进程名:
scanf("
%s"
p->
name);
printf("
\n输入进程优先数:
scanf("
p->
super);
\n输入进程运行时间:
ntime);
p->
rtime=0;
state='
w'
;
link=NULL;
sort();
/*调用sort函数*/
intspace()
{intl=0;
PCB*pr=ready;
while(pr!
{l++;
pr=pr->
return(l);
}
disp(PCB*pr)/*建立进程显示函数,用于显示当前进程*/
{printf("
\nqname\tstate\tsuper\tndtime\truntime\n"
|%s\t"
pr->
|%c\t"
state);
|%d\t"
printf("
rtime);
check()/*建立进程查看函数,检查等待队列的进程是否进入就绪队列*/
{PCB*pr;
\n****当前正在运行的进程是:
/*显示当前运行进程*/
disp(p);
pr=ready;
\n****当前就绪队列状态为:
/*显示就绪队列状态*/
while(pr!
{disp(pr);
destroy()/*建立进程撤消函数(进程运行结束,撤消进程)*/
{printf("
\n进程[%s]已完成.\n"
free(p);
running()/*建立进程就绪函数(进程运行时间到,置就绪状态*/
{(p->
rtime)++;
if(p->
rtime==p->
ntime)
destroy();
/*调用destroy函数*/
else
{(p->
super)--;
/*调用sort函数*/
main()/*主函数*/
{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按任一键继续......"
ch=getchar();
\n\n进程已经完成.\n"
ch=getchar();
}
3、运行结果:
请输入进程号?
5
进程号No.0:
输入进程名:
A
输入进程优先数:
2
输入进程运行时间:
1
进程号No.1:
B
3
进程号No.2:
C
进程号No.3:
D
4
进程号No.4:
E
Theexecutenumber:
****当前正在运行的进程是:
Qnamestatesuperndtimeruntime
ER510
****当前就绪队列状态为:
Dw410
Bw310
Aw210
Cw110
进程[E]已完成
按任一键继续……
DR410
进程[D]已完成
BR310
进程[B]已完成
AR210
进程[A]已完成
c
cR110
进程[C]已完成
进程已经完成
(二)、简单轮转法
在分时系统中,都毫无例外采用时间片轮转法。
在一种简单的轮转法中,系统将所有就绪进程按FIFO规则排成一个队列,把CPU分配给队首进程,并规定它执行一给定的时间如100ms,称此时间间隔为时间片。
当时间片完成时,系统产生一个时钟中断,剥夺该进程的执行,将它送至就绪队列的末尾,并把处理机分配给就绪队列的新队首进程,同样也让它执行一个时间片。
这样,就绪队列中的所有进程均可获得一个时间片的处理机而运行。
就绪队列中的进程在依次执行时,可能发生以下三种情况:
(1)进程未用完一个时间片就结束,这时系统应提前调度;
(2)进程在执行过程中提出I/O请求而阻塞,系统应将它放入相应的阻塞队列并引起调度;
(3)进程完成一个时间片后尚未完成,系统应将它重新放到就绪队列的末尾,等待下次执行。
由于在分时系统中,键盘命令的执行时间较短,大多能在一个时间片内执行完毕,因此分时系统的实际响应时间将比Nq(N是同时性用户数,q是时间片大小)小。
#include<
stdio.h>
/*定义一个pcb的结构体*/
structpcb
{charname;
/*进程名*/
inttime;
/*进程执行时间*/
};
voidmain()
{intn,i,j,flag=1;
structpcba[100];
/*最多可以有100个进程*/
printf("
输入进程个数:
scanf("
n);
getchar();
/*接收回车*/
for(i=0;
n;
{printf("
输入进程的名字:
%c"
a[i].name);
/*以字符接收进程名*/
输入占用的时间片:
/*输入进程占用的时间片*/
a[i].time);
}
i=0;
while(flag&
n>
0)/*若进程数为空,结束程序*/
{if(a[i].time!
=0)/*就绪队列是否为空*/
a[i].name);
/*进程执行一次,打印出该进程*/
a[i].time--;
/*使该进程占用的时间片减1*/
for(j=0;
j<
j++)
if(a[j].time)/*若进程所占用的时间片不为0,仍执行下一进程*/
{flag=1;
break;
else/*若进程所占用的时间片为0,说明已经完成,跳过执行下一进程*/
flag=0;
i=(++i)%n;
/*继续执行下一个进程,i+1*/
}
输入进程个数:
ABCDEABDEBDEDEE
Pressanykeytocontinue
六、心得体会:
操作系统是计算机系统中必不可少的系统软件。
它是计算机系统中各种资源的管理者和各种活动的组织者、指挥者。
操作系统采用时间片法调度进程,使系统资源得到充分的利用,用户也可以花更少的时间完成更多的工作,通过这次进程调度实验,让我明白了系统时间片的调度方法,对操作系统理论的学习更加深一层.并且增强了用C语言的编程能力。
在编程的过程中,遇到了种种困难,并且一一的克服了,这使我产生很大的成就感。
实验二作业调度
一、实验名称:
进程调度
用高级语言编写和调试一个或多个作业调度的模拟程序,加深对作业调度算法的理解。
在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的CPU时限等因素。
而在多道批处理系统中,作业首先存放在外存,当系统拥有的资源足够分配给一个作业,就将资源分配给此作业,并将此作业调进内存。
当系统资源不足以分配给一个作业时,则等待已经分配资源的作业运行完成后释放资源增加系统资源。
(一)、为单道批处理系统设计一个作业调度程序
1、实验原理。
作业等待算法:
分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法。
(1)先来先服务(FCFS)算法
先来先服务作业调度算法是一种较简单的作业调度算法,即每次调度是从后备作业队列中选择一个最先进入该队列的作业,将它调入内存,分配资源、创建相应的进程,放入进程就绪队列准备运行。
FCFS算法利于长作业,不利于短作业,而大多数的作业是I/O繁忙的短作业。
以FCFS作为主调度算法是不常用的。
(2)短作业优先调度算法(SJF)
短作业优先调度算法是指操作系统在进行作业调度时以作业长短作为优先级进行调度。
该调度算法可以照顾到实际上占作业总数绝大部分的短作业,使它们能比长作业优先调度执行。
这时后备作业队列按作业优先级由高到低顺序排列,当作业进入后备队列时要按该作业优先级放置到后备队列相应的位置。
实践证明,该调度算法的性能是最好的,单位时间的作业吞吐量也最大,但也存在缺点:
对长作业极为不利。
(3)响应比高者优先(HRN)的调度算法
采用响应比高者优先调度算法,进行调度时必须计算出系统中的所有满足必要条件作业的响应比;
从中选择响应比最高的一个作业装入主存储器、分配资源,由于是实验,所以就用将作业的作业控制块出队,并输出作业的作业名代替装入主存储器,同时修改系统的资源数量;
用同样方法选择第二个、第三个……直到不再有满足必要条件的作业。
调度算法的流程图如下:
2、源代码及运行结果:
#definegetjcb(type)(type*)malloc(sizeof(type))
#defineNULL0
intn=0,time=0;
floateti,ewi;
structjcb{charname[10];
/*作业名*/
charstate;
/*作业状态*/
intts;
/*提交时间*/
floatsuper;
/*优先权*/
inttb;
/*开始运行时间*/
inttc;
/*完成时间*/
floatti;
/*周转时间*/
floatwi;
/*带权周转时间*/
intntime;
/*作业所需运行时间*/
structjcb*link;
/*结构体指针*/
}*p,*q,*head=NULL;
typedefstructjcbJCB;
inital(){inti;
\n输入作业数:
输入:
\n作业名\t到达时间\t服务时间\n"
i++){p=getjcb(JCB);
scanf("
%s\t%d\t%d"
name,&
ts,&
p->
W'
if(head==NULL)head=q=p;
else{
q->
q=p;
}}}
voidprint(JCB*pr,intm){
JCB*p;
printf("
\ntime=%d"
time);
if(m==3){printf("
\n作业名\t状态\t到达时间\t服务时间\t优先权\t\t完成时间\t周转时间\t带权周转时间\n"
%s\t%c\t%d\t%d\t%4.2f\t%d\t%4.2f\t%4.2f\n"
pr->
name,pr->
state,pr->
ts,pr->
ntime,pr->
super,pr->
tc,pr->
ti,pr->
wi);
else{printf("
\n作业名状态到达时间服务时间完成时间周转时间带权周转时间\n"
%s\t%c\t%d\t%d\t%d\t%4.2f\t%4.2f\n"
p=head;
do{if(p->
state=='
)
%s\t%c\t%d\t%d\t%4.2f\n"
name,p->
state,p->
ts,p->
ntime,p->
else{printf("
%s\t%c\t%d\t%d\n"
p=p->
}while(p!
=NULL);
F'
if(m==3){
super,p->
tc,p->
ti,p->
else{printf("
voidlast(){eti/=n;
ewi/=n;
\n平均周转时间=%7.3f\n平均带权周转时间=%7.3f\n"
eti,ewi);
super(){JCB*padv;
padv=head;
do{if(padv->
padv->
ts<
=time)
padv->
super=(float)(time-padv->
ts+padv->
ntime)/padv->
ntime;
padv=padv->
}while(padv!
voidhrn(m){JCB*min;
inti,iden;
i++){p=min=head;
iden=1;
super();
do{if(p->
if(iden){min=p;
iden=0;
elseif(p->
super>
min->
super)min=p;
if(iden){i--;
time++;
if(time>
1000){printf("
\nruntimeistoolong...error..."
getch();
else{running(min,m);
}}
voidsjf(intm){
JCB*min;
inti,iden;
for(i=0;
i++){p=min=head;
ntime<
ntime)min=p;
}wh