调度算法—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;
} 


在这里插入图片描述

  • 8
    点赞
  • 134
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
Java实现FCFS调度算法的步骤如下: 1. 定义进程类Process,包括进程ID、进程到达时间、进程服务时间等属性。 2. 定义一个存储所有进程的队列,按照到达时间从小到大排序。 3. 定义一个当前时间变量,初始值为0。 4. 循环遍历队列中的所有进程,根据当前时间和进程到达时间的差值确定进程的等待时间,更新当前时间,计算进程的完成时间和周转时间。 5. 计算所有进程的平均周转时间和平均带权周转时间。 以下是Java代码实现: ```java import java.util.*; class Process { private int id; // 进程ID private int arrivalTime; // 到达时间 private int serviceTime; // 服务时间 private int waitingTime; // 等待时间 private int finishTime; // 完成时间 public Process(int id, int arrivalTime, int serviceTime) { this.id = id; this.arrivalTime = arrivalTime; this.serviceTime = serviceTime; } public int getId() { return id; } public int getArrivalTime() { return arrivalTime; } public int getServiceTime() { return serviceTime; } public int getWaitingTime() { return waitingTime; } public void setWaitingTime(int waitingTime) { this.waitingTime = waitingTime; } public int getFinishTime() { return finishTime; } public void setFinishTime(int finishTime) { this.finishTime = finishTime; } } public class FCFS { public static void main(String[] args) { List<Process> queue = new ArrayList<>(); // 进程队列 Scanner scanner = new Scanner(System.in); System.out.print("请输入进程数:"); int n = scanner.nextInt(); // 输入每个进程的到达时间和服务时间 for (int i = 1; i <= n; i++) { System.out.print("请输入第" + i + "个进程的到达时间和服务时间:"); int arrivalTime = scanner.nextInt(); int serviceTime = scanner.nextInt(); queue.add(new Process(i, arrivalTime, serviceTime)); } // 按照到达时间从小到大排序 queue.sort(Comparator.comparing(Process::getArrivalTime)); int currentTime = 0; // 当前时间 double avgTurnaroundTime = 0; // 平均周转时间 double avgWeightedTurnaroundTime = 0; // 平均带权周转时间 // 循环遍历队列中的所有进程 for (Process process : queue) { int waitingTime = currentTime - process.getArrivalTime(); // 计算等待时间 process.setWaitingTime(waitingTime); // 更新等待时间 int finishTime = currentTime + process.getServiceTime(); // 计算完成时间 process.setFinishTime(finishTime); // 更新完成时间 currentTime = finishTime; // 更新当前时间 int turnaroundTime = finishTime - process.getArrivalTime(); // 计算周转时间 avgTurnaroundTime += turnaroundTime; // 累加周转时间 avgWeightedTurnaroundTime += (double)turnaroundTime / process.getServiceTime(); // 累加带权周转时间 } avgTurnaroundTime /= n; // 计算平均周转时间 avgWeightedTurnaroundTime /= n; // 计算平均带权周转时间 // 输出每个进程的等待时间、完成时间、周转时间和带权周转时间 System.out.println("进程ID\t到达时间\t服务时间\t等待时间\t完成时间\t周转时间\t带权周转时间"); for (Process process : queue) { System.out.printf("%d\t%d\t%d\t%d\t%d\t%d\t%.2f\n", process.getId(), process.getArrivalTime(), process.getServiceTime(), process.getWaitingTime(), process.getFinishTime(), process.getFinishTime() - process.getArrivalTime(), (double)(process.getFinishTime() - process.getArrivalTime()) / process.getServiceTime()); } // 输出平均周转时间和平均带权周转时间 System.out.printf("平均周转时间:%.2f\n", avgTurnaroundTime); System.out.printf("平均带权周转时间:%.2f\n", avgWeightedTurnaroundTime); } } ```
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值