操作系统(2)抢占式短进程优先调度算法模拟实现

1. 效果展示

2. 程序流程图

3. 数据结构设计

1进程控制块PCB定义

(2) 进程存储结构定义

4. 功能函数设计

序号

函数

功能说明

1

void process_controller();

进程调度控制函数:接收用户指令并响应

2

void print_menu();

打印命令菜单

3

void create_process();

创建进程

4

void query_process();

查看进程

5

void close_process();

关闭进程

6

void run_process();

运行进程

7

int find_minTime_process();

寻找最短进程

8

void print_process(PCB process);

打印单个进程具体信息

9

bool check_process(int check_processId);

检查该进程号是否已存在

5. 代码实现

/// 进程调度算法
#include <bits/stdc++.h>
#include <windows.h>
using namespace std;

/*
* 设计目的:
*
* [1] 设计可用于该实验的进程控制块,进程控制块包括:进程号、要求服务时间、剩余服务时间、进程优先级、进程是否完成
*
* [2] 动态创建多个进程
*
* [3] 模拟操作系统的 可抢占式短作业优先 进程调度算法
*
* [4] 调度所创建的进程并显示调度结果
*/


/// 数据结构声明
// 进程控制块
typedef struct Process_Control_Block
{
    // 进程号
    int processId;
    // 进程要求服务时间
    int processServeTime;
    // 进程剩余服务时间
    int processRemainingTime;
    // 进程是否完成
    bool processIsFinished;
} PCB;

/// 函数声明
// 进程控制器
void process_controller();
//打印命令菜单
void print_menu();
//创建进程
void create_process();
// 查看进程
void query_process();
// 关闭进程
void close_process();
// 运行进程
void run_process();
// 寻找最短作业的进程
int find_minTime_process();
// 打印单个进程
void print_process(PCB process);
// 检查该进程号是否已存在
bool check_process(int check_processId);

/// 全局变量声明
// 进程容器
vector<PCB> processList;

int main()
{
    cout<<"欢迎使用可抢占式短进程优先调度算法模拟系统!"<<endl;
    process_controller();
    return 0;
}

void print_menu()
{
    cout<<endl;
    cout << "+-------------------------------+" << endl;
    cout << "|\t>>> 命令菜单 <<<\t|" << endl;
    cout << "|\t1.创建新进程\t\t|" << endl;
    cout << "|\t2.查看所有进程\t\t|" << endl;
    cout << "|\t3.关闭进程\t\t|" << endl;
    cout << "|\t4.运行进程\t\t|" << endl;
    cout << "|\t0.退出\t\t\t|" << endl;
    cout << "+-------------------------------+" << endl;
}

void process_controller()
{
    print_menu();
    cout<<"请选择您要进行的操作:";
    int order;
    cin>>order;
    switch(order)
    {
    case 1:
        create_process();
        break;
    case 2:
        query_process();
        break;
    case 3:
        close_process();
        break;
    case 4:
        run_process();
        break;
    case 0:
        cout<<"正在退出..."<<endl;
        Sleep(1000);
        cout<<"安全退出,欢迎下次使用!"<<endl;
        exit(0);
        break;
    default:
        cout<<"不存在此命令,请重试!"<<endl;
    }
    process_controller();
}

void create_process()
{
    PCB process;

    cout << "请输入该进程的进程号:";
    int input_processId;
    cin>>input_processId;
    if(check_process(input_processId)==false)
    {
        cout<<"错误:该进程号已存在!"<<endl;
        return;
    }
    else
    {
        process.processId = input_processId;
        process.processIsFinished = false;

        cout << "请输入该进程需要的服务时间:";
        cin>>process.processServeTime;
        process.processRemainingTime = process.processServeTime;

        cout << "进程创建成功!"<<endl;

        processList.push_back(process);
    }
}

bool check_process(int check_processId)
{
    int len = processList.size();
    for(int i=0; i<len; i++)
    {
        if(processList[i].processId == check_processId)
        {
            return false;
        }
    }
    return true;
}

void query_process()
{
    cout << endl << "| 进程号\t| 服务时间\t| 剩余时间\t| 进程状态\t|" << endl;

    for(int i=0; i<processList.size(); i++)
    {
        print_process(processList[i]);
    }

}

