目录
一、实验目的:
二、实验内容:
三、实验代码(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、实现结果输出
– 输出作业状态表,展示调度过程
- 初始作业状态(未调度时)
- 每次调度后的作业状态
#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 \n\n",(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);
}
SJF调度算法:
#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 x) {
task d;
if(n != NULL){
while(n -> next -> id !=x){
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 < q->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 \n",(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);
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)