关闭

以高响应比优先为基础的轮转调度算法

标签: 操作系统算法
714人阅读 评论(0) 收藏 举报
分类:

(文章待更新)设计程序模拟进程的轮转法调度过程。假设初始状态为:有n个进程处于就绪状态,有m个进程处于阻塞状态。采用轮转法进程调度算法、高响应比优先(HRRN)进行调度(调度过程中,假设处于执行状态的进程不会阻塞),且每过t个时间片系统释放资源,唤醒处于阻塞队列队首的进程。《操作系统》课程实验教学大纲《操作系、

程序要求如下:《操作系统》课程实验教学大纲《操作系统》课程实验教学大纲课程名称

(1)    输出系统中进程的调度次序;

(2)    计算CPU利用率。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<iomanip>
#define eps (1e-8)
using namespace std;
struct prog
{
    char name[100];
    int atim;  ///到达时间
    int ptim;  ///服务时间
    int pptim;
    int ftim;  ///完成时间
    int rtim;  ///周转时间
    int wtim;  ///HRRN算法等待时间
    double pror; ///优先级
    double rrtim; ///带权周转时间
    friend bool operator<(prog a,prog b)
    {
        if((a.pror-b.pror)<eps)
            return a.atim>b.atim;
        return (a.pror-b.pror)>eps;
    }
} pro[50];
bool cmp(prog a,prog b)
{
    return a.ftim<b.ftim;
}
int n,t,p=0,num=0,pp=0;///进程数 时间片 当前时刻
///模拟调度队列
priority_queue<prog>q;
void init()
{
    printf("请输入进程个数:\n");
    scanf("%d",&n);
    int cur=1;
    for(int i=1; i<=n; i++)
    {
        printf("请输入进程名%d:\n",cur++);
        scanf("%s",&pro[i].name);
        printf("请输入该进程到达时间:\n");
        scanf("%d",&pro[i].atim);
        printf("请输入该进程服务时间:\n");
        scanf("%d",&pro[i].ptim);
        pro[i].pptim=pro[i].ptim;
        pro[i].wtim=0;
        pro[i].rtim=0;
        pro[i].pror=(pro[i].wtim+pro[i].ptim)*1.0/pro[i].ptim;
    }
    printf("请输入时间片:\n");
    scanf("%d",&t);
}
void solve()
{
    for(int i=1; i<=n; i++) q.push(pro[i]);
    while(!q.empty())
    {
        prog cnt=q.top();
        if(cnt.atim>p)
        {
            p++;
            pp++;
            continue;
        }
        q.pop();
        int tmp=t;
        cnt.wtim=0;
        while(tmp--)
        {
            cout<<p<<" "<<cnt.name<<" "<<cnt.ptim<<endl;
            cnt.ptim--;
            p++;
            for(int i=1; i<=n; i++)
            {
                if(strcmp(cnt.name,pro[i].name)!=0&&pro[i].ptim!=0&&p>pro[i].atim)
                {
                    pro[i].wtim++;
                    pro[i].pror=(pro[i].wtim+pro[i].ptim)*1.0/pro[i].ptim;
                }
            }
            while(!q.empty())
            {
                q.pop();
            }
            for(int i=1; i<=n; i++)
            {
                if(strcmp(cnt.name,pro[i].name)!=0&&pro[i].ptim!=0)
                {
                    q.push(pro[i]);
                }
            }
            if(cnt.ptim==0)
            {
                num++;
                for(int i=1; i<=n; i++)
                {
                    if(strcmp(cnt.name,pro[i].name)==0)
                    {
                        pro[i].ftim=p;
                        pro[i].rtim=p-pro[i].atim;
                        pro[i].ptim=0;
                        pro[i].rrtim=(pro[i].rtim*1.0)/(pro[i].pptim*1.0);
                        break;
                    }
                }
                if(tmp!=0)
                {
                    pp+=tmp;
                    /*cnt=q.top();
                    while(cnt.atim>p)
                    {
                        p++;
                        pp++;
                    }
                    q.pop();
                    cnt.wtim=0;*/
                }
                else
                    continue;
            }
            if(tmp==0&&cnt.ptim>0)
            {
                cnt.pror=1;///这里将等待时间置零
                q.push(cnt);
            }
            if(num==n)
                return;
        }
    }
}
void output()
{
    printf("进程处理完毕\n");
    sort(pro+1,pro+n+1,cmp);
    printf("进程名\t完成时间\t周转时间\t带权周转时间\n");
    for(int i=1; i<=n; i++)
    {
        printf("%s\t\t%d\t\t%d\t\t%.2lf\n",pro[i].name,pro[i].ftim,pro[i].rtim,pro[i].rrtim);
    }
    printf("CPU的利用率为:%.2lf %%\n",(p-pp)*1.0/p*1.0*100);
}
int main()
{
    init();
    solve();
    output();
    return 0;
}
/*
5
A
0
4
B
1
3
C
2
4
D
3
2
E
4
4
1
*/
/*if(tmp==cnt.ptim)
{
    while(!q.empty()) q.pop();
    p+=t;
    for(int i=1; i<=n; i++)
    {
        if(strcmp(cnt.name,pro[i].name)==0)
        {
            pro[i].ftim=p;
            pro[i].rtim=p-pro[i].atim;
        }
        else
        {
            pro[i].wtim+=t;
            pro[i].pror=(pro[i].wtim+pro[i].ptim)*1.0/pro[i].ptim;
            q.push(pro[i]);
        }
    }
    printf("进程%s处理完毕\n",cnt.name);
}
else if(tmp>cnt.ptim)
{
    while(tmp--)
    {

    }
}
else if(tmp<cnt.ptim)
{
    cnt.ptim-=t;
    p+=t;

}
*/
/*printf("名字\t到达时间\t服务时间\t优先级\n");
while(!q.empty())
{
    prog cur=q.top();
    q.pop();
    printf("%s\t\t%d\t\t%d\t\t%.lf\n",cur.name,cur.atim,cur.ptim,cur.pror);
}*/


《操作系统》课程实验教学

0
1

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:12729次
    • 积分:481
    • 等级:
    • 排名:千里之外
    • 原创:37篇
    • 转载:0篇
    • 译文:0篇
    • 评论:5条