调度算法--先来先服务

在OS中调度的实质是一种资源的分配,因而调度算法是指,根据系统的资源分配策略所规定的资源分配算法,对于不同的系统和系统目标,通常采用不同的作业调度。如,在批处理系统中,为了照顾为数众多的短作业,应采用短作业优先的调度算法,又如在分时系统中,为了保证系统合理的响应时间,应采用轮转法进行调度。目前存在的调度算法中,有的算法用于作业调度,有的算法用于进程调度。

先来先服务(FCFS)是一种最简单的调度算法,该算法即可用于作业调度,也可用于进程调度。

FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。

#include <iostream>
#include <iomanip>
#include <stdio.h>
using namespace std;

struct  PCB
{
	char PName;
	double ArriveTime;
	double BusinessTime;
	double StartTime;
	double FinishTime;
	double TurnaroundTime;
	double RightTurnaroundTime;

	PCB();
	~PCB(){}
};

PCB::PCB()
{
	PName='A';
	ArriveTime=0;
	BusinessTime=0;
	StartTime=0;
	FinishTime=0;
	TurnaroundTime=0;
	RightTurnaroundTime=0;
}

void print(PCB p)
{
	//cout<<setiosflags(ios::left);
	cout<<p.PName<<setw(11)
	<<p.ArriveTime<<setw(11)
	<<p.BusinessTime<<setw(11)
	<<p.StartTime<<setw(11)
	<<p.FinishTime<<setw(11)
	<<p.TurnaroundTime<<setw(11)
	<<p.RightTurnaroundTime<<endl;
}

void sort(PCB *pcb,int n)
{
	for(int i=0;i<n ;++i)
	{
		for(int j=i+1;j<n;++j)
		{
			if(pcb[i].ArriveTime<pcb[j].ArriveTime)
				continue;
			else if(pcb[i].ArriveTime==pcb[j].ArriveTime)
			{
				if(pcb[i].BusinessTime<=pcb[j].BusinessTime)
					;
				else
				{
					PCB swap;
					swap=pcb[i];
					pcb[i]=pcb[j];
					pcb[j]=swap;
				}
			}
			else if(pcb[i].ArriveTime > pcb[j].ArriveTime)
			{
				PCB swap;
				swap=pcb[i];
				pcb[i]=pcb[j];
				pcb[j]=swap;
			}

		}
	}
}

void show(PCB *p,int n)
{
	cout<<"========================================================================"<<endl;
	cout<<"进程名   到达时间  服务时间  开始执行  完成时间  周转时间  带权周转时间"<<endl;
	for(int i=0;i<n;++i)
	{
		print(p[i]);

	}
	cout<<"========================================================================="<<endl;
	cout<<endl;
}

void run(PCB *p,int n)
{
	double t=0.;
	cout<<"当前进程按时间顺序的就绪队列状态:"<<endl;
	show(p,n);
	for(int i=0;i<n;++i)
	{
		p[i].StartTime=t;
		p[i].FinishTime=p[i].StartTime + p[i].BusinessTime;
		p[i].TurnaroundTime= p[i].FinishTime - p[i].ArriveTime;
		p[i].RightTurnaroundTime=p[i].TurnaroundTime / p[i].BusinessTime;
		t = p[i].FinishTime;

		getchar();
		cout<<"正在执行第"<<i+1<<"个进程 "<<p[i].PName<<" :"<<endl;
		show(p,n);
	}
}

int main()
{
	int n;
	cout<<"请输入要创建的进程个数:";
	cin>>n;
	PCB pcb[n];
	cout<<"请输入进程名,到达时间,服务时间:"<<endl;

	for(int i=0;i<n;++i)
	{
		cin>>pcb[i].PName>>pcb[i].ArriveTime>>pcb[i].BusinessTime;
	}
	cout<<"需要执行的进程状态:"<<endl;
	show(pcb,n);

	//根据时间排序
	sort(pcb,n);

	run(pcb,n);
	return 0;
} 

