天天看點

實驗三 程序排程模拟程式

一.    目的和要求

1.1.           實驗目的

用進階語言完成一個程序排程程式,以加深對程序的概念及程序排程算法的了解。

1.2.           實驗要求

1.2.1例題:設計一個有 N個程序并發執行的程序排程模拟程式。

程序排程算法:采用最高優先級優先的排程算法(即把處理機配置設定給優先級最高的程序)和先來先服務(若優先級相同)算法。

(1).  每個程序有一個程序控制塊(PCB)表示。程序控制塊包含如下資訊:程序名、優先級、到達時間、需要運作時間、已用CPU時間、程序狀态等等。

(2).  程序的優先級及需要的運作時間可以事先人為地指定,程序的運作時間以時間片為機關進行計算。

(3).  每個程序的狀态可以是就緒 r(ready)、運作R(Running)、或完成F(Finished)三種狀态之一。

(4).  就緒程序獲得 CPU後都隻能運作一個時間片。用已占用CPU時間加1來表示。

(5).  如果運作一個時間片後,程序的已占用 CPU時間已達到所需要的運作時間,則撤消該程序,如果運作一個時間片後程序的已占用CPU時間還未達所需要的運作時間,也就是程序還需要繼續運作,此時應将程序的優先數減1(即降低一級),然後把它插入就緒隊列等待排程。

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

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

思考:作業排程與程序排程的不同?

1.2.2實驗題A:編寫并調試一個模拟的程序排程程式,采用“最高優先數優先”排程算法對N(N不小于5)個程序進行排程。

“最高優先級優先”排程算法的基本思想是把CPU配置設定給就緒隊列中優先數最高的程序。

(1). 靜态優先數是在建立程序時确定的,并在整個程序運作期間不再改變。

(2). 動态優先數是指程序的優先數在建立程序時可以給定一個初始值,并且可以按一定規則修改優先數。例如:在程序獲得一次CPU後就将其優先數減少1,并且程序等待的時間超過某一時限(2個時間片時間)時增加其優先數等。

(3). (**)程序的優先數及需要的運作時間可以事先人為地指定,(也可以由随機數産生)。

(4). (**)在進行模拟排程過程可以建立(增加)程序,其到達時間為程序輸入的時間。

0.

1.2.3實驗題B:編寫并調試一個模拟的程序排程程式,采用“基于時間片輪轉法”排程算法對N(N不小于5)個程序進行排程。 “輪轉法”有簡單輪轉法、多級回報隊列排程算法。

(1). 簡單輪轉法的基本思想是:所有就緒程序按 FCFS排成一個隊列,總是把處理機配置設定給隊首的程序,各程序占用CPU的時間片長度相同。如果運作程序用完它的時間片後還未完成,就把它送回到就緒隊列的末尾,把處理機重新配置設定給隊首的程序。直至所有的程序運作完畢。(此排程算法是否有優先級?)

 (2). 多級回報隊列排程算法的基本思想是:

将就緒隊列分為N級(N=3~5),每個就緒隊列優先數不同并且配置設定給不同的時間片:隊列級别越高,優先數越低,時間片越長;級别越小,優先數越高,時間片越短。

系統從第一級排程,當第一級為空時,系統轉向第二級隊列,.....當處于運作态的程序用完一個時間片,若未完成則放棄CPU,進入下一級隊列。

當程序第一次就緒時,進入第一級隊列。

(3). (**)考慮程序的阻塞狀态B(Blocked)增加阻塞隊列。程序的是否阻塞和阻塞的時間由産生的“随機數”确定(阻塞的頻率和時間長度要較為合理)。注意程序隻有處于運作狀态才可能轉換成阻塞狀态,程序隻有處于就緒狀态才可以轉換成運作狀态。

二.    實驗内容

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

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

注:帶**号的條目表示選做内容。

三、        實驗方法、步驟及結果測試

 1.      源程式名:壓縮封包件(rar或zip)中源程式名yy.c

可執行程式名:yy.exe

 2.      原理分析及流程圖

主要總體設計問題。

(包括存儲結構,主要算法,關鍵函數的實作等)

存儲結構:

typedef struct process  
{    
    char name[10];                      //程序名   
    int priority;                       //優先數,priority=-1000; 表示程序排程已完成 
    Time ReachTime;                     //到達時間,這裡按照錄入系統時的先後順序,從0依次增加   
    Time NeedTime;                     //需要運作時間   
    Time UsedTime;                     //已用時間,是指目前該程序已用的時間   
    char state;                        //程序狀态,就緒 W(Wait)、運作R(Run)、或完成F(Finish)三種狀态之一
}PCB;                                //程序控制塊      

主要算法:

實驗三 程式排程模拟程式

 3.      主要程式段及其解釋:

實作主要功能的程式段,重要的是程式的注釋解釋。   

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Max 100
typedef struct pcb
{
    char name[Max];  //程序名
    int priority;    //優先級
    int ArrTime;     //到達時間
    int NeedTime;    //需要運作時間
    int UsedTime;    //已用時間
    char state;      //程序狀态
}PCB;

int n;                               //标示程序的總數 
PCB pcb[Max];  
int pTime;                          //時間片大小 

void input(int n)
{    
    for(int i = 0;i < n;i++)
    {
        printf("\n輸入第%d個程序\n",i+1);
        printf("輸入程序名字:");
        scanf("%s",pcb[i].name);

        printf("程序的優先級:");          
        scanf("%d",&pcb[i].priority);  
        
        printf("程序運作需要的時間:");          
        scanf("%d",&pcb[i].NeedTime);  
        
        pcb[i].ArrTime = i;
        pcb[i].UsedTime = 0;
        pcb[i].state = 'W';
    }
}

void panduan(int n)
{

        if(pcb[0].state!='F')    pcb[0].state='R';
    
}
void sort(int n,int pTime)
{    
    
    PCB temp;
    pcb[0].UsedTime +=pTime;
    if(pcb[0].UsedTime>=pcb[0].NeedTime)
    {
        pcb[0].state='F';pcb[0].UsedTime=pcb[0].NeedTime;}
    else
        pcb[0].state='W';

    temp = pcb[0];

    if(pcb[n-1].state == 'F')  n=n-1;
    for(int i=0;i<n;i++)
    {
        pcb[i]=pcb[i+1];
    }
    pcb[n-1]=temp;
    
}



void output(int n)
{
    printf("\n程序名\t優先級\t到達時間\t需要時間\t已用時間\t程序狀态\n");
    for (int i=0;i<n;i++)    
    {  
        printf("%s\t%d\t%d\t\t%d\t\t%d\t\t%c\n",pcb[i].name,pcb[i].priority,pcb[i].ArrTime,pcb[i].NeedTime,pcb[i].UsedTime,pcb[i].state); 
    } 
}
void main()
{    int n;

    printf("輸入程序個數:");
    scanf("%d",&n);
    input(n);

    int pTime;
    printf("\n\t輸入時間片:");
    scanf("%d",&pTime);

    panduan(n);
    output(n);
    while(pcb[1].state!='F')
    {    
        sort(n,pTime);panduan(n);
        output(n);
    }
    pcb[0].UsedTime=pcb[0].NeedTime;
    pcb[0].state='F';
    output(n);
    
}
       
實驗三 程式排程模拟程式
實驗三 程式排程模拟程式
實驗三 程式排程模拟程式