若干簡單的進程和做業調度的C++模擬程序

 

進程調度(時間片輪轉,動態優先級,鏈表形式): 

#include<cstdio>
#include<cstdlib>

struct PCB
{
    char name[10];
    char state; //狀態
    int super; //優先級
    int ntime; //預計運行時間
    int rtime; //實際運行時間
    PCB *link;
}*ready=NULL, *p;

void disp(PCB *pr) /*創建進程顯示函數,用於顯示當前進程 */
{
    printf("\n qname \t state \t super \t ntime \t rtime \n");
    printf("|%s \t ",pr->name);
    printf("|%c \t ",pr->state);
    printf("|%d \t ",pr->super);
    printf("|%d \t ",pr->ntime);
    printf("|%d \t ",pr->rtime);
    printf("\n");
}

void check() /* 創建進程查看函數 */
{
    printf("\n ******** 當前正在運行的進程是:%s",p->name); /* 顯示當前運行進程 */
    disp(p);

    printf("\n ******** 當前就緒隊列狀態爲:\n"); /* 顯示就緒隊列狀態 */
    PCB *pr=ready;
    while(pr!=NULL) disp(pr), pr=pr->link;
}

void sort() /* 創建對進程進行優先級排列函數 */
{
    if(ready==NULL || (p->super)>(ready->super)) /* 優先級最大者,插入隊首 */
    {
        p->link=ready;
        ready=p;
    }
    else /* 進程比較優先級,插入適當的位置中 */
    {
        PCB *first=ready, *second=first->link;
        while(second!=NULL)
        {
            if((p->super)>(second->super)) /* 若插入進程比當前進程優先數大,插入到當前進程前面 */
            {
                first->link=p;
                p->link=second;
                return;
            }

            first=first->link;
            second=second->link;
        }
        first->link=p;
    }
}

void input() /* 創建進程控制塊函數 */
{
    system("cls");

    printf("\n 請輸入進程數目?");
    int num; scanf("%d",&num);

    for(int i=0;i<num;i++)
    {
        printf("\n 進程號 No.%d:\n",i);
        p=(PCB *)malloc(sizeof(PCB));

        printf("\n 輸入進程名:");
        scanf("%s",p->name);

        printf("\n 輸入進程優先數:");
        scanf("%d",&(p->super));

        printf("\n 輸入進程運行時間:");
        scanf("%d",&(p->ntime));

        printf("\n");

        p->rtime=0;
        p->state='w';
        p->link=NULL;

        sort(); /* 調用 sort 函數 */
    }

    system("cls");
    printf("\n ******** 進程建立以下:\n");
    PCB *pr=ready;
    while(pr!=NULL) disp(pr), pr=pr->link;
}

inline void destroy() /*創建進程撤消函數(進程運行結束,撤消進程) */
{
    printf("\n 進程 [%s] 已完成.\n",p->name), free(p);
}

inline void running() /* 創建進程就緒函數(進程運行時間到,置就緒狀態) */
{
    (p->rtime)++;
    if(p->rtime==p->ntime)
        destroy(); /* 調用 destroy 函數 */
    else
        --(p->super), p->state='w', sort();
}

int main() /*主函數*/
{
    input();

    int h=0;
    while(ready!=NULL)
    {
        getchar();
        printf("\n The execute number:%d \n",++h);

        p=ready;
        ready=p->link;
        p->link=NULL;
        p->state='r';

        check();
        running();

        printf("\n 按任意鍵繼續......"), getchar();
    }

    printf("\n\n 進程已經所有完成.\n");
    getchar();

    return 0;
}

/*
3
A
3
5
B
2
3
C
1
4
*/

 

做業調度(FCFS調度):

#include<bits/stdc++.h>
using namespace std;

int cur_time;
int limit;
double turnover_time_sum, weighted_turnover_time_sum;

struct JCB
{
    int index; //做業序號
    string name; //做業名稱
    string state; //狀態
    int estimate_time; //預計運行時間
    int arrive_time; //到達時間
    int running_time; //實際運行時間
    int end_time; //結束時間
    inline int turnover_time()const //週轉時間
    {
        return cur_time-arrive_time;
    }
    inline double weighted_turnover_time()const
    {
        return turnover_time()*1.0/running_time;
    }
    inline int waiting_time()const //等待時間
    {
        return turnover_time()-running_time;
    }

