1. 程式人生 > >計算機作業系統排程演算法——短作業優先演算法簡單實現

計算機作業系統排程演算法——短作業優先演算法簡單實現

//排程演算法的模擬
//1.SJF 短作業優先演算法

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

#define N 5  //假設5個程序

struct PCB{
    string name;//程序name
	int reachTime;//標誌程序到達時間
	int needTime;//程序所需的時間
	bool state;
	/*程序的狀態,false表示掛起,true表示啟用*/
	int alltime;//總共所用的時間,即週轉時間
	bool over;   //程序的狀態,true表示結束
	bool isrunning;
}P[5];  //宣告5個程序
void init();
void processSchedule();
void printPCB(PCB P);

int arr[10];  //佇列存放可以執行但是沒有被排程的程序
int Size = 0; //佇列的長度
int RunningP = -1; //當前執行程序編號

void Sort(int a[],int Size);

int main(){
    init();  //初始化這五個程序
    processSchedule();//程序排程

    cout<<"*-----------------------輸出部分------------------------*"<<endl;
    cout<<"程序名稱"<<"\t"<<"到達時間"<<"\t"<<"所需時間"<<"\t"<<"週轉時間"<<endl;
    for(int i = 0; i < 5; i++){
        printPCB(P[i]); //列印程序資訊
    }

    return 0;
}

void init(){

    cout<<"*------------------輸入部分-------------------*"<<endl;
    for(int i=0;i<N;i++){
        cout<<"輸入程序"<<i+1<<"名稱,到達時間,所需時間(用空格鍵隔開):"<<endl;
        cin>>P[i].name>>P[i].reachTime>>P[i].needTime;
    }
    for(int i=0;i<N;i++){
        P[i].state=0;
        P[i].alltime=0;
        P[i].isrunning=0;
        P[i].over=0;
    }
    /*P[0].name = "P1";
    P[0].reachTime = 0;
    P[0].needTime = 4;
    P[0].state = 0;
    P[0].alltime = 0;
    P[0].over = 0;
    P[0].isrunning = 0;

    P[1].name = "P2";
    P[1].reachTime = 1;
    P[1].needTime = 3;
    P[1].state = 0;
    P[1].alltime = 0;
    P[1].over = 0;
    P[1].isrunning = 0;

    P[2].name = "P3";
    P[2].reachTime = 2;
    P[2].needTime = 5;
    P[2].state = 0;
    P[2].alltime = 0;
    P[2].over = 0;
    P[2].isrunning = 0;

    P[3].name = "P4";
    P[3].reachTime = 3;
    P[3].needTime = 2;
    P[3].state = 0;
    P[3].alltime = 0;
    P[3].over = 0;
    P[3].isrunning = 0;

    P[4].name = "P5";
    P[4].reachTime = 4;
    P[4].needTime = 4;
    P[4].state = 0;
    P[4].alltime = 0;
    P[4].over = 0;
    P[4].isrunning = 0;*/
}

void printPCB(PCB P){
    cout<<P.name<<"\t\t"<<P.reachTime<<"\t\t"<<P.needTime<<"\t\t"<<P.alltime<<endl;
}

void setState(int all){ //找到該時刻到達的程序,並將它放入佇列中
    for(int i = 0; i < N; i++){
        if(P[i].reachTime == all){
            arr[Size] = i;  //放到佇列的最後
            P[i].state = 1;  //標誌該程序狀態啟用
            Size++;   //佇列長度++
        }
    }
}

void Sort(int Size){  //對佇列中的程序按照執行需要的時間排序,從長到短
    for(int i = 0; i < Size;i++){
        for(int j = i+1; j < Size; j++){
            if(P[arr[i]].needTime < P[arr[j]].needTime){  //短作業放最後
                int tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
        }
    }
}

void processSchedule(){
    int all = 0; //記錄系統執行總時間

    for(int n = 0; n < N; n++){ //五個程序
        int time = 0;  //記錄該程序執行時間
        while(true){

            setState(all);
            Sort(Size);
<span style="white-space:pre">	</span>    
            time++;
            all++;
            if(RunningP == -1){  //如果沒有程序在執行
                if(Size > 0){
                    RunningP = arr[Size-1];//調入執行所需時間最短的程序,即佇列中最後邊的程序
                    Size--; //佇列長度減一
                }
            }
            if(RunningP != -1){ //如果有程序在執行
                if(P[RunningP].needTime == time){//如果該程序已經執行完成
                    P[RunningP].alltime = all - P[RunningP].reachTime;//計算該程序週轉時間
                    RunningP = -1;//重新標記沒有程序在執行
                    break;//跳出while
                }
            }
        }
    }
}