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

FCFS概念介绍

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

FCFS代码实现

FCFS算法的实现步骤:
1.确定进程块的变量
2.创建进程队列,可以用链表等等
3.依次计算每个进程并删除,输出

CreateProcessQueue模块实现思路:

  • 利用循环体,创建进程并初始化;
  • 利用链表,将每个进程相关联;
  • 分情况,按有头节点和没头节点讨论,要注意每个进程的存储空间用p指针指向,所以p的值在每次循环中都会改变,不能用来指向下一个元素位置,这里用q来当游标;

FCFS模块实现思路:

  • 利用循环体和if判断,确定进程是否被调度,未被调度则状态为‘f’,调用run模块调度;

run模块实现思路:

  • 将状态改为‘t’,表示已调度,这里我进行了修改,进程调度完就删掉;
  • 计算周转时间,带权周转时间;

FCFS完整调度算法代码:

#include<stdio.h>
#include<stdlib.h>
#include<cstring>
//进程控制块,数据结构 —结构体 
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;i<n;i++){
		p=(PCB *)malloc(sizeof(PCB));
		p->StartTime = 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;i<n;i++){
		if(p->State == 'f'){
			run(p);
		}
	}
}

int main(){
	CreateProcessQueue();
	FCFS();
	return 0;
} 


调度算法—FCFS调度算法详解_第1张图片

你可能感兴趣的:(操作系统)