愛悠閑 > 調度算法--先來先服務

調度算法--先來先服務

分類: 計算機操作系統  |  標簽: 調度算法,操作系統,c  |  作者: u014304293 相關  |  發布日期 : 2014-10-17  |  熱度 : 162°

   在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鍵,直到所有進程全部運行完。 

   算法中,對于進程到來時間相同的,就按進程所需運行時間進行比較。



快乐彩中奖说明