📄 作业调度fcfs.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 + -