短作业优先调度算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zzuli_Acmer/article/details/88946004

实验内容:

模拟实现动态高优先权优先(若数值越大优先权越高,每运行一个时间单位优先权-n,若数值越小优先权越高,没运行一个时间单位优先权+n),具体如下:

设置进程体:进程名,进程的到达时间,服务时间,初始优先权,进程状态(W——等待,R——运行,F——完成),进程间的链接指针

进程初始化:由用户输入进程名、服务时间、初始优先权进行初始化,同时,初始化进程的状态为W。

显示函数:在进程调度前、调度中和调度后进行显示。

排序函数:对就绪状态的进程按照优先权排序。优先权相同时进入等待队列时间早的进程在前。注意考虑到达时间

调度函数:每次从等待队列队首调度优先权最高的进程执行,状态变化。并在执行一个时间单位后优先权变化,服务时间变化,状态变化。当服务时间为0时,状态变为F。

删除函数:撤销状态为F的进程。

实验要求:

  1. 测试数据可以随即输入或从文件中读入。
  2. 必须要考虑到进程的到达时间
  3. 最终能够计算每一个进程的周转时间。

操作系统实验。C++优先队列实现,周转时间或其它的相加可以自己家,结果都算出来了~~~

/*
短作业优先调度算法实现
*/
#include<bits/stdc++.h>
using namespace std;

struct job
{
    int id;//作业ID
    int StartTime;//开始时间
    int ServerTime;//服务时间
    int runtime;//运行时间
    int finsihTime;//完成时间
} j[100001];

bool operator <(const job& a,const job& b)//重载优先队列,服务时间短的在前,如果相等,先到达的在前
{
    if(a.ServerTime == b.ServerTime)
        return a.StartTime>b.StartTime;

    return a.ServerTime>b.ServerTime;
}

bool cmp(job a,job b)
{
    return a.id<b.id;
}

priority_queue<job> readQueue;//准备队列

void updateFinishTime(int id,int time)
{
    for(int i=0; ; i++)
    {
        if(j[i].id == id)
        {
            j[i].finsihTime = time;
            break;
        }
    }
}
int main()
{
    int n;
    // int time = 0;
    printf("输入进程个数:");
    scanf("%d",&n);
    printf("输入每个进程的id,到达时间,服务时间\n");
    for(int i=0; i<n; i++)
    {
        scanf("%d %d %d",&j[i].id,&j[i].StartTime,&j[i].ServerTime);
        j[i].runtime = 0;
        //time += j[i].ServerTime;//所有作业完成所需时间
    }
    int cpu = 0;//CPU状态,为0表示空闲,为1表示运行中
    sort(j,j+n,cmp);
    int nowJob = 0;//已到达的作业数量
    job text;//队列顶端的作业
    for(int i=0; ; i++)//从0时刻到完成时刻
    {
        if(i == j[nowJob].StartTime)//有作业到达就压入准备队列
        {
            readQueue.push(j[nowJob]);
            nowJob++;
        }
        if(cpu == 1)//处理机正在运行
        {
            text.runtime++;
            if(text.runtime == text.ServerTime)
            {
                cpu = 0;//CPU置位空闲
                updateFinishTime(text.id,i);
            }
        }
        if(cpu == 0)//处理机空闲
        {
            cpu = 1;//处理机进入工作状态
            if(!readQueue.empty())
            {
                text = readQueue.top();//从准备队列中取出服务时间最短的作业
                readQueue.pop();
            }
        }
        if(readQueue.empty() && nowJob == n)
        {
            updateFinishTime(text.id,i+text.ServerTime);
            break;
        }
    }
    for(int i=0; i<n; i++)
    {
        printf("第%d个进程的结束时间:%d\n",i, j[i].finsihTime);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zzuli_Acmer/article/details/88946004