實驗三進程調度模擬程序

實驗三進程調度模擬程序

1.    目的和要求

    1.1.           實驗目的算法

       用高級語言完成一個進程調度程序,以加深對進程的概念及進程調度算法的理解。數據結構

    1.2.           實驗要求併發

            1.2.1例題:設計一個有 N個進程併發執行的進程調度模擬程序。編碼

            進程調度算法:採用最高優先級優先的調度算法(即把處理機分配給優先級最高的進程)和先來先服務(若優先級相同)算法。spa

            (1).  每一個進程有一個進程控制塊(PCB)表示。進程控制塊包含以下信息:進程名、優先級、到達時間、須要運行時間、已用CPU時間、進程狀態等等。設計

            (2).  進程的優先級及須要的運行時間能夠事先人爲地指定,進程的運行時間以時間片爲單位進行計算。調試

            (3).  每一個進程的狀態能夠是就緒 r(ready)、運行R(Running)、或完成F(Finished)三種狀態之一。code

            (4).  就緒進程得到 CPU後都只能運行一個時間片。用已佔用CPU時間加1來表示。blog

            (5).  若是運行一個時間片後,進程的已佔用 CPU時間已達到所須要的運行時間,則撤消該進程,若是運行一個時間片後進程的已佔用CPU時間還未達所須要的運行時間,也就是進程還須要繼續運行,此時應將進程的優先數減1(即下降一級),而後把它插入就緒隊列等待調度。隊列

            (6).  每進行一次調度程序都打印一次運行進程、就緒隊列中各個進程的 PCB,以便進行檢查。   

            (7).  重複以上過程,直到所要進程都完成爲止。

           1.2.2實驗題A:編寫並調試一個模擬的進程調度程序,採用「最高優先數優先」調度算法對N(N不小於5)個進程進行調度。

「最高優先級優先」調度算法的基本思想是把CPU分配給就緒隊列中優先數最高的進程。

             (2). 動態優先數是指進程的優先數在建立進程時能夠給定一個初始值,而且能夠按必定規則修改優先數。例如:在進程得到一次CPU後就將其優先數減小1,而且進程等待的時間超過某一時限(2個時間片時間)時增長其優先數等。

2.    實驗內容

     根據指定的實驗課題:A(1),A(2),B(1)和B(2)

      完成設計、編碼和調試工做,完成實驗報告。

        注:帶**號的條目表示選作內容。

 

3.    實驗環境

        能夠選用Turbo C做爲開發環境。也能夠選用Windows下的VB,CB等可視化環境,利用各類控件較爲方便。自主選擇實驗環境。

4.    實驗原理及核心算法參考程序段

 

#include<stdio.h>
#include<stdlib.h>
#include <conio.h>
#include <string.h>

//定義做業控制塊PCB  
struct Process { 
    char name[10];        //進程名
    char statu[20];         //狀態
    int priority;             //進程優先級    
    int arrivetime;             //進程到達時間   
    int runningtime;              //進程所需的運行時間
    int usecputime;           //已用CPU時間
    int waittime;                //等待的時間片次數
}; 
struct Process PCB[24]={0};


int Intput(Process *PCB,int n);//初始化
void Output(Process *PCB,int n);
void Algorithm(Process *PCB,int n,int onetime);//算法
int isfinshed(Process *PCB,int n);//判斷是否所有做業都調度完成
int Find(Process *PCB,int n,int runtime);//找最高優先級且沒運行完的進程

int main(){
    int m=0;
    int onetime;
    m=Intput(PCB,n);
    
    printf("請輸入一個時間片的時間:");
    scanf("%d",&onetime);
    
    Algorithm(PCB,n,onetime);
    printf("\n");
    return 0;
}

void Algorithm(Process *PCB,int n,int onetime)
{
    int k=0;
    int i=0;
    int runtime=0;
    Output(PCB, n);
    do{
        
        k=Find(PCB, n,runtime);
        PCB[k].priority--;
        
        PCB[k].usecputime++;
        
        if(PCB[k].priority<0)
        {
            
            PCB[k].priority=0;
        }
        if(PCB[k].usecputime*onetime>=PCB[k].runningtime)
        {strcpy(PCB[k].statu,"finished");}
        for(i=0;i<n;i++)
        {
            if(i==k)
            {
                PCB[i].waittime=0;
            }
            if(i!=k&&PCB[i].arrivetime<=runtime&&PCB[i].statu[0]!='f')
            {
                PCB[i].waittime++;
                if(PCB[i].waittime==2)
                {
                    PCB[i].priority++;
                    PCB[i].waittime=0;
                }
            }
        }
        Output(PCB, n);
        runtime++;
    }while(isfinshed(PCB, n)!=1);
    
}

int isfinshed(Process *PCB,int n)//判斷是否所有做業都調度完成
{
    int count=0;
    int i=0;
    for(;i<n;i++)
    {
        if(PCB[i].statu[0]=='f')
            count++;
    }
    if(count==n)
    {
        return 1;
    }
    return 0;
}
int Find(Process *PCB,int n,int runtime)//找最高優先級且沒運行完的進程
{
    int i=0;
    
    int MAX=0;
    int k=0;
    for(;i<n;i++)
    {
        if(PCB[i].arrivetime<=runtime&&PCB[i].statu[0]=='r'&&PCB[i].priority>MAX)
        {
            MAX=PCB[i].priority;
            k=i;
        }
        
    }
    return k;
    
}
int Intput(Process *PCB,int n)//初始化
{
    int i;
    printf("\n輸入進程數:");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        printf("\n輸入進程名:");
        scanf("%s",&PCB[i].name);
        
        printf("\n輸入進程優先級:");
        scanf("%d",&PCB[i].priority);
        
        printf("\n輸入進程到達時間:");
        scanf("%d",&PCB[i].arrivetime);
        
        printf("\n輸入進程須要運行時間:");
        scanf("%d",&PCB[i].runningtime);
        
        strcpy(PCB[i].statu,"ready");
        PCB[i].usecputime=0;
        PCB[i].waittime=0;
    }
    
    return n;
}

void Output(Process *PCB,int n)
{
    int i;
    printf("\n  **************************************************");
    printf("\n進程名"); 
    printf("  進程優先級");
    printf("  進程到達時間");
    printf("  進程所需的運行時間");
    printf("  已用CPU時間");
    printf("  狀態");
          
          
          
          for(i=0;i<n;i++)
          {
              
              printf("\n%s",PCB[i].name);
              printf("        %d",PCB[i].priority);
              printf("              %d",PCB[i].arrivetime);
              printf("                %d",PCB[i].runningtime);
              printf("                 %d",PCB[i].usecputime);
              printf("          %s",PCB[i].statu);
              
              
          }
          
}

5、實驗總結

    這個實驗和上一次的實驗有類似之處,不過我上一次的實驗算法沒有用到數據結構,因此此次實驗要從新編寫算法。一開始對數據結構不太熟悉,問了同窗,參考了別人的代碼,終於寫出來了,很是高興。經過此次實驗,使我對數據結構更加的熟悉,對進程的運行過程也有了深入的體會。

相關文章
相關標籤/搜索