*** 作系统实验一:短作业优先作业调度算法(C语言)

 *** 作系统实验一:短作业优先作业调度算法(C语言),第1张

目录

         一、实验目的:

二、实验内容:

三、实验代码(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 \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);
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1296117.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存