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

📄 job.cpp

📁 操作系统分页存储管理
💻 CPP
字号:
//      实验二 作业调度
//   单道批处理系统的作业等待模拟程序
//   采用先来先服务(FCFS),最短作业优先(SJF)的作业调度算法
//   Copyright 2008 , by freedomer

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

struct jcb {					    /*定义作业控制块JCB */ 
	char name[10];                  /*作业名*/
	char state;                     /*作业状态*/
	int need_t;                     /*作业需要运行时间*/
	int submit_t;                   /*作业提交时刻*/
	struct jcb* link; 
}*ready=NULL,*p; 

typedef struct jcb JCB; 

int choose;                         /*选择算法记录*/

int begin_t=0,                      /*开始运行时刻,设定第一个作业的为0时刻*/
    finish_t;                       /*完成时刻*/
float turnover_t,                   /*周转时间*/
	  with_t,                       /*带权时间*/
	  sumturnover_t=0.0,            /*各个作业周转时间和*/
      sumwith_t=0.0,                /*各个作业带权时间和*/
	  advturnover_t,                /*平均周转时间*/
	  advwith_t;                    /*平均带权时间*/

void sort() {						/*建立作业用某个算法进行排列函数*/ 
	JCB *first, *second; 
	int insert=0; 
	if(choose==1) {                     /*FCFS算法*/
		if((ready==NULL)||((p->submit_t)<(ready->submit_t))) {
										/*提交时间最早者,插入队首*/  
			p->link=ready; 
			ready=p; 
		} 
		else {                          /*作业比较提交时间,插入适当的位置中*/  
		first=ready; 
		second=first->link; 
		while(second!=NULL) { 
			if((p->submit_t)<(second->submit_t)) {
										/*若插入作业比当前作业提交时间早,*/ 
										/*插入到当前作业前面*/ 
				p->link=second; 
				first->link=p; 
				second=NULL; 
				insert=1; 
			} 
			else {                      /*插入作业提交时间最晚,则插入到队尾*/ 
				first=first->link; 
				second=second->link; 
			} 
		} 
		if(insert==0) 
			first->link=p; 
		} 
	}
	else if(choose==2) {                /*SJF算法*/
		if((ready==NULL)||((p->need_t)<(ready->need_t))) {
										/*运行时间最少者,插入队首*/  
			p->link=ready; 
			ready=p; 
		} 
		else {                          /*作业比较运行时间,插入适当的位置中*/  
		first=ready; 
		second=first->link; 
		while(second!=NULL) { 
			if((p->need_t)<(second->need_t)) {
										/*若插入作业比当前作业运行时间更少,*/ 
										/*插入到当前作业前面*/ 
				p->link=second; 
				first->link=p; 
				second=NULL; 
				insert=1; 
			} 
			else {                      /*插入作业运行时间最多,则插入到队尾*/ 
				first=first->link; 
				second=second->link; 
			} 
		} 
		if(insert==0) 
			first->link=p; 
		} 
	}
} 


void input() {						/*建立初始化作业控制块函数*/  
	int i,jobnum; 
	printf("\n 请输入要调度的作业个数?"); 
	scanf("%d",&jobnum); 
	for(i=0;i<jobnum;i++)  { 
		printf("\n 作业号No.%d:\n",i); 
		p=getjcb(JCB); 
		printf("\t 输入作业名:"); 
		scanf("%s",p->name);  
		printf("\t 输入作业所需的运行时间:"); 
		scanf("%d",&p->need_t); 
		p->submit_t=i;               /*提交时间根据输入顺序累加1*/
		p->state='w'; 
		p->link=NULL; 
		sort();                      /*调用sort函数*/ 
	} 
} 


int space() {
	int l=0; JCB* pr=ready; 
	while(pr!=NULL) { 
		l++; 
		pr=pr->link; 
	} 
	return(l); 
} 


void disp(JCB * pr) {                 /*建立作业显示函数,用于显示当前作业*/ 
	printf("\n qname \t state \t needtime \t submittime \n"); 
	printf("|%s\t",pr->name); 
	printf("|%c\t",pr->state); 	
	printf("|%d\t\t",pr->need_t); 
	printf("|%d:00",pr->submit_t);
	printf("\n"); 
}

 
void check() {                        /*建立作业查看函数 */  
	JCB* pr; 
	printf("\n **** 当前正在运行的作业是:%s",p->name); 
									  /*显示当前运行作业*/ 
	disp(p); 
	pr=ready; 
	printf("\n ****当前就绪队列状态为:\n"); 
	                                  /*显示就绪队列状态*/ 
	while(pr!=NULL) { 
		disp(pr); 
		pr=pr->link; 
	} 
} 


void destroy() {                      /*建立作业撤消函数(作业运行结束,撤消作业)*/ 
	printf("\n 作业 [%s] 已完成.\n",p->name);
	printf("此作业的相关时间如下:\n");
	printf("开始时刻:%d:00\n",begin_t);
	printf("完成时刻:%d:00\n",finish_t);
	printf("周转时间:%.3f\n",turnover_t);
	printf("带权周转时间:%.3f\n",with_t);
	begin_t=begin_t+p->need_t;        /*下个作业的开始时间=前一个作业开始时间+其运行时间*/
	free(p);
	p->link=NULL;
}

 
void running() {                      /*计算在运行的作业的相应的时间,并将它释放*/  
	finish_t=begin_t+p->need_t; 
	turnover_t=finish_t-p->submit_t;
	with_t=turnover_t/p->need_t;
    sumturnover_t+=turnover_t;
	sumwith_t+=with_t;
	destroy();                        /*调用destroy函数*/ 
	
} 

void main() {                         /*主函数*/ 
	int len,h=0; 
	char ch; 
	printf("\n\n\t1.先来先服务算法(FCFS)\n\n\t2.最短作业优先算法(SJF)\n");
	printf("\n请选择所需要的算法...\n");
	scanf("%d",&choose);
	if((choose!=1)&&(choose!=2)) {
		printf("选择错误!\n");
		exit;
	}
	else {
		input(); 
		len=space(); 
		while((len!=0)&&(ready!=NULL)) { 
			ch=getchar(); 
			h++; 
			printf("\n The execute number:%d \n",h); 
			p=ready; 
			ready=p->link; 
			p->link=NULL; 
			p->state='R'; 
			check(); 
			running(); 
			printf("\n 按任一键继续......"); 
			ch=getchar(); 
		} 
		printf("\n **所有作业都已经完成.**\n这组作业的相关时间如下:\n");
		advturnover_t=sumturnover_t/len;      /*组平均周转时间*/
		advwith_t=sumwith_t/len;              /*组带权平均周转时间*/
		printf("组平均周转时间:%.3f\n组带权平均周转时间:%.3f\n",advturnover_t,advwith_t);
		ch=getchar(); 
	}
}

⌨️ 快捷键说明

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