    void print()const
    {
        printf("做業 %d : \t",index);
        cout<<"|名稱: "<<name<<" \t";
        cout<<"|狀態: "<<state<<" \t";
        printf("|到達: %d \t",arrive_time);
        printf("|預計運行: %d \t",estimate_time);
        printf("|已運行: %d \t",running_time);
        printf("|已等待: %d \t",waiting_time());
        if(state=="destroy")
        {
            printf("|週轉時間: %d \t",turnover_time());
            printf("|帶權週轉: %.2f",weighted_turnover_time());
        }
        printf("\n");
    }
};
bool cmp(const JCB &a,const JCB &b)
{
    return a.arrive_time<b.arrive_time;
}

vector<JCB> memory; //內存
queue<JCB> fifo; //FIFO隊列
vector<JCB> destroy; //待銷燬

JCB createJob(int index) //建立
{
    JCB res;

    printf("\n\n做業序號: %d\n",res.index=index);
    res.state="reserve";

    printf("請輸入做業名稱:\n");
    cin>>res.name;

    printf("請輸入預計運行時間:\n");
    cin>>res.estimate_time;

    printf("請輸入到達時間:\n");
    cin>>res.arrive_time;

    res.running_time=0;

    return res;
}

void printJobs() //輸出各個做業狀況
{
    printf("\n************************************************************\n");
    printf("目前時間: %d\n",cur_time);

    printf("\n內存中存在 %d 個做業:\n",memory.size());
    for(auto job:memory) job.print();

    queue<JCB> tmp=fifo;
    printf("\n後備隊列中存在 %d 個做業:\n",tmp.size());
    while(tmp.size()) tmp.front().print(), tmp.pop();

    printf("\n待銷燬 %d 個做業:\n",destroy.size());
    for(auto job:destroy) job.print();

    cout<<endl<<endl<<endl<<endl;
}

void runJobs() //運行內存中的做業
{
    for(unsigned int i=0;i<memory.size();i++)
    {
        memory[i].running_time++;
        if(memory[i].running_time==memory[i].estimate_time)
        {
            memory[i].state="destroy";
            memory[i].end_time=cur_time;
            destroy.push_back(memory[i]);
            memory.erase(memory.begin()+i);
            i--;
        }
    }
}

void destroyJobs() //銷燬待銷燬的做業
{
    for(unsigned int i=0;i<destroy.size();i++)
    {
        turnover_time_sum+=destroy[i].turnover_time();
        weighted_turnover_time_sum+=destroy[i].weighted_turnover_time();
    }
    destroy.clear();
}


int main()
{
    printf("請輸入內存容許的最多做業數目:\n");
    cin>>limit;

    printf("請輸入做業總數目:\n");
    int num; cin>>num;

    vector<JCB> tmp;
    for(int i=0;i<num;i++) tmp.push_back(createJob(i));
    sort(tmp.begin(),tmp.end(),cmp);

    cur_time=0;
    turnover_time_sum=weighted_turnover_time_sum=0.0;
    while(tmp.size()>0 || fifo.size()>0 || memory.size()>0)
    {
        while(memory.size()<limit && fifo.size()>0)
        {
            JCB tmp=fifo.front();
            fifo.pop();
            tmp.state="running";
            memory.push_back(tmp);
        }

        for(unsigned int i=0;i<tmp.size();i++)
        {
            if(tmp[i].arrive_time==cur_time)
            {
                fifo.push(tmp[i]);
                tmp.erase(tmp.begin()+i);
                i--;
            }
        }

        runJobs();

        printJobs();

        destroyJobs();

        cur_time++;
    }

    printf("\n\n該組做業平均週轉時間 %.2f, 平均帶權週轉時間 %.2f.\n",turnover_time_sum/num,weighted_turnover_time_sum/num);
}

/*
2
7
YJC
5
3
HBG
3
1
WYY
10
5
QQQ
2
7
ZVD
8
1
WCY
10
10
YJLGXC
7
5
*/

 

做業調度(SJF調度):

#include<bits/stdc++.h>
using namespace std;

int cur_time;
int limit;
double turnover_time_sum, weighted_turnover_time_sum;

struct JCB
{
    int index; //做業序號
    string name; //做業名稱
    string state; //狀態
    int estimate_time; //預計運行時間
    int arrive_time; //到達時間
    int running_time; //實際運行時間
    int end_time; //結束時間
    inline int turnover_time()const //週轉時間
    {
        return cur_time-arrive_time;
    }
    inline double weighted_turnover_time()const
    {
        return turnover_time()*1.0/running_time;
    }
    inline int waiting_time()const //等待時間
    {
        return turnover_time()-running_time;
    }

