目录
一、实验目的:
二、实验内容:
三、实验代码(C语言):
FCFS调度算法:
SJF调度算法:
一、实验目的:
编写程序,实现FCFS作业调度算法和SJF作业调度算法,模拟作业调度过程,加深对作业调度的理解。
二、实验内容:
实现SJF调度算法。实验要求:
1、设计作业控制块(JCB)的数据结构
–应包含实验必须的数据项,如作业ID、需要的服务时间、进入系统时间、完成时间,以及实验者认为有必要的其他数据项。
2、实现排序算法(将作业排队)
–策略1:按“进入系统时间”对作业队列排序(FCFS)
–策略2:按“需要的服务时间”对作业队列排序(SJF)
3、实现调度过程模拟
(1)每个作业用一个JCB表示,按步骤2方法作业排队,
(2)选择队首的作业,将其从后备队列移出
(3)(作业运行过程,在本实验中,无需实现,可认为后备队列上的作业一但被调度程序选出,就顺利运行完毕,可以进入第4步)
(4)计算选中作业的周转时间
(5)进行下一次调度(去往第2步)
4、实现结果输出
– 输出作业状态表,展示调度过程
- 初始作业状态(未调度时)
- 每次调度后的作业状态
三、实验代码(C语言):
FCFS调度算法:
#include
#include
typedef struct PCB{
int id;
int arrivetime;
int runtime;
struct PCB* next;
}*task,pcb;
pcb* creattask(int a,int b,int c){
task newtask=(task)malloc(sizeof(pcb));
newtask->id=a;
newtask->arrivetime=b;
newtask->runtime=c;
newtask->next=NULL;
return newtask;
}
void deltask(pcb *n,int a){
task d;
if(n!=NULL){
while(n->next->id!=a){
n=n->next;
}
d=n->next;
n->next=d->next;
free(d);
}
}
void count(pcb* n,int t){
pcb *q,*p;
int temp=t;float time=0;
float zt=0,dt=0;
while(t!=0){
p=n->next;
q=p;
while(p!=NULL){
if(p->arrivetimearrivetime){
q=p;
}
p=p->next;
}
printf("当前执行的任务序号为 %d n",q->id);
if(time<=q->arrivetime)
time=q->runtime+q->arrivetime;
else
time=time+q->runtime;
printf("该任务周转时间为 %.0f n",time-q->arrivetime);
zt=zt+time-q->arrivetime;
printf("该任务带权周转时间为 %.2f nn",(time-q->arrivetime)/q->runtime);
dt=dt+(time-q->arrivetime)/q->runtime;
deltask(n,q->id);
--t;
}
printf("n");
printf("平均周转时间为 %.2f n",zt/temp);
printf("平均带权周转时间为 %.2f n",dt/temp);
}
int main(){
int n,i,x,y;
task tail=NULL;
task head=NULL;
printf("请输入任务数量:");
scanf("%d",&n);
tail=(task)malloc(sizeof(pcb));
head=tail;
for(i=1;i<=n;i++){
printf("请输入第%d个任务的到达时间、运行时间:",i);
scanf("%d%d",&x,&y);
tail->next=creattask(i,x,y);
tail=tail->next;
}
count(head,n);
}
#include#include typedef struct PCB{ int id; int arrivetime; int runtime; struct PCB* next; }*task,pcb; pcb* creattask(int a,int b,int c){ task newtask=(task)malloc(sizeof(pcb)); newtask->id=a; newtask->arrivetime=b; newtask->runtime=c; newtask->next=NULL; return newtask; } void deltask(pcb *n,int a){ task d; if(n!=NULL){ while(n->next->id!=a){ n=n->next; } d=n->next; n->next=d->next; free(d); } } void count(pcb* n,int t){ pcb *q,*p; int temp=t;float time=0; float zt=0,dt=0; while(t!=0){ p=n->next; q=p; while(p!=NULL){ if(p->arrivetime arrivetime){ q=p; } p=p->next; } printf("当前执行的任务序号为 %d n",q->id); if(time<=q->arrivetime) time=q->runtime+q->arrivetime; else time=time+q->runtime; printf("该任务周转时间为 %.0f n",time-q->arrivetime); zt=zt+time-q->arrivetime; printf("该任务带权周转时间为 %.2f nn",(time-q->arrivetime)/q->runtime); dt=dt+(time-q->arrivetime)/q->runtime; deltask(n,q->id); --t; } printf("n"); printf("平均周转时间为 %.2f n",zt/temp); printf("平均带权周转时间为 %.2f n",dt/temp); } int main(){ int n,i,x,y; task tail=NULL; task head=NULL; printf("请输入任务数量:"); scanf("%d",&n); tail=(task)malloc(sizeof(pcb)); head=tail; for(i=1;i<=n;i++){ printf("请输入第%d个任务的到达时间、运行时间:",i); scanf("%d%d",&x,&y); tail->next=creattask(i,x,y); tail=tail->next; } count(head,n); }