void close_process()
{
    cout<<"请输入您要关闭的进程号:";
    int closedProcessId;
    cin>>closedProcessId;
    for(int i=0; i<processList.size(); i++)
    {
        if(processList[i].processId == closedProcessId)
        {
            processList[i].processIsFinished = true;
            processList[i].processRemainingTime = 0;
            cout<<"进程"<<closedProcessId<<"已成功关闭!"<<endl;
            return;
        }
    }
    cout<<"不存在此进程!";
}

void run_process()
{
    int target_processIndex = find_minTime_process();
    if(target_processIndex == -1)
    {
        cout<<"所有进程均已执行完毕!"<<endl;
        return;
    }

    // 先打印信息,再执行进程
    print_process(processList[target_processIndex]);

    // 剩余服务时间减少
    processList[target_processIndex].processRemainingTime--;

    if(processList[target_processIndex].processRemainingTime==0)
        processList[target_processIndex].processIsFinished = true;
}

void print_process(PCB process)
{
    string processState = process.processIsFinished ? "已结束" : "未结束" ;

    cout << "| 进程\t" << process.processId << "\t| " << process.processServeTime
         << "\t\t| " << process.processRemainingTime << "\t\t| "
         << processState << "\t|" << endl;
}

int find_minTime_process()
{
    int overCnt = 0;
    int minTime_processIndex = 0;
    int minTime = processList[0].processRemainingTime;

    for(int i=0; i<processList.size(); i++)
    {
        if(processList[i].processIsFinished)
            overCnt++;

        if(processList[i].processRemainingTime>=minTime)
        {
            minTime = processList[i].processRemainingTime;
            minTime_processIndex = i;
        }
    }

    if(overCnt == processList.size())
        return -1;
    else
        return minTime_processIndex;
}

1. 实验目的 调度的实质是操作系统按照某种预定的策略来分配资源。进程调度的目的是分配CPU资源。由于进程调度程序执行的频率很高,因此调度算法的好坏直接影响到操作系统的性能。本实验的目的是编程模拟实现几种常用的进程调度算法,通过对几组进程分别使用不同的调度算法,计算进程的平均周转时间和平均带权周转时间,比较各种算法的性能优劣。 2. 实验原理 [1]. 进程调度算法描述 进程调度算法包括先来先服务调度算法、最作业时间优先抢占和非抢占)、最高响应比调度算法4种。(每个人必须做FCFS,然后在后面的三种中任选一种,即每个人必须做2种调度算法模拟。) [2]. 衡量算法性能的参数 计算进程的平均周转时间和平均带权周转时间。 3. 实验内容 (1)编程实现实验的程序,要求: [1]. 建立进程进程控制进程控制至少包括: a) 进程名称; b) 进程需要执行时间; c) 进入就绪队列时间; d) 进程执行开始时间 e) 进程执行结束时间 [2]. 编程实现调度算法。 [3]. 进程及相关信息的输入。这些信息可以直接从键盘上输入,也可以从文件读取。 [4]. 时间片与时间流逝的模拟。本实验需要对算法的执行计时,程序应该提供计算时间的方法。一种最简单的方法是使用键盘,比如每敲一次空格代表一个时间片的流逝。另一种方法是使用系统时钟。 [5]. 一组进程序列执行完毕,打印出结果信息。程序需要计算出每个进程的开始执行时间、结束时间、周转时间和带权周转时间,并为整个进程序列计算平均周转时间和平均带权周转时间。程序将计算结果按一定的格显示在计算机屏幕上或输出到文件中。打印出进程调度顺序图。 [6]. 实现数据在磁盘文件上的存取功能。 (2)对下列就绪进程序列分别使用上面的几种算法进行调度,计算每种算法下的平均周转时间和平均带权周转时间进程 到达时间 要求执行时间 0 0 1 1 1 35 2 2 10 3 3 5 4 6 9 5 7 21 6 9 35 7 11 23 8 12 42 9 13 1 10 14 7 11 20 5 12 23 3 13 24 22 14 25 31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值