1. 程式人生 > >作業系統——實驗一(先來先服務演算法和短作業優先演算法)

作業系統——實驗一(先來先服務演算法和短作業優先演算法)

作業系統實驗報告一

[實驗題目]

先來先服務FCFS和短作業優先SJF排程演算法

[實驗目的]

通過本次實驗,加深對程序概念的理解,進一步掌握對程序狀態轉變、程序排程策略及對系統性能的評價方法。

[實驗內容]

程式設計實現如下內容:

1.先來先服務演算法; 

2.短程序優先演算法;

3.根據排程順序計算所有作業的平均週轉時間及平均帶權週轉時間。

程式碼如下:

1.    先來先服務演算法

2.    短程序優先演算法:

感悟:首先不要畏難,要有勇氣去敲這個演算法,然後就是按部就班的把該敲得程式碼,該實現的功能通過自己最熟悉的語言實現出來。

#include <bits/stdc++.h>
using namespace std;
struct tt{
    int id;//程序名字
    int dt;// 到達時間
    int ft;//服務時間
    int wt;//完成時間
    double z;//週轉時間
    double d;//帶權週轉時間

}st[100];
bool cmp(tt x,tt y){//按照到達時間從小到大排序
    return x.dt<y.dt;
}
bool cmp1(tt x,tt y){//按照服務時間從小到大排序
    return x.ft<y.ft;
}
void wt(int n){//計算完成時間
    for(int i=0;i<n;i++){
        if(i==0){
            st[i].wt=st[i].ft+st[i].dt;
        }else{
            if(st[i-1].wt<st[i].dt){
                st[i].wt=st[i].ft+st[i].dt;
            }else{
                st[i].wt=st[i-1].wt+st[i].ft;
            }
        }
    }
}
void zt(int n){//計算週轉時間
    for(int i=0;i<n;i++){
        st[i].z=st[i].wt-st[i].dt;
    }
}
void dzt(int n){//計算帶權週轉時間
    for(int i=0;i<n;i++){
        st[i].d=st[i].z/(st[i].ft*1.0);
    }
}
double ave_z(int n){//計算平均週轉時間
    double sum=0;
    for(int i=0;i<n;i++){
        sum=sum+st[i].z;
    }
    return sum/(double)n;
}
double ave_d(int n){//計算平均帶權週轉時間
    double sum=0;
    for(int i=0;i<n;i++){
        sum=sum+st[i].d;
    }
    return sum/(double)n;
}
int main()
{
    int i;
    int n;
    int x;
    double a=0;
    double b=0;
    cout<<"請輸入作業(程序)個數:(n<=100)"<<endl;
    cin>>n;
    cout<<"*************************************"<<endl;
    cout<<"請輸入作業號、到達時間、 服務時間"<<endl;
    for(i=0;i<n;i++){
        cin>>st[i].id>>st[i].dt>>st[i].ft;
    }
    cout<<"*************************************"<<endl;
    cout<<"請選擇演算法“1-FCFS,2-SJF”"<<endl;
    cin>>x;
    if(x==1){
        sort(st,st+n,cmp);
        wt(n);
        zt(n);
        dzt(n);
        a=ave_z(n);
        b=ave_d(n);
        printf("程序名   到達時間  服務時間  完成時間  週轉時間  帶權週轉時間\n");
	for(int i=0;i<n;i++){
	printf("   %2d       %2d        %2d        %2d        %2.1lf         %2.1f\n",st[i].id,st[i].dt,st[i].ft,st[i].wt,st[i].z,st[i].d);
	}
	printf("平均週轉時間: %lf\n",a);
	printf("平均帶權週轉時間:%lf\n",b);



    }else if(x==2){
        sort(st,st+n,cmp);
        sort(st+1,st+n,cmp1);
        wt(n);
        zt(n);
        dzt(n);
        a=ave_z(n);
        b=ave_d(n);
        printf("程序名   到達時間  服務時間  完成時間  週轉時間  帶權週轉時間\n");
	for(int i=0;i<n;i++){
	printf("   %2d       %2d        %2d        %2d        %2.1lf         %2.1f\n",st[i].id,st[i].dt,st[i].ft,st[i].wt,st[i].z,st[i].d);
	}
	printf("平均週轉時間: %lf\n",a);
	printf("平均帶權週轉時間:%lf\n",b);

    }else{
        cout<<"輸入錯誤,退出程式。"<<endl;
    }
}