實驗3、動態優先數實驗

1、  實驗目的node

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

2、  實驗內容和要求函數

編寫並調試一個模擬的進程調度程序,採用「最高優先數優先」調度算法對N(N不小於5)個進程進行調度。「最高優先級優先」調度算法的基本思想是把CPU分配給就緒隊列中優先數最高的進程。學習

#include"stdio.h"
#include"stdlib.h"
#include"string.h"
typedef struct node
{
    char name[10]; //進程標誌符
    int prio; //進程優先數
    int cputime; //進程佔用cpu時間
    int needtime; //進程到完成還要的時間
    char state; //進程的狀態
    struct node *next; //鏈指針
}PCB;
PCB *finish,*ready,*tail,*run; //隊列指針
int N; //進程數
//將就緒隊列的第一個進程投入運行
firstin()
{
    run=ready; //就緒隊列頭指針賦值給運行頭指針
    run->state='R'; //進程狀態變爲運行態
    ready=ready->next; //就緒列頭指針後移到下一進程
}
//標題輸出函數
void prt1(char a)
{
    printf("進程號    cpu時間    所需時間    優先數    狀態\n");

}
//進程PCB輸出
void prt2(char a,PCB *q)
{ //優先數算法輸出
    printf(" % -10s% -10d% -10d% -10d %c\n",q->name,q->cputime,q->needtime,q->prio,q->state);
}
//輸出函數
void prt(char algo)
{
    PCB *p;
    prt1(algo); //輸出標題
    if(run!=NULL) //若是運行標題指針不空
        prt2(algo,run); //輸出當前正在運行的PCB
    p=ready; //輸出就緒隊列PCB
    while(p!=NULL)
    {
        prt2(algo,p);
        p=p->next;
    }
    p=finish; //輸出完成隊列的PCB
    while(p!=NULL) 
    {

        prt2(algo,p);
        p=p->next;
    }

    getchar(); //按任意鍵繼續
}
//優先數的算法插入算法
insert1(PCB *q)
{

    PCB *p1,*s,*r;
    int b;
    s=q; //待插入的PCB指針
    p1=ready; //就緒隊列頭指針
    r=p1; //r作p1的前驅指針
    b=1;
    while((p1!=NULL)&&b) //根據優先數肯定插入位置
        if(p1->prio>=s->prio)
        {
            r=p1;
            p1=p1->next;
        }
        else
            b=0;
        if(r!=p1) //若是條件成立說明插入在r與p1之間
        {
            r->next=s;
            s->next=p1;
        }
        else
        {
            s->next=p1; //不然插入在就緒隊列的頭
            ready=s;
        }
}
//優先數建立初始PCB信息
void create1(char alg)
{
    PCB *p;
    int i,time;

    char na[10];
    ready=NULL; //就緒隊列頭文件
    finish=NULL; //完成隊列頭文件
    run=NULL; //運行隊列頭文件
    printf("輸入進程號和運行時間:\n"); //輸入進程標誌和所需時間建立PCB
    for(i=1;i<=N;i++)
    {
        p=(PCB *)malloc(sizeof(PCB));
        scanf("%s",na);
        scanf("%d",&time);
        strcpy(p->name,na);
        p->cputime=0;
        p->needtime=time;
        p->state='w';
        p->prio=50-time;
        if(ready!=NULL) //就緒隊列不空,調用插入函數插入
            insert1(p);
        else
        {
            p->next=ready; //建立就緒隊列的第一個PCB
            ready=p;
        }
    }
    //clrscr();
    printf(" 優先數算法輸出信息:\n");
    printf("***********************************************\n");
    prt(alg); //輸出進程PCB信息
    run=ready; //將就緒隊列的第一個進程投入運行
    ready=ready->next;
    run->state='R';
}

//優先數調度算法
void priority(char alg)
{
    while(run!=NULL) //當運行隊列不空時,有進程正在運行
    {
        run->cputime=run->cputime+1;
        run->needtime=run->needtime-1;
        run->prio=run->prio-3; //每運行一次優先數下降3個單位
        if(run->needtime==0) //如所需時間爲0將其插入完成隊列
        {
            run->next=finish;
            finish=run;
            run->state='F'; //置狀態爲完成態
            run=NULL; //運行隊列頭指針爲空
            if(ready!=NULL) //如就緒隊列不空
                firstin(); //將就緒隊列的第一個進程投入運行
        }
        else //沒有運行完同時優先數不是最大,則將其變爲就緒態插入到就緒隊列
            if((ready!=NULL)&&(run->prio<ready->prio))
            {
                run->state='W';
                insert1(run);
                firstin(); //將就緒隊列的第一個進程投入運行
            }
            prt(alg); //輸出進程PCB信息
    }
}
//主函數
void main()
{

    char algo; //算法標記
    //clrscr();

    printf("輸入進程數:");
    scanf("%d",&N); //輸入進程數
    printf("\n");
    create1(algo); //優先數算法
    priority(algo);

}

心得體會:spa

         我以爲此次的實驗對我來講是比較困難的,緣由有兩個,一是我以前的基礎沒有打好,指針之類比較複雜的函數不太會運用;二是我在平時上理論課的時候沒有很是認真的聽講,以致於有些知識沒有搞懂。因此在此次的實驗裏,大多數的實驗代碼都是上網參考的,雖然知道這樣很很差,但是不參考的話,還真的寫不出來。不過經過此次的實驗,能夠了解到本身其實仍是沒有深刻的理解到進程調度裏面的一些知識,也讓我知道本身對C語言的運用尚未很熟練,懂的知識尚未很全面,要花更多的時間去學習。指針

相關文章
相關標籤/搜索