操作系统——短作业优先调度算法

操作系统——短作业优先调度算法

实验内容

模拟实现FCFS/SJF调度。

设置作业体:作业名,作业的到达时间,服务时间,作业状态(W——等待,R——运行,F——完成),作业间的链接指针;

作业初始化:由用户输入作业名、服务时间、到达时间进行初始化,同时,初始化作业的状态为W。

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

排序函数:对等待状态的作业按照调度算法排序(不同的调度算法排序方式不同),注意考虑到达时间。

调度函数:每次从等待队列队首调度已到达的适合的作业执行,状态变化。当服务结束时,状态变为F。

删除函数:撤销状态为F的作业。

实验要求

(1)测试数据可以随即输入或从文件中读入;
(2)必须要考虑到作业的到达时间;
(3)最终能够计算每一个作业的周转时间、带权周转。

实验要求做先来先服务或者短作业优先都可以,这里我做的是抢占式的短作业优先算法,一些函数没有按着实验内容里给的函数来,但是实验要求的内容基本都实现了。

先看一下实验结果:
输入的数据是之前我们学校慕课上的一个题目的数据:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
先显示作业的初始状态:
在这里插入图片描述
显示调度情况:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
计算出的各个作业的周转时间和带权周转时间:
在这里插入图片描述
可以自己算一下,程序运行出来的结果是对的,我只测试了慕课上的样例,其他的样例没测,如有错误,欢迎指正。
代码如下:

#include <bits/stdc++.h>

using namespace std;
const int MAX = 1e5;

#define W "waitting"
#define R "running"
#define F "finished"

struct WORK
{
    string work_name; // 作业名
    int serve_time; // 剩余服务时间
    int r_serve_time; // 服务时间
    int arrive_time; // 到达时间
    string work_state; // 作业状态
    int end_time; // 结束时间
    int turnover_time; // 周转时间
};

WORK work[MAX]; // 作业

int n; // 作业数量

bool cmp_SJF(WORK x, WORK y) // 排序函数
{
    if(x.serve_time != y.serve_time) // 服务时间不同时短作业优先
        return x.serve_time < y.serve_time;
    else // 服务时间相同时先来先服务
        return x.arrive_time < y.arrive_time;
}

bool cmp_arr_time(WORK x, WORK y) // 按到达时间从小到大排序
{
    return x.arrive_time < y.arrive_time;
}

int count_work(int t) // 计算某一时间有多少个作业进入
{
    int cnt = 0;
    for(int i = 1; i <= n; i++)
    {
        if(work[i].arrive_time <= t)
            cnt++;
    }
    return cnt;
}

void update_work(int num, int c_time) // 更新当前每个作业的状态
{
    int t = 0;
    for(int i = 1; i <= num; i++)
    {
        if(work[i].serve_time <= 0) // 作业已经结束
        {
            work[i].serve_time = 0;
            work[i].work_state = F;
        }
        else if(work[i].serve_time > 0) // 作业还没结束
        {
            work[i].serve_time --;
            work[i].work_state = R;
            t = i;
            break;
        }
    }

    for(int i = 1; i <= n; i++) // 更新状态
    {
        if(i != t)
        {
            if(work[i].work_state != F)
                work[i].work_state = W;
        }
        if(work[i].work_state == F && work[i].end_time == -1)
            work[i].end_time = c_time;
    }

}

bool judge_over() // 判断作业是否全部完成
{
    for(int i = 1; i <= n; i++)
        if(work[i].work_state != F)
            return false;
    return true;
}

int main()
{
    cout << "请输入要调度的作业:" << endl;
    cout << "要调度的作业的数量:" ;
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        cout << "作业名: " << endl;
        cin >> work[i].work_name;
        cout << "作业服务时间: " << endl;
        cin >> work[i].serve_time;
        cout << "作业到达时间: " << endl;
        cin >> work[i].arrive_time;
        work[i].work_state = W;
        work[i].end_time = -1;
        work[i].r_serve_time = work[i].serve_time;
    }

    sort(work + 1, work + 1 + n, cmp_arr_time); // 先按到达时间排序

    cout << "作业初始状态:" << endl;
    cout << "    作业名    " << "    到达时间    "
     << "    服务时间    " << "    当前状态    " << endl;
    for(int i = 1; i <= n; i++)
    {
        cout  << setw(8) << work[i].work_name << setw(16)
        << work[i].arrive_time << setw(13) << work[i].serve_time
        << setw(21)  << work[i].work_state << endl;
    }
    cout << endl;

    int arrive_num = 0; // 已到达的作业数量
    int current_time = 0; // 当前时间

    cout << "作业调度情况如下:" << endl;


    bool is_over = false;

    while(!is_over)
    {
        cout << "    时刻    " << "    作业名    " << "    到达时间    "
        << "    剩余服务时间    " << "    当前状态    " << endl;
        arrive_num = count_work(current_time);
        sort(work + 1, work + 1 + arrive_num, cmp_SJF); // 排序

        update_work(arrive_num, current_time);

        for(int i = 1; i <= arrive_num; i++)
        {
            cout  << setw(6) << current_time << setw(13) << work[i].work_name
            << setw(15) << work[i].arrive_time << setw(15) << work[i].serve_time
            << setw(24)  << work[i].work_state << endl;
        }

        current_time ++;
        is_over = judge_over();
        cout << endl;
    }

    cout << "各作业的周转时间和带权周转时间如下:" << endl;
    cout << "    作业名    " << "    周转时间    " << "    带权周转时间    " << endl;
    for(int i = 1; i <= n; i++)
    {
        work[i].turnover_time = work[i].end_time - work[i].arrive_time; // 周转时间
        double wight_time = 1.0 * work[i].turnover_time / work[i].r_serve_time; // 带权周转时间

        cout << setw(6) << work[i].work_name << setw(15) << work[i].turnover_time << setw(18);
        cout.precision(4);
        cout << wight_time << endl;
    }
    return 0;
}

  • 24
    点赞
  • 172
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值