实验一 批处理系统的作业调度
实验目的:
1.加深对作业概念的理解。
2.深入了解批处理系统如何组织作业、管理作业和调度作业。
实验要求:
利用 C 语言程序模拟批处理系统中的作业调度,要求采用响应比高者优先的作业调
度算法。
实验设备及环境:
Pc 机一台,vc6.0 for windows
实验步骤:
1.确定作业控制块的内容和组成方式;
2.由于实验中没有实际作业,作业控制块中的信息内容只使用实验中需要的数据。
并假定系统资源只有 64KB 主存、4 台磁带机、和 2 台打印机;
3.分析算法:
4.采用响应比高者优先算法的作业调度程序流程图
指针 p 后移:
s=p;
p=jcbtable[p].next
开始
P 指向作业队列的列首 P=head
q=s= -1
P 没有空
Y
N
找到满足条件的
作业(q!= -1)?
N
N
系统可用资源是否
满足作业需求?
Y
结束
Y
计算 p 指向作
业 的 响 应 比
q 是 作 业 队 列 的 第 一
个?
Y
P 是 第 一 个 满 足
必 要 条 件 的 作 业
Y
q=p;t=s;k=xk
从作业队列摘下 q:
Head=jcbtable
从作业队列摘下 q:
Jcbtable[t].next=
Jcbtable[q].next
为作业 q 分配资源:
分配主存空间;分配磁带机;
分配打印机;并输出作业名
head=jobtable[head].next;
else
jobtable[t].next=jobtable[q].next;
//为作业 q 分配资源:分配内存空间;分配磁带机;分配打印机
memory=memory-jobtable[q].length;
tape=tape-jobtable[q].tape;
printer=printer-jobtable[q].printer;
printf("选中作业的作业名:%s\n",jobtable[q].name);
}
}while(q!=-1);
}
main()
{char name[4];
int size,tcount,pcount,wtime,rtime;
int p=0;
//系统数据初始化
memory=65536;
tape=4;
printer=2;
head=-1;
printf("输入作业相关数据(以作业大小为负数停止输入):\n");
//输入数据,建立作业队列
printf("输入作业名,作业大小,磁带机数,打印机数,等待时间,估计执行时间\n");
scanf("%s%d%d%d%d%d",name,&size,&tcount,&pcount,&wtime,&rtime);
while(size!=-1)
{ //创建 JCB
if(jobcount
scanf("%s%d%d%d%d%d",name,&size,&tcount,&pcount,&wtime,&rtime);
}//while
shedule();
}//main()函数结束
6.上机调试并运行,某次运行结果如下:
实验总结:
该实验是一个作业调度算法的模拟程序实验,在实验操作过程中我在调度算法这个
函数上花了很多的时间,才达到了实验预定的目的。虽然只是一个模拟,但使我对响应
比高者优先这种作业调度算法有了更深层次的题解,通过 C 语言的实现,也使我对其它
的算法有了一种理论与实践结合的思想,从本质上掌握各种算法理论。同样的作业调度
算法还有先来先服务、短作业优先等常用算法,本次的实验也促使我更深入去了解这些
其它的常用算法。
实验二 单处理机系统的进程调度
实验目的:
1.加深对进程概念的理解,明确进程和程序的区别。
2.深入了解系统如何组织进程,创建进程。
3.进一步认识如何实现处理机调度。
实验要求:
利用 C 语言程序模拟单处理机系统的进程调度,要求采用时间片轮转调度算法。
实验设备及环境:
Pc 机一台,vc6.0 for windows
实验步骤:
1.确定进程控制块的内容和组成方式;
2.完成进程创建原语和进程调度原语;
3.分析流程:
进程创建流程图
开始
空 闲 进 程 控 制
N
取空闲进程控制块队列的第一个 i=pfree
Y
进程创建失败
pfree 后移:
pfree=pcbarea[pfree].next
就绪队列为空?
N
挂入就绪队列:
pcbarea[ready.tiail].next=i
ready.tail=i
pcbarea[ready.tiail].next=-1
填写该进程控制快内容:
pcbarea[i].name=name
pcbarea[i].status=aready
初始化进程控制块内现场信息
挂入就绪队列:
ready.head=i
ready.tail=i
pcbarea[ready.tiail].next=-1
Y
结束
进程调度流程图
开始
Y
就绪队列为空?
N
就绪队列头指针赋给 i
i=ready.head
就绪队列指针后移
Ready.head=pcbareaa[ready.head].next
无进程可以调度
就绪队列空?
N
Y
就绪队列尾指针置为空:
ready.tail=-1
修改进程控制快状态
pcbarea[i].status=running
设置相对时钟寄存器
TIME=时间片
恢复该进程现场信息:
AX=ax;BX=bx;CX=cx;
DX=dx;PC=pc;
PSW=psw
修改指向运行进程的指针 run=i
4.编写模拟程序,源代码如下:
#include
#define running 1
#define aready 2
#define blocking 3
#define sometime 5
#define n 10
struct
{int name;
int status;
int ax,bx,cx,dx;
int pc;
int psw;
int next;
}pcbarea[n];
int PSW,AX,BX,CX,DX,PC,TIME;
int run;
struct
{int head;
int tail;
}ready;
int pfree;
void sheduling()
{
int i;
if(ready.head==-1)
{printf("无就绪进程\n");
return;
}
i=ready.head;
ready.head=pcbarea[ready.head].next;
if(ready.head==-1)ready.tail=-1;
pcbarea[i].status=running;
TIME=sometime;
AX=pcbarea[run].ax;
BX=pcbarea[run].bx;
CX=pcbarea[run].cx;
DX=pcbarea[run].dx;
PC=pcbarea[run].pc;
PSW=pcbarea[run].psw;
run=i;
}
void create(int x)
{int i;
if(pfree==-1)