    void print()const
    {
        printf("做業 %d : \t",index);
        cout<<"|名稱: "<<name<<" \t";
        cout<<"|狀態: "<<state<<" \t";
        printf("|到達: %d \t",arrive_time);
        printf("|預計運行: %d \t",estimate_time);
        printf("|已運行: %d \t",running_time);
        printf("|已等待: %d \t",waiting_time());
        if(state=="destroy")
        {
            printf("|週轉時間: %d \t",turnover_time());
            printf("|帶權週轉: %.2f",weighted_turnover_time());
        }
        printf("\n");
    }

    bool operator<(const JCB &o)const
    {
        return o.estimate_time<estimate_time;
    }
};
bool cmp(const JCB &a,const JCB &b)
{
    return a.arrive_time<b.arrive_time;
}

vector<JCB> memory; //內存
priority_queue<JCB> heap; //優先隊列
vector<JCB> destroy; //待銷燬

JCB createJob(int index) //建立
{
    JCB res;

    printf("\n\n做業序號: %d\n",res.index=index);
    res.state="reserve";

    printf("請輸入做業名稱:\n");
    cin>>res.name;

    printf("請輸入預計運行時間:\n");
    cin>>res.estimate_time;

    printf("請輸入到達時間:\n");
    cin>>res.arrive_time;

    res.running_time=0;

    return res;
}

void printJobs() //輸出各個做業狀況
{
    printf("\n************************************************************\n");
    printf("目前時間: %d\n",cur_time);

    printf("\n內存中存在 %d 個做業:\n",memory.size());
    for(auto job:memory) job.print();

    priority_queue<JCB> tmp=heap;
    printf("\n後備隊列中存在 %d 個做業:\n",tmp.size());
    while(tmp.size()) tmp.top().print(), tmp.pop();

    printf("\n待銷燬 %d 個做業:\n",destroy.size());
    for(auto job:destroy) job.print();

    cout<<endl<<endl<<endl<<endl;
}

void runJobs() //運行內存中的做業
{
    for(unsigned int i=0;i<memory.size();i++)
    {
        memory[i].running_time++;
        if(memory[i].running_time==memory[i].estimate_time)
        {
            memory[i].state="destroy";
            memory[i].end_time=cur_time;
            destroy.push_back(memory[i]);
            memory.erase(memory.begin()+i);
            i--;
        }
    }
}

void destroyJobs() //銷燬待銷燬的做業
{
    for(unsigned int i=0;i<destroy.size();i++)
    {
        turnover_time_sum+=destroy[i].turnover_time();
        weighted_turnover_time_sum+=destroy[i].weighted_turnover_time();
    }
    destroy.clear();
}


int main()
{
    printf("請輸入內存容許的最多做業數目:\n");
    cin>>limit;

    printf("請輸入做業總數目:\n");
    int num; cin>>num;

    vector<JCB> tmp;
    for(int i=0;i<num;i++) tmp.push_back(createJob(i));
    sort(tmp.begin(),tmp.end(),cmp);

    cur_time=0;
    turnover_time_sum=weighted_turnover_time_sum=0.0;
    while(tmp.size()>0 || heap.size()>0 || memory.size()>0)
    {
        //將若干做業調度運行
        while(memory.size()<limit && heap.size()>0)
        {
            JCB tmp=heap.top(); heap.pop();
            tmp.state="running";
            memory.push_back(tmp);
        }

        //當前時間點到達的做業進入後備隊列
        for(unsigned int i=0;i<tmp.size();i++)
        {
            if(tmp[i].arrive_time==cur_time)
            {
                heap.push(tmp[i]);
                tmp.erase(tmp.begin()+i);
                i--;
            }
        }

        runJobs();

        printJobs();

        destroyJobs();

        cur_time++;
    }

    printf("\n\n該組做業平均週轉時間 %.2f, 平均帶權週轉時間 %.2f.\n",turnover_time_sum/num,weighted_turnover_time_sum/num);
}

/*
2
7
YJC
5
3
HBG
3
1
WYY
10
5
QQQ
2
7
ZVD
8
1
WCY
10
10
YJLGXC
7
5
*/

 

做業調度(HRRN調度):

#include<bits/stdc++.h>
using namespace std;

int cur_time;
int limit;
double turnover_time_sum, weighted_turnover_time_sum;

struct JCB
{
    int index; //做業序號
    string name; //做業名稱
    string state; //狀態
    int estimate_time; //預計運行時間
    int arrive_time; //到達時間
    int running_time; //實際運行時間
    int end_time; //結束時間
    inline int turnover_time()const //週轉時間
    {
        return cur_time-arrive_time;
    }
    inline double weighted_turnover_time()const
    {
        return turnover_time()*1.0/running_time;
    }
    inline int waiting_time()const //等待時間
    {
        return turnover_time()-running_time;
    }
    inline double response_ratio()const //響應比
    {
        return (waiting_time()+estimate_time)*1.0/estimate_time;
    }

