p=qf2;
qf2=qf2->next;p->next=NULL; blog2--;
printf(\ %-10s%-10d%\\n\ a=run(p,qf3,ql3); if(a==1)
blog3++; }
else if(blog3>0) /*第三个队列不为空*/ { }
p=qf3;
qf3=qf3->next;p->next=NULL;
blog3--;
printf(\ %-10s%-10d%\\n\ a=run(p,qf3,ql3); if(a==1) blog3++;
}
} /*使用getchar()函数可以让输出时停留画面,等待人按回车继续*/ void main() { qf1=ql1=(PCB *)malloc(sizeof(PCB)); }
qf2=ql2=(PCB *)malloc(sizeof(PCB)); qf2=ql2=(PCB *)malloc(sizeof(PCB)); int n;
blog1=blog2=blog3=0;
printf(\请输入进程的个数: \scanf(\create(n); prt();
2.4.4测试结果及说明
2.5.短作业调度
2.5.1.算法思想
短作业优先调度算法是指对短作业进行调度的算法。它从后备队列总选择一个或若干
个运行时间最短的作业,将他们调入内存运行。
2.5.2.算法流程图:
短作业优先算法流程图 执行程序 N 按时间服务进行排序 就绪队列空? Y 结束 输入进程名 开始 2.5.3.程序代码
#include
typedef struct node
{ char name[10]; /*进程名*/ int cputime; /*占用cpu时间*/ int needtime; /*要求运行时间*/
char state; /*状态*/ struct node *next; /*指针*/
}PCB;
PCB *ready, *run, *finish; //就绪、执行、结束指针 int N; //进程数量 void print() //输出函数 {
PCB *p;
printf(\ NAME CPUTIME NEEDTIME STATUS\\n\if(run != NULL) printf(\ %-10s%-10d%-10d %c\\n\
run->name, run->cputime, run->needtime,
run->state); /*输出执行的进程的信息*/
p=ready;
while(p != NULL) { printf(\ %-10s%-10d%-10d %c\\n\ p->name, }
p->cputime, p->needtime,
p->state); /*输出就绪进程的信息*/
p=p->next;
p=finish;
while(p != NULL) {
printf(\ %-10s%-10d%-10d %c\\n\
p->name, p->cputime,
p->needtime, p->state); /*输出结束队列的信息*/ p=p->next;
}
getchar(); /*使用getchar()函数可以让输出时停留画面, 等待人按回车继续*/
}
void insert(PCB *q) /*插入新进程,把进程按进程到来时间大小排序*/
{
PCB *p1,*s,*r; int b;
s=q; /*指针s指向新要插入的进程*/
p1=ready; /*指针p1指向原来的进程队列的队首*/ r=p1; /*使用指针r是指向p1前面的进程*/ b=1;
while((p1!=NULL)&&b) if(p1->needtime
{
r=p1; p1=p1->next;
} /*新进程的开始时间大,则p1 指向下一个进程继续比*/ else b=0; if(r!=p1) {
r->next=s; s->next=p1;
} /*新进程找到位置,插在r和p1之间*/ else {
s->next=p1; ready=s;
} /*新进程的开始时间按最小,插在队首,并修改就绪队首ready指针*/
}
void create() {
PCB *p; int i;
ready=NULL; run=NULL; finish=NULL;
printf(\ /*输入进程名、运行时间和开始时间*/
for(i=0;i scanf(\ /*输入进程要求运行时间*/ p->cputime=0; p->state='W'; /*表示就绪队列中未在队首先执行,但也是就绪状态*/ if (ready!=NULL) insert(p); /*就绪队首不为NULL,插入新进程*/ else { /*否则先插在NULL前*/ p->next=ready; ready=p; } } printf(\ Display is going to start: \\n\ printf(\print(); getchar(); run=ready; /*队列排好,run指向就绪队列队首*/ ready=ready->next; /*ready指向下一个进程*/ run->state='R'; /*队首进程的状态为就绪*/ } void SJF() { } while(run != NULL) { } run->cputime=run->cputime+run->needtime; run->needtime=0; run->next=finish; finish = run; run->state='E'; run = NULL; if(ready != NULL) { run = ready; run->state='R'; } ready=ready->next; print(); void main() { } printf(\scanf(\ create(); /*模拟创建进程,并输入相关信息*/ SJF(); /*短作业优先调度算法*/ 2.5.4.测试结果截图及操作说明 首先输入2个控制进程快,分别命名s1和s2 ,并且时间分别是2和5.短作业优先调度算法运行情况如4-7到4-9所示