實驗二 做業調度模擬程序

實驗二做業調度模擬程序

1、目的和要求

     1. 實驗目的

         (1)加深對做業調度算法的理解;算法

         (2)進行程序設計的訓練。數據結構

     2.實驗要求

        用高級語言編寫一個或多個做業調度的模擬程序。oop

        單道批處理系統的做業調度程序。做業一投入運行,它就佔有計算機的一切資源直到做業完成爲止,所以調度做業時沒必要考慮它所須要的資源是否獲得知足,它所運行的時間等因素。this

        做業調度算法:spa

            1)採用先來先服務(FCFS)調度算法,即按做業到達的前後次序進行調度。老是首先調度在系統中等待時間最長的做業。操作系統

            2)短做業優先 (SJF) 調度算法,優先調度要求運行時間最短的做業。設計

            3)響應比高者優先(HRRN)調度算法,爲每一個做業設置一個優先權(響應比),調度以前先計算各做業的優先權,優先數高者優先調度。RP (響應比)= 做業週轉時間 / 做業運行時間=1+做業等待時間/做業運行時間每一個做業由一個做業控制塊JCB表示,JCB能夠包含如下信息:做業名、提交(到達)時間、所需的運行時間、所需的資源、做業狀態、鏈指針等等。做業的狀態能夠是等待W(Wait)、運行R(Run)和完成F(Finish)三種之一。每一個做業的最初狀態都是等待W。指針

       1、模擬數據的生成

            1.容許用戶指定做業的個數(2-24),默認值爲5。code

            2.容許用戶選擇輸入每一個做業的到達時間和所需運行時間。blog

            3.(**)從文件中讀入以上數據。

            4.(**)也容許用戶選擇經過僞隨機數指定每一個做業的到達時間(0-30)和所需運行時間(1-8)。

 

       (1)採用先來先服務(FCFS)調度算法

#include <stdio.h>
#include <stdlib.h>
#define N 24
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
    int i,n;
    int arrtime[N],reqtime[N],starttime[N],endtime[N],zztime[N];
    float zzxs[N];
    char name[N];
    printf("\n Please enter the number of operations:");
    scanf("%d",&n);
    for(i=0;i<n;i++){
      printf("\n name:");
      scanf("%s",&name[i]);
      printf("\n arrtime:");
      scanf("%d",&arrtime[i]);
      printf("\n reqtime:");
      scanf("%d",&reqtime[i]);
      if(i==0){
        starttime[i]=arrtime[i];
      }
      endtime[i]=starttime[i]+reqtime[i];
      zztime[i]=endtime[i]-arrtime[i];
      zzxs[i]=zztime[i]*1.0/reqtime[i];
      starttime[i+1]=endtime[i];
    }
    printf("\n\tname  arrtime  reqtime  startime  endtime  zztime  zzxs  ");
    for(i=0;i<n;i++){
        printf("\n\t%c\t%d\t%d\t   %d\t   %d\t     %d\t     %.2f",name[i],arrtime[i],reqtime[i],starttime[i],endtime[i],zztime[i],zzxs[i]);
    }
    
    return 0;
}

 運行結果:

(2)短做業優先 (SJF) 調度算法