一直按enter键,直到所有进程全部运行完。

算法中,对于进程到来时间相同的,就按进程所需运行时间进行比较。

时间: 2024-10-02 06:10:57

调度算法--先来先服务的相关文章

操作系统常用调度算法

一.先来先服务调度算法 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度.当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源.创建进程,然后放入就绪队列.在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行.该进程一直运行到完成或发生某事件而阻塞后才放弃处理机. 优缺点:FCFS调度算法的特点是算法简单,但效率低:对长

常见进程调度算法

常见进程调度算法 一.先来先服务和短作业(进程)优先调度算法 1.先来先服务调度算法 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度.当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源.创建进程,然后放入就绪队列.在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行.该进程一直运行到完成或发生某事件而阻塞后才放弃处理

操作系统中常见的调度算法

一.先来先服务调度算法 先来先服务的调度算法(FCFS)是一种最简单的调度算法,该算法既可以用于作业调度,也可以用于进程调度.当在作业调度中采用该算法时,每次都是从后备作业队列选择一个或多个最先进入该队列的作业,将他们调入内存,为他们分配内存,为他们分配资源,创建进程,然后放入就绪队列中.在进程中采用FCFS算法时,则每次调度室从就绪队列中选择一个最先进入该队列的进程,位置分配处理机,使之投入运行.该进程一直运行到完成或发生某事件而阻塞后才放弃处理机. FCFS调度算法有利于cpu繁忙型的作业,

常见的几种操作系统进程调度算法

什么是进程调度算法??? 进程调度算法:根据系统的资源分配策略所规定的资源分配算法. 一.先来先服务和短作业(进程)优先调度算法 1.先来先服务调度算法 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度.当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源.创建进程,然后放入就绪队列.在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理

Hadoop集群三种作业调度算法介绍

Hadoop集群中有三种作业调度算法,分别为FIFO,公平调度算法和计算能力调度算法先来先服务(FIFO)Hadoop中默认的调度器FIFO,它先按照作业的优先级高低,再按照到达时间的先后选择被执行的作业.FIFO比较简单,hadoop中只有一个作业队列,被提交的作业按照先后顺序在作业队列中排队,新来的作业插入到队尾.一个作业运行完后,总是从队首取下一个作业运行.这种调度策略的优点是简单.易于实现,同时也减轻了jobtracker的负担.但是它的缺点也是显然的,它对所有的作业都一视同仁,没有考虑

几个常用的操作系统进程调度算法

[装载自:http://www.tuicool.com/articles/B3MRRv] 一.先来先服务和短作业(进程)优先调度算法 1.先来先服务调度算法 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度.当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源.创建进程,然后放入就绪队列.在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配

常用的操作系统进程调度算法

一.先来先服务和短作业(进程)优先调度算法 1.先来先服务调度算法 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度.当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源.创建进程,然后放入就绪队列.在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行.该进程一直运行到完成或发生某事件而阻塞后才放弃处理机. 2.短作业(

(转)几个常用的操作系统进程调度算法

几个常用的操作系统进程调度算法 转自:http://blog.csdn.net/wanghao109/article/details/13004507 一.先来先服务和短作业(进程)优先调度算法 1.先来先服务调度算法 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度.当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源.创建进程,然后放入就绪队列.在进程调度中采用FCFS算法时,

LMT NEW PBS作业排队计算系统的调度算法

LMT NEW PBS作业排队计算系统的调度算法 一个作业定义为一个完整的.有用的一段信息的传送.一个作业的长度由传送的字节数来度量.为简便起见,定义一个短作业为能在一个IP分组中封装的作业.现在实际使用的路由和交换机所有数据分组处理方式是一致的,而不管它们来自短作业还是长作业. 作业源地址指送出作业的主机,作业的目标地址是指接收并处理数据的主机,一个作业的完成是指作业的最后一个分组被成功传送到目的地.作业的响应时间是第一个分组被传送出的时间与最后一个分组被传送到作业目标地址的时间间隔. 作业调