栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

目录

         一、实验目的:

二、实验内容:

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

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);
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/921074.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号