欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OS作业调度C语言实现

程序员文章站 2022-06-22 09:52:35
...

SJF、FCFS、FPF算法:

#include "stdio.h"
#include "stdlib.h"
#include "stdio.h"
#include "conio.h"
#define getjcb(type) (type*)malloc(sizeof(type))



int n = 0, time = 0; float eti, ewi;
struct jcb {
	char name[10]; /* 作业名 */
	char state; /* 作业状态 */
	int pn; /*优先级*/
	int ts; /* 提交时间 */
	int tb; /* 开始运行时间 */
	int tc; /* 完成时间 */
	float ti; /* 周转时间 */
	float wi; /* 带权周转时间 */
	int ntime; /* 作业所需运行时间 */
	char resource[10]; /* 所需资源 */
	struct jcb *link; /* 结构体指针 */
} *p, *q, *head = NULL;
typedef struct jcb JCB;
void initial() {
	int i;
	printf("\nInput jcb num\n");
	scanf("%d", &n);
	printf("Input\nname\tpn\tts\tntime\tresource\n");
	for (i = 0; i < n; i++) {
		p = getjcb(JCB);
		scanf("%s\t%d\t%d\t%d\t%s", &p->name,&p->pn, &p->ts, &p->ntime, &p->resource);
		p->state = 'W';
		p->link = NULL;
		if (head == NULL) head = q = p;
		else {
			q->link = p;
			q = p;
		}
	}
}
void print(JCB *pr) {
	JCB *p=(JCB*)malloc(sizeof(*pr));
	printf("\ntime=%d", time);
	printf("\nname\tstate\tpn\tts\tntime\tsource\ttb\ttc\tti\twi\n");
	printf("%s\t%c\t%d\t%d\t%s\t%d\t%d\t%4.2f\t%4.2f\t%d\n",
		pr->name, pr->state, pr->ts, pr->ntime, pr->resource, pr->tb, pr->tc, pr->ti, pr->wi,p->pn );
	p = head;
	do {
		if (p->state == 'W')
			printf("%s\t%c\t%d\t%d\t%s\t%d\n",
				p->name, p->state, p->ts, p->ntime, p->resource, p->pn);
		p = p->link;
	} while (p != NULL);
	p = head;
	do {
		if (p->state == 'F')
			printf("%s\t%c\t%d\t%d\t%s\t%d\t%d\t%4.2f\t%4.2f\t%d\n",
				pr->name, pr->state, pr->ts, pr->ntime, pr->resource, pr->tb, pr->tc, pr->ti, pr->wi, p->pn);
		p = p->link;
	} while (p != NULL);
}
void running(JCB *p) {                                             //计算
	p->tb = time; p->state = 'R';
	p->tc = p->tb + p->ntime;
	p->ti = (float)(p->tc - p->ts);
	p->wi = (float)(p->ti / p->ntime);
	eti += p->ti;
	ewi += p->wi;
	print(p);
	time += p->ntime;
	p->state = 'F';
	printf("\n%s has been finished!\npress any key to continue...\n", p->name);
	_getch();
}
void last() {
	eti /= n; ewi /= n;
	printf("\neti=%7.3f\tewi=%7.3f\n", eti, ewi);
}
void sjf() {                                                    
	JCB *min;
	int i, iden;
	for (i = 0; i < n; i++) {
		p = min = head; iden = 1;
		do {
			if (p->state == 'W'&&p->ts <= time)                  //查找短时间
				if (iden) {
					min = p; iden = 0;
				}
				else if (p->ntime < min->ntime) min = p;
			p = p->link;
		} while (p != NULL);
		if (iden) {
			i--; printf("\ntime=%d:\tno JCB submib...wait...", time); time++;
			if (time > 100) { printf("\nruntime is too long...error"); _getch(); }
		}
		else {
			running(min);
		}
	}
}
void fcfs() {
	JCB *min;
	int i, iden;
	for (i = 0; i < n; i++) {
		p = min = head; iden = 1;
		do {
			if (p->state == 'W'&&p->ts <= time)
				if (iden) {
					min = p; iden = 0;
				}
				else if (p->ts < min->ts) min = p;
			p = p->link;
		} while (p != NULL);
		if (iden) {
			i--; printf("\ntime=%d:\tno JCB submib...wait...", time); time++;
			if (time > 100) { printf("\nruntime is too long...error"); _getch(); }
		}
		else {
			running(min);
		}
	}
}
void fpf() {
	JCB *min;
	int i, iden;
	for (i = 0; i < n; i++) {
		p = min = head; iden = 1;
		do {
			if (p->state == 'W'&&p->ts <= time)                  //查找短时间
				if (iden) {
					min = p; iden = 0;
				}
				else if (p->pn <min->pn)
					min = p;
			p = p->link;
		} while (p != NULL);
		if (iden) {
			i--; printf("\ntime=%d:\tno JCB submib...wait...", time); time++;
			if (time > 100) { printf("\nruntime is too long...error"); _getch(); }
		}
		else {
			running(min);
		}
	}
}

void runjcb(int m) {
	printf("\n\nstart running jcb use algorithm %d.", m);
	switch (m) {
	case 1:fcfs(); break;
	case 2:sjf(); break;
	case 3:fpf(); break;
	default:printf("\nrunjcb error...\n"); exit(1);
	}
}
void start() {
	int m;
	char str[100] = "\nselect algorithm\n1.FCFS\n2.SJF\n3.FPF\n";
	printf("%s", str);
	m = _getch() - 48;
	initial();
	if (1 <= m && m <= 3) runjcb(m);
	else {
		printf("\nselect error!try again...\n");
		start();
	}
	last();
}
int main() {
	start();
	printf("\nfinished!");
	_getch();
	return 0;
}
 

计算结果:

FCFS:

OS作业调度C语言实现

SJF:

OS作业调度C语言实现

FPF:

OS作业调度C语言实现

 

第三个FPF实现有问题,带权周转时间wi不能正确计算,烦请大佬看看吧

相关标签: OS