排程演算法--先來先服務
阿新 • • 發佈:2018-12-26
在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鍵,直到所有程序全部執行完。
演算法中,對於程序到來時間相同的,就按程序所需執行時間進行比較。