#include <stdio.h>
#include <stdlib.h>
#define N 24
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//    短做業優先 (SJF) 調度算法,優先調度要求運行時間最短的做業。
int main(int argc, char *argv[]) {
    int i,j,n,temp;
    int arrtime[N],reqtime[N],starttime[N],endtime[N],zztime[N];
    float zzxs[N];
    char name[N],ctemp;
    printf("\n Please enter the number of operations:");
    scanf("%d",&n);
    for(i=0;i<n;i++){
      printf("\n name:");
      scanf("%s",&name[i]);
      printf("\n arrtime:");
      scanf("%d",&arrtime[i]);
      printf("\n reqtime:");
      scanf("%d",&reqtime[i]);
      
    }
     
     for(i=0;i<n;i++){
        for(j=1;j<n-1-i;j++){
            if(reqtime[j] > reqtime[j+1]){
                temp = reqtime[j+1];
                reqtime[j+1] = reqtime[j];
                reqtime[j] = temp;
                ctemp=name[j+1];
                name[j+1]=name[j];
                name[j]=ctemp;
                temp=arrtime[j+1];
                arrtime[j+1]=arrtime[j];
                arrtime[j]=temp;
            }
            else if(reqtime[j]==reqtime[j+1]&&arrtime[j]>arrtime[j+1]){
                temp = reqtime[j+1];
                reqtime[j+1] = reqtime[j];
                reqtime[j] = temp;
                ctemp=name[j+1];
                name[j+1]=name[j];
                name[j]=ctemp;
                temp=arrtime[j+1];
                arrtime[j+1]=arrtime[j];
                arrtime[j]=temp;
            }
        }
    }
    for(i=0;i<n;i++){
                if(i==0){
                  starttime[i]=arrtime[i];
                }
                 endtime[i]=starttime[i]+reqtime[i];
                 zztime[i]=endtime[i]-arrtime[i];
                 zzxs[i]=zztime[i]*1.0/reqtime[i];
                 starttime[i+1]=endtime[i];
            }

    printf("\n\tname  arrtime  reqtime  startime  endtime  zztime  zzxs  ");
    for(i=0;i<n;i++){
        printf("\n\t%c\t%d\t%d\t   %d\t   %d\t     %d\t     %.2f",name[i],arrtime[i],reqtime[i],starttime[i],endtime[i],zztime[i],zzxs[i]);
    }
    
    return 0;
}

運行結果:

(3)響應比高者優先(HRRN)調度算法

#include <stdio.h>
#include <stdlib.h>
#define N 24
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//HRRN爲每一個做業設置一個優先權(響應比),調度以前先計算各做業的優先權
int main(int argc, char *argv[]) {
    int i,j,n,temp,num;
    int arrtime[N],reqtime[N],starttime[N],endtime[N],zztime[N];
    float zzxs[N],hrrn[N],ftemp;
    char name[N],ctemp;
    printf("\n Please enter the number of operations:");
    scanf("%d",&n);
    num=1;
    for(i=0;i<n;i++){
      printf("\n name:");
      scanf("%s",&name[i]);
      printf("\n arrtime:");
      scanf("%d",&arrtime[i]);
      printf("\n reqtime:");
      scanf("%d",&reqtime[i]);
      
    }
    for(i=0;i<n;i++){
        if(i==0){
            starttime[i]=arrtime[i];
        }
        endtime[i]=starttime[i]+reqtime[i];
        zztime[i]=endtime[i]-arrtime[i];
        zzxs[i]=zztime[i]*1.0/reqtime[i];
        starttime[i+1]=endtime[i];
        
        for(j=num;j<n;j++){
            hrrn[j]=(endtime[i]-arrtime[j])/reqtime[j]*1.0+1;
            //printf("%f  ",&hrrn[i]);
        }
        
        for(j=num;j<n;j++){
            if(hrrn[j]<hrrn[j+1]){
                ftemp=hrrn[j+1];
                hrrn[j+1]=hrrn[j];
                hrrn[j]=ftemp;
                temp = reqtime[j+1];
                reqtime[j+1] = reqtime[j];
                reqtime[j] = temp;
                ctemp=name[j+1];
                name[j+1]=name[j];
                name[j]=ctemp;
                temp=arrtime[j+1];
                arrtime[j+1]=arrtime[j];
                arrtime[j]=temp;
            }
        }
        num++;
        
   }
    
    
    printf("\n\tname  arrtime  reqtime  startime  endtime  zztime  zzxs  ");
    for(i=0;i<n;i++){
        printf("\n\t%c\t%d\t%d\t   %d\t   %d\t     %d\t     %.2f",name[i],arrtime[i],reqtime[i],starttime[i],endtime[i],zztime[i],zzxs[i]);
    }
    
    return 0;
}

 實驗總結:

            此次實驗作得比較倉促,最後兩節課纔開始編寫程序。因此,此次程序也沒用到數據結構來寫。總的來講,要對操做系統這門課程更加上心,沒事在宿舍多編寫程序。

相關文章
相關標籤/搜索