    void print()const
    {
        printf("做業 %d : \t",index);
        cout<<"|名稱: "<<name<<" \t";
        cout<<"|狀態: "<<state<<" \t";
        printf("|到達: %d \t",arrive_time);
        printf("|預計運行: %d \t",estimate_time);
        printf("|已運行: %d \t",running_time);
        printf("|已等待: %d \t",waiting_time());
        if(state=="reserve")
        {
            printf("|響應比: %.2f",response_ratio());
        }
        if(state=="destroy")
        {
            printf("|週轉時間: %d \t",turnover_time());
            printf("|帶權週轉: %.2f",weighted_turnover_time());
        }
        printf("\n");
    }
    bool operator>(const JCB &o)const
    {
        return response_ratio()>o.response_ratio();
    }
};
bool cmp(const JCB &a,const JCB &b)
{
    return a.arrive_time<b.arrive_time;
}

vector<JCB> memory; //內存
vector<JCB> rq; //後備隊列
vector<JCB> destroy; //待銷燬

JCB createJob(int index) //建立
{
    JCB res;

    printf("\n\n做業序號: %d\n",res.index=index);
    res.state="reserve";

    printf("請輸入做業名稱:\n");
    cin>>res.name;

    printf("請輸入預計運行時間:\n");
    cin>>res.estimate_time;

    printf("請輸入到達時間:\n");
    cin>>res.arrive_time;

    res.running_time=0;

    return res;
}

void printJobs() //輸出各個做業狀況
{
    printf("\n************************************************************\n");
    printf("目前時間: %d\n",cur_time);

    printf("\n內存中存在 %d 個做業:\n",memory.size());
    for(auto job:memory) job.print();

    printf("\n後備隊列中存在 %d 個做業:\n",rq.size());
    for(auto job:rq) job.print();

    printf("\n待銷燬 %d 個做業:\n",destroy.size());
    for(auto job:destroy) job.print();

    cout<<endl<<endl<<endl<<endl;
}

void runJobs() //運行內存中的做業
{
    for(unsigned int i=0;i<memory.size();i++)
    {
        memory[i].running_time++;
        if(memory[i].running_time==memory[i].estimate_time)
        {
            memory[i].state="destroy";
            memory[i].end_time=cur_time;
            destroy.push_back(memory[i]);
            memory.erase(memory.begin()+i);
            i--;
        }
    }
}

JCB findJobs() //在後備隊列查找做業
{
    unsigned int idx=0;
    for(unsigned int i=1;i<rq.size();i++)
    {
        if(rq[i]>rq[idx]) idx=i;
    }
    printf("調度該做業進入內存:\n");
    rq[idx].print();
    JCB res=rq[idx];
    res.state="running";
    rq.erase(rq.begin()+idx);
    return res;
}

void destroyJobs() //銷燬待銷燬的做業
{
    for(unsigned int i=0;i<destroy.size();i++)
    {
        turnover_time_sum+=destroy[i].turnover_time();
        weighted_turnover_time_sum+=destroy[i].weighted_turnover_time();
    }
    destroy.clear();
}


int main()
{
    printf("請輸入內存容許的最多做業數目:\n");
    cin>>limit;

    printf("請輸入做業總數目:\n");
    int num; cin>>num;

    vector<JCB> tmp;
    for(int i=0;i<num;i++) tmp.push_back(createJob(i));
    sort(tmp.begin(),tmp.end(),cmp);

    cur_time=0;
    turnover_time_sum=weighted_turnover_time_sum=0.0;
    while(tmp.size()>0 || rq.size()>0 || memory.size()>0)
    {
        //將若干做業調度運行
        while(memory.size()<limit && rq.size()>0)
            memory.push_back(findJobs());

        //當前時間點到達的做業進入後備隊列
        for(unsigned int i=0;i<tmp.size();i++)
        {
            if(tmp[i].arrive_time==cur_time)
            {
                rq.push_back(tmp[i]);
                tmp.erase(tmp.begin()+i);
                i--;
            }
        }

        runJobs();

        printJobs();

        destroyJobs();

        cur_time++;
    }

    printf("\n\n該組做業平均週轉時間 %.2f, 平均帶權週轉時間 %.2f.\n",turnover_time_sum/num,weighted_turnover_time_sum/num);
}

/*
2
7
YJC
5
3
HBG
3
1
WYY
10
5
QQQ
2
7
ZVD
8
1
WCY
10
10
YJLGXC
7
5
*/
相關文章
相關標籤/搜索