调度算法—FCFS调度算法详解

FCFS概念介绍 FCFS,全称First come First Serve,中文名:先来先调度算法。
优点:简单,易实现;
缺点:对短作业不公平;
FCFS代码实现

FCFS算法的实现步骤:
1.确定进程块的变量
2.创建进程队列,可以用链表等等
3.依次计算每个进程并删除,输出
CreateProcessQueue模块实现思路:
  • 利用循环体,创建进程并初始化;
  • 利用链表,将每个进程相关联;
  • 分情况,按有头节点和没头节点讨论,要注意每个进程的存储空间用p指针指向,所以p的值在每次循环中都会改变,不能用来指向下一个元素位置,这里用q来当游标;
FCFS模块实现思路:
  • 利用循环体和if判断,确定进程是否被调度,未被调度则状态为‘f’,调用run模块调度;
【调度算法—FCFS调度算法详解】run模块实现思路:
  • 将状态改为‘t’,表示已调度,这里我进行了修改,进程调度完就删掉;
  • 计算周转时间,带权周转时间;
FCFS完整调度算法代码:
#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; }

调度算法—FCFS调度算法详解
文章图片

    推荐阅读