FCFS概念介绍 FCFS,全称First come First Serve,中文名:先来先调度算法。
优点:简单,易实现;
缺点:对短作业不公平;
FCFS代码实现
FCFS算法的实现步骤:CreateProcessQueue模块实现思路:
1.确定进程块的变量
2.创建进程队列,可以用链表等等
3.依次计算每个进程并删除,输出
- 利用循环体,创建进程并初始化;
- 利用链表,将每个进程相关联;
- 分情况,按有头节点和没头节点讨论,要注意每个进程的存储空间用p指针指向,所以p的值在每次循环中都会改变,不能用来指向下一个元素位置,这里用q来当游标;
- 利用循环体和if判断,确定进程是否被调度,未被调度则状态为‘f’,调用run模块调度;
- 将状态改为‘t’,表示已调度,这里我进行了修改,进程调度完就删掉;
- 计算周转时间,带权周转时间;
#include.h>
#include.h>
#include
//进程控制块,数据结构 —结构体
typedef struct PCB{
char PcbName[10];
int PcbNo;
char State;
int ArrivalTime;
int StartTime;
int ServeTime;
int EndTime;
int TurnaroundTime;
float TakePowerTime;
struct PCB *next;
}PCB;
PCB *head = NULL,*q,*p;
//头节点
int time;
//计时器
int n;
//进程数//创建进程队列,采用链表结构
void CreateProcessQueue(){
printf("创建进程数:\n");
scanf("%d",&n);
for(int i=0;
iStartTime = 0;
p->EndTime = 0;
p->TurnaroundTime = 0;
p->TakePowerTime = 0;
p->State = 'f';
p->ArrivalTime = 0;
printf("进程编号 进程名 到达时间 服务时间\n");
scanf("%d %s %d %d",&p->PcbNo,&p->PcbName,&p->ArrivalTime,&p->ServeTime);
if(head==NULL)
{
head=p;
q=p;
time=p->ArrivalTime;
}else{
q->next=p;
p->next=NULL;
q=p;
}
}
} void run(PCB *temp){
temp->State = 't';
time = temp->ArrivalTime>time?temp->ArrivalTime:time;
temp->StartTime = time;
temp->EndTime = temp->ServeTime+temp->StartTime;
time = temp->EndTime;
temp->TurnaroundTime = temp->EndTime-temp->ArrivalTime;
temp->TakePowerTime = temp->TurnaroundTime/temp->ServeTime;
printf("进程编号 进程名 开始时间 结束时间 周转时间 带权周转时间\n");
printf("%d%s%d%d%d%d\n",temp->PcbNo,temp->PcbName,temp->StartTime,temp->EndTime,temp->TurnaroundTime,temp->TakePowerTime);
p = temp->next;
}//First Come First Serve
void FCFS(){
p = head;
for(int i=0;
iState == 'f'){
run(p);
}
}
}int main(){
CreateProcessQueue();
FCFS();
return 0;
}
文章图片