目录

2024-12-04-操作系统短作业优先调度算法

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

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

实验内容

模拟实现FCFS/SJF调度。

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

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

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

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

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

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

实验要求

(1)测试数据可以随即输入或从文件中读入;

(2)必须要考虑到作业的到达时间;

(3)最终能够计算每一个作业的周转时间、带权周转。

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

先看一下实验结果:

输入的数据是之前我们学校慕课上的一个题目的数据:

https://i-blog.csdnimg.cn/blog_migrate/44a409a65a2ede6554bf2d08346da59f.png

https://i-blog.csdnimg.cn/blog_migrate/3d9bb03faac9921bda4ad5cf0d7df765.png

https://i-blog.csdnimg.cn/blog_migrate/08a37efe0374909cd23bc86284b74923.png

先显示作业的初始状态:

https://i-blog.csdnimg.cn/blog_migrate/9b5bf4e098bfe3fbb9b848ab206bd662.png

显示调度情况:

https://i-blog.csdnimg.cn/blog_migrate/5ea562fe29e7435865f89f8350c4013d.png

https://i-blog.csdnimg.cn/blog_migrate/eccc9e2e7eb72704524d06ac261166d9.png

https://i-blog.csdnimg.cn/blog_migrate/5cadc09be9d9697b7257f71124edd65a.png

https://i-blog.csdnimg.cn/blog_migrate/668b07fa8c092e946f9eeec08f131e12.png

计算出的各个作业的周转时间和带权周转时间:

https://i-blog.csdnimg.cn/blog_migrate/88f8633703c91bf4002f97e38e73256a.png

#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;
}

68747470733a2f2f626c6f672e:6373646e2e6e65742f77656978696e5f34343632303138332f:61727469636c652f64657461696c732f313137343632303337