⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 作业调度fcfs.cpp

📁 操作系统实验 实验一 进程调度 实验二 作业调度 实验三(综合性) 主存空间的分配与回收 实验四 文件系统
💻 CPP
字号:
#include <iostream>
#include <conio.h>
#define getpch(type) (type *)malloc(sizeof(type))
#define INF 0x3fff
#define NULL 0

using namespace std;

struct jcb{		//作业控制块
	char name[10];			
	char state;				//状态:后备(w)、执行(r)、完成()
	int arrive;				//到达时间
	int ntime;				//需要运行时间
	int nres;				//需要的资源数
	struct jcb *link;
}*ready = NULL, *p;				//ready为后备队列队首,p为当前运行作业

typedef struct jcb JCB;

int now_time;
int resource;


struct tnb{
	char name[10];			
	int arrive;				//到达时间
	int finish;				//完成时间
	int nres;				//需要的资源数
	int cycle;				//周转时间
	double dcycle;				//带权周转时间
	struct tnb *link;
}*ans = NULL, *tail = NULL;

typedef struct tnb TNB;

//记录周转时间
void record()
{
	TNB *temp = (TNB *) malloc(sizeof(TNB));
	strcpy(temp->name, p->name);
	temp->nres = p->nres;
	temp->arrive = p->arrive;
	temp->finish = now_time;
	temp->cycle = temp->finish - temp->arrive;
	temp->dcycle = (double)temp->cycle/p->ntime;
	temp->link = NULL;
	if(ans == NULL){	
		ans = temp;
		tail = temp;
	}
	else {
		tail->link = temp;
		tail = temp;
	}
}

//按先来先服务排序
void sort()					
{
	JCB *first , * second;
	int insert = 0;
	if(ready == NULL || p->arrive < ready->arrive){	//最先到达
		p->link = ready;
		ready = p;
	}
	else {
		first = ready;
		second = first->link;
		while(second != NULL){
			if(p->arrive < second->arrive){
				p->link = second;
				first->link = p;
				second = NULL;
				insert = 1;
			}
			else{
				first = first->link;
				second = second->link;
			}
		}
		if(insert == 0)				//如果没插入队列(最慢到达),插到队尾
			first->link = p;
	}
	return ;
}

//建立作业控制块
void input()						
{
	int i, num;
	system("cls");
	printf("\n 请输入作业数?");
	scanf("%d", &num);
	for(i = 0; i < num; i++){
		printf("\n 作业号 No.%d:\n", i);
		p = getpch(JCB);
		printf("\n 输入作业名:");
		scanf("%s", p->name);
		printf("\n 输入作业到达时间:");
		scanf("%d", &p->arrive);
		printf("%n 输入作业运行时间:");
		scanf("%d", &p->ntime);
		printf("%n 输入作业需要资源:");
		scanf("%d", &p->nres);
		printf("\n");
		p->state = 'w';
		p->link = NULL;
		sort();
	}
	return ;
}


//计算作业数
int space()
{
	int l = 0; 
	JCB * pr = ready;
	while(pr != NULL){
		l++;
		pr = pr->link;
	}
	return l;
}


//显示传入pr作业
void disp(JCB *pr)
{
	printf("\n jname \t state \t arrive  ndtime  ndresource \n");
	printf("|%s\t", pr->name);
	printf("|%c\t", pr->state);
	printf("|%d\t", pr->arrive);
	printf("|%d\t", pr->ntime);
	printf("|%d\t", pr->nres);
	printf("\n");
	return ;
}



//作业查看
void check()
{
	JCB * pr;
	pr = ready;
	printf("\n **** 当前就绪队列状态为:\n");
	while(pr != NULL){
		disp(pr);
		pr = pr->link;
	}
	printf("\n **** 当前正在运行的作业是:%s", p->name);
	disp(p);
	resource -= p->nres;
	printf("\n 当前所剩资源:%d", resource);
	return ;
}


//撤销作业
void destroy()
{
	printf("\n 作业 [%s] 已完成。\n", p->name);
	resource += p->nres;							//释放资源
	free(p);
	return;
}


//运行p作业
void running()
{
	now_time += p->ntime;
	record();
	destroy();
	return ;
}

void print()
{
	TNB *tp;
	tp = ans;
	printf("\n **** 各个作业的周转时间为:\n");
	while(tp != NULL){
		printf("\n 作业名  到达时间  完成时间   需用资源  周转时间  带权周转时间\n");
		printf("|%s\t", tp->name);
		printf("|%d\t", tp->arrive);
		printf("  |%d\t", tp->finish);
		printf("     |%d\t", tp->nres);
		printf("       |%d\t", tp->cycle);
		printf("   |%.4f", tp->dcycle);
		printf("\n");
		tp = tp->link;
	}
	return ;
}


int main()
{	
	int len;
	now_time = 0;
	resource = INF;
	char ch;
	input();
	len = space();
	while(len != 0 && ready != NULL){
		ch = getchar();
		now_time++;
		p = ready;
		while(now_time < p->arrive)
			now_time++;
		printf("\n 系统时间:%d\n", now_time);
		ready = p->link;                        //预先设置作业能完成后的ready
		p->link = NULL;
		p->state = 'r';
		check();			
		//运行队首作业
		running();
		printf("\n 按任一键继续......");
		ch = getchar();
		system("cls");
	}
	print();
	ch = getchar();
	return 0;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -