实验一 进程调度算法设计与实现之短进程优先

实验一 进程调度算法设计与实现之短进程优先
1.内容:设计一个简单的进程调度算法,模拟OS中的进程调度过程;
2.要求:
① 进程数不少于5个;
② 进程调度算法如下三种:
动态优先数加时间片轮转法实现进程调度,每运行一个时间片优先数减3(必做);
多级队列轮转(可选);
高响应比优先(可选);
短进程优先(可选);
③ 用C语言、C++或Java编程;
④ 程序运行时显示进程调度过程。
3.步骤:
① 设计PCB及其数据结构:
进程标识数:ID
进程优先数:PRIORITY(优先数越大,优先级越高)
进程已占用时间片:CPUTIME,每得到一次调度,值加1;
进程还需占用时间片:ALLTIME,每得到一次调度,该值减1,一旦运行完毕,ALLTIME为0)
进程队列指针:NEXT,用来将PCB排成队列
进程状态:STATE(一般为就绪,可以不用)
② 设计进程就绪队列及数据结构;
③ 设计进程调度算法,并画出程序流程图;
④ 设计输入数据和输出格式;
结构格式:当前正运行的进程:0
当前就绪队列:2,1,3,4
⑤ 编程上机,验证结果。
4.提示:进程调度信息可以初始化时静态生成,也可以程序运行过程动态到达;
假设调度前,系统中有5个进程,其初始状态如下:
ID 0 1 2 3 4
PRIORITY 9 38 30 29 0 可否考虑用数组或链表去实现
CPUTIME 0 0 0 0 0
ALLTIME 3 2 6 3 4
STATE ready ready ready ready ready
① 以时间片为单位调度运行;
② 每次调度ALLTIME不为0,且PRIORITY最大的进程运行一个时间片;
③ 上述进程运行后其优先数减3,再修改其CPUTIME和ALLTIME,重复②,③
④ 直到所有进程的ALLTIME均变为0。
5.书写实验报告
① 实验题目;
② 实验要求;
③ 程序中所用数据结构及说明;
④ 调度算法思想描述;
⑤ 算法流程图;
○6 程序清单;
○7 测试数据及实验结果分析: 输出调度序列,计算不同算法下进程平均周转时间并比较。

以上为报告要求。
*
本文为博主原创文章,未经博主允许不得转载。
版权为陈博超所有,第一次于2021年11月30日发表于BLOG上
本BLOG上原创文章未经本人许可,不得用于商业用途。转载请经允许后注明出处,否则保留追究法律责任的权利。
*
以下部分为实现代码:
温馨提示:代码所用部分特性为C++11新特性,在例如vs2010这类不支持C++11的老版本上无法使用,请在已经支持C++11新特性的vs版本上使用

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class pcb 
{public:
    string name;                                //进程名
    double arr;                                 //到达时间
    double ser;                                 //运行时间
};
bool compare(pcb a, pcb b)                      //自定义比较函数,目的是帮助sort函数找出第一个运行的进程
{
    if (a.arr == b.arr)
        return a.ser < b.ser;
    return a.arr < b.arr;
}

int main()
{   vector<pcb> a =                             //进程调度信息初始化静态生成数组容器
                   {                           
                        {"P1", 0, 7}, {"P2", 2, 5}, {"P3", 4, 1}, {"P4", 5, 4}, {"P5", 6, 3},
                   };

    sort(a.begin(), a.end(), compare);          //运用sort函数找出应该第一个运行的进程
    cout << "进程名 \t到达时间\t运行时间\t开始时间\t结束时间\t周转时间\t带权周转时间" << endl;
    double sta = a[0].arr;
    for (int i = 0; i < a.size(); i++)
    {
        double jiesu = sta + a[i].ser;
        double zhouz = jiesu - a[i].arr;
        double Dzhouz = zhouz / a[i].ser;
        cout << endl;
        cout << a[i].name << "\t" << a[i].arr << "\t\t" << a[i].ser << "\t\t";
        cout << sta << "\t\t" << jiesu << "\t\t" << zhouz << "\t\t" << Dzhouz << endl;

        if (i < a.size() - 2)                                               //保证数组不越界
        {
            int max = i + 1;
            for (int j = max + 1; j < a.size() && a[j].arr <= jiesu; j++)   //找出就绪队列里应执行的下一个进程的数组下标
            {
                if (a[j].ser < a[max].ser)
                    max = j;
            }
            pcb temp = a[max];                                              //将该执行的下一个进程和就绪队列中的第一个进程交换
            a[max] = a[i + 1];
            a[i + 1] = temp;
        }
        if (i < a.size() - 1)                                               //保证数组不越界
            sta = jiesu > a[i + 1].arr ? jiesu : a[i + 1].arr;
    }
}

运行截图如下:
在这里插入图片描述

码字不易,穷酸学生,各位老板打赏个1分钱支持一下,谢谢大家。
前人栽树,后人乘凉。如果有学弟学妹看到了也希望能点赞支持一下,学长搞这些真心不容易
在这里插入图片描述

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值