}*ready=NULL,*p。 typedef struct PCB。
sort(> /* 建立对进程进行优先级排列函数*/ {
PCB *first, *second。 int insert=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。 } }
input(> /* 建立进程控制块函数*/ {
int i,num。
//clrscr(>。 /*清屏*/
printf(\请输入进程号?\。 scanf(\。 for(i=0。i
printf(\进程号No.%d:\\n\。 p=getpch(PCB>。
printf(\输入进程名:\。 scanf(\。
printf(\输入进程优先数:\。 scanf(\。
printf(\输入进程运行时间:\。 scanf(\。 printf(\。
p->rtime=0。p->state='w'。 p->link=NULL。
sort(>。 /* 调用sort函数*/ } }
int space(> {
int l=0。 PCB* pr=ready。 while(pr!=NULL> { l++。
pr=pr->link。 }
return(l>。 }
disp(PCB * pr> /*建立进程显示函数,用于显示当前进程*/ {
printf(\。 printf(\。 printf(\。 printf(\。 printf(\。 printf(\。 printf(\。 }
check(> /* 建立进程查看函数 */ {
PCB* pr。
printf(\当前正在运行的进程是:%s\。 /*显示当前运行进程*/ disp(p>。 pr=ready。
printf(\当前就绪队列状态为:\\n\。 /*显示就绪队列状态*/
while(pr!=NULL> {
disp(pr>。 pr=pr->link。 } }
destroy(> /*建立进程撤消函数(进程运行结束,撤消进程>*/ {
printf(\进程 [%s] 已完成.\\n\。 free(p>。 }
running(> /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ {
(p->rtime>++。
if(p->rtime==p->ntime>
destroy(>。 /* 调用destroy函数*/ else {
(p->super>--。 p->state='w'。
sort(>。 /*调用sort函数*/ } }
main(> /*主函数*/ {
int len,h=0。 char ch。 input(>。 len=space(>。
while((len!=0>&&(ready!=NULL>> {
ch=getchar(>。 h++。
printf(\。 p=ready。
ready=p->link。 p->link=NULL。 p->state='R'。 check(>。 running(>。
printf(\按任一键继续......\。
ch=getchar(>。 }
printf(\进程已经完成.\\n\。 ch=getchar(>。 }
六、注意事项
因为程序长而且有难度,所以在设计实验时,要细心,多次调试。
七、思考题
实验三 批处理系统中作业调度
一、实验目的
模拟批处理系统中的作业调度,以加深对作业调度的概念的理解.
二、实验类型<含验证型、设计型或综合型)
设计型
三、实验仪器
一台安装Windows操作系统及C语言编译程序的pc机
四、实验原理 五、实验方法与步骤
#include
typedef struct jcb {
char name[4]。 /*作业名*/
int length。 /*作业长度,所需主存大小*/ int printer。 /*作业执行所需打印机的数量*/ int tape。 /*作业执行所需磁带机的数量*/ int runtime。 /*作业估计的执行时间*/
int waittime。 /*作业在输入井中的等待时间*/
struct jcb *next。/*指向下一个作业控制块的指针*/ }JCB。 /*作业控制块类型定义*/
JCB *head。 /*作业队列头指针定义*/ int tape,printer。 long memory。
shedule( > /*作业调度函数*/ {