• 实验三进程调度实验


    1. 目的和要求

    实验目的

    用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解。

    实验要求

    设计一个有 N(N不小于5)个进程并发执行的进程调度模拟程序。

    进程调度算法:“时间片轮转法”调度算法对N个进程进行调度。 

    2. 实验内容

    完成两个算法(简单时间片轮转法、多级反馈队列调度算法)的设计、编码和调试工作,完成实验报告。

    1) 每个进程有一个进程控制块(PCB)表示。进程控制块包含如下信息:进程名、优先级、到达时间、需要运行时间、已用CPU时间、进程状态等等。 

    2) 每个进程的状态可以是就绪 r(ready)、运行R(Running)、或完成F(Finished)三种状态之一。

    3) 就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。

    4) 如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,应把它插入就绪队列等待下一次调度。

    5) 每进行一次调度,程序都打印一次运行进程、就绪队列中各个进程的 PCB,以便进行检查

    3、源程序

    #include<stdio.h>
    #include<stdlib.h>
    #include<malloc.h>
    #include<time.h>
    #include <iostream.h>
    #define TRUE 1
    #define FALSE 0
    #define OK 1
    typedef struct PCB
    {
    int ID;
    int Priority;
    int CPUTime;
    int ALLTime;
    int Status;
    }PCB;
    typedef PCB Dt;
    typedef struct Node
    {
    Dt data;
    struct Node *next;
    }Node;
    Node *head=(Node *)malloc(sizeof(Node));
    Node *head1=(Node *)malloc(sizeof(Node));
    Node *head2=(Node *)malloc(sizeof(Node));
    int n;
    void create(int n)
    {
    int i=1;
    srand((int)time(0));
    head->next=NULL;
    Node *q=head;
    cout<<" 优先数 优先级 CPUTime AllTime Status "<<endl;
    while(i<=n)
    {
    Node *p=(Node *)malloc(sizeof(Node));
    p->data.ID=i;
    p->data.CPUTime=0;
    p->data.Status=0;
    p->data.Priority=rand()%10+1;
    p->data.ALLTime=rand()%8+1;
    cout<<" "<<p->data.ID<<" "<<p->data.Priority<<" "<<
    p->data.CPUTime<<" "<<p->data.ALLTime<<" "<<p->data.Status<<endl;
    p->next=NULL;
    q->next=p;
    q=q->next;
    i++;
    }
    Node *p0=head1;
    head1->next=NULL;
    for(q=head->next;q!=NULL;q=q->next)
    {
    Node *r=(Node *)malloc(sizeof(Node));
    r->data.ID=q->data.ID;
    r->data.CPUTime=q->data.CPUTime;
    r->data.Status=q->data.Status;
    r->data.Priority=q->data.Priority;
    r->data.ALLTime=q->data.ALLTime;
    p0->next=r;
    r->next=NULL;
    p0=p0->next;
    }
    Node *p1=head2;
    head2->next=NULL;
    for(q=head->next;q!=NULL;q=q->next)
    {
    Node *k=(Node *)malloc(sizeof(Node));
    k->data.ID=q->data.ID;
    k->data.CPUTime=q->data.CPUTime;
    k->data.Status=q->data.Status;
    k->data.Priority=q->data.Priority;
    k->data.ALLTime=q->data.ALLTime;
    p1->next=k;
    k->next=NULL;
    p1=p1->next;
    }
    }

    void FCFS()
    {
    Node *p=head->next;
    while(p!=NULL)
    {
    cout<<"执行进程"<<endl<<p->data.ID;
    p=p->next;
    }
    cout<<endl;
    cout<<"所有进程都执行完成"<<endl;
    }

    void SJF()
    {
    Node *p;
    Node *pmin;
    while(head2->next!=NULL)
    {
    pmin=head2->next;
    for(p=head2->next;p!=NULL;p=p->next)
    {
    if(pmin->data.ALLTime>p->data.ALLTime)
    pmin=p;
    }
    cout<<"执行剩余区间长度最短的进程"<<endl<<pmin->data.ID;
    for(p=head2;p!=NULL;p=p->next)
    {
    if(p->next==pmin)
    {
    p->next=p->next->next;
    free(pmin);
    }
    }
    }
    cout<<endl;
    cout<<"所有进程都执行完成"<<endl;
    }

    void action(Node *p)
    {
    Node *q=head->next;
    while(q!=NULL)
    {
    cout<<p->data.ID<<"执行一个时间片的进程"<<endl;
    if(q!=p)
    q->data.Priority=q->data.Priority+1;
    else
    {
    q->data.Priority=q->data.Priority-3;
    if(q->data.ALLTime>4)
    q->data.ALLTime-=4;
    else
    q->data.ALLTime=0;
    q->data.Status=1;
    }
    q=q->next;
    }
    }

    void SearchMaxPRI(int m)
    {
    Node *p=head->next;
    Node *q=head->next;
    Node *q0=head;

    while(q!=NULL)
    {
    if(q->data.ALLTime==0)
    {
    cout<<q->data.ID<<"进程已执行完成"<<endl;
    n--;
    q0->next=q0->next->next;
    free(q);
    q=q0->next;
    }
    else
    {
    if(q->data.Priority>p->data.Priority)
    p=q;
    q0=q0->next;
    q=q->next;
    }
    }
    if(n>0)
    action(p);
    }

    void RR(int m)
    {
    Node *p;
    while(head1->next!=NULL)
    {
    p=head1->next;
    Node *prep=head1;
    Node *q;

    while(p!=NULL)
    {
    cout<<p->data.ID<<"执行进程一个时间片"<<endl;
    for(q=head1;q->next!=NULL;q=q->next)
    {
    if(q->next==p)
    {
    p->data.ALLTime-=4;
    p->data.CPUTime+=4;
    }
    }
    if(p->data.ALLTime<=0)
    {
    cout<<p->data.ID<<"进程已执行完成"<<endl;
    prep->next=prep->next->next;
    free(p);
    p=prep->next;
    }
    else
    {
    prep=prep->next;
    p=p->next;
    }
    }
    cout<<endl;
    cout<<"进入下一次轮转"<<endl;
    }
    cout<<"所有进程都执行完成"<<endl;
    }
    int main()
    {
    cout<<"请输入系统进程数:"<<endl;
    cin>>n;
    int m=n;
    if(n==0)
    cout<<"此时没有就绪进程"<<endl;
    else
    {
    create(n);
    cout<<endl;
    cout<<"先来先服务调度"<<endl;
    FCFS();
    cout<<endl;
    cout<<"短进程优先调度"<<endl;
    SJF();
    cout<<endl;
    cout<<"动态优先级调度"<<endl;
    while(head->next!=NULL)
    {
    SearchMaxPRI(m);
    }
    cout<<"所有进程都执行完成"<<endl;
    cout<<endl;
    cout<<"时间片轮转调度"<<endl;
    RR(m);
    }
    }

    4、程序运行结果

    5、实验总结

       对磁盘调度的四种算法——先来先服务算法,短进程优先调度算法,时间片轮转调度算法,动态优先级调度有了更深刻的理解和掌握,使我能够为进程调度选择适当的算法,提高CPU工作效率。

  • 相关阅读:
    CSS压缩工具(自动合并重复的定义)
    windows创建服务
    ashx是什么文件,如何创建(转载)
    在mojoportal中建立自定义模块
    Mojoportal2339之汇总页面
    在vs2008中设置jquery智能提示 (转载)
    关于mojoportal在局域网或单机使用时注意事项
    html编辑器kindeditor我的使用方法 (转载)
    visual studio 2008 没有设计视图的解决方法(转载)
    模块开发捷径配置参数
  • 原文地址:https://www.cnblogs.com/panhaohua/p/5016940.html
Copyright © 2020-2023  润新知