操作系统实验——处理机调度算法的实现

实验内容:

Exercise 1: 设定系统中有五个进程,每一个进程用一个进程控制块表示。

Exercise 2: 输入每个进程的“优先数”和“要求运行时间”。

Exercise 3: 为了调度方便,将五个进程按给定的优先数从大到小连成就绪队列。用一单元指出队列首进程,用指针指出队列的连接情况。

Exercise 4: 处理机调度总是选队首进程运行。采用动态优先数算法,进程每运行一次优先数就减“1”,同时将运行时间减“1”。

Exercise 5: 若某进程运行时间为零,则将其状态置为“结束”,且退出队列。

Exercise 6: 运行所设计程序,显示或打印逐次被选中进程的进程名,以及进程控制块的动态变化过程

1.头文件

#include <iostream>
#include <vector>
#include <algorithm>

#include < vector>
这个头文件提供了std::vector模板类的定义。std::vector是一个序列容器,能够存储具有相同类型的元素的动态数组。与普通的C数组不同,std::vector能够在运行时自动管理存储空间的分配和释放,支持动态地增加或减少元素的数量,并且能够自动处理元素的内存分配。

#include < algorithm>
这个头文件包含了各种算法函数,如排序、搜索、比较、复制、填充、变换等。这些算法可以对容器(如std::vector)中的元素进行操作,但算法本身并不管理容器的内存。算法通常接受迭代器作为参数,允许它们操作不同种类的容器。

2.定义一个结构体,用于表示各个进程

struct Process {
    std::string name;
    int priority;
    int burst_time;
    Process(std::string n, int p, int b) : name(n), priority(p), burst_time(b) {}
};

这个结构体Process中包含了三个部分:进程名(name),优先数(priority),运行时间(burst_time)。
然后定义了一个构造函数名为Process,后续可使用此函数直接定义一个Process结构体,如:
Process p1(“Process1”, 1, 10);
定义了一个结构体名为p1,进程名为Process1,优先数为1,运行时间为10的结构体,在此用为表示一个进程。

3.定义一个类Mu,包含了需要用到的两个方法

类的代码
class Mu{

public:

    void processes_set(std::vector<Process>& processes) {
        for (int i = 0; i < 5; ++i) {
            std::string name;
            int priority, burst_time;

            std::cout << "输入第" << i + 1 << "个进程的名字: ";
            std::cin >> name;

            std::cout << "输入进程 " << name << " 的优先数: ";
            std::cin >> priority;

            std::cout << "输入进程 " << name << " 的运行时间: ";
            std::cin >> burst_time;

            processes.emplace_back(name, priority, burst_time);
        }
    };

    void processes_running(std::vector<Process>& processes) {
        //将进程按优先级排序

        std::sort(processes.begin(), processes.end(), [](const Process& a, const Process& b) {
            return a.priority > b.priority; // 根据优先级从大到小排序
            });

        std::cout << "初始就绪队列:" << std::endl;

        //范围-based for 循环
        for (const auto& p : processes) {
            std::cout << "进程名:" << p.name << " 优先数:" << p.priority << " 运行时间:" << p.burst_time << std::endl;
        }
        //开始运行进程
        while (!processes.empty()) {
            // 选择优先级最高的进程
            Process* running_process = &processes[0];

            std::cout << "选中进程:" << running_process->name << std::endl;

            running_process->priority -= 1;
            running_process->burst_time -= 1;

            std::cout << "被选中后进程变化: 优先数:" << running_process->priority << " 运行时间:" << running_process->burst_time << std::endl;

            if (running_process->burst_time == 0) {
                std::cout << "进程 " << running_process->name << " 运行结束" << std::endl;
                processes.erase(processes.begin());
            }
            else {
                std::sort(processes.begin(), processes.end(), [](const Process& a, const Process& b) {
                    return a.priority > b.priority; // 每次运行后重新排序,以确保优先级高的进程会被选上
                    });
            }
        }

        std::cout << "所有进程执行完毕" << std::endl;

    };

};
(1).建立进程
void processes_set(std::vector<Process>& processes) {
        for (int i = 0; i < 5; ++i) {
            std::string name;
            int priority, burst_time;

            std::cout << "输入第" << i + 1 << "个进程的名字: ";
            std::cin >> name;

            std::cout << "输入进程 " << name << " 的优先数: ";
            std::cin >> priority;

            std::cout << "输入进程 " << name << " 的运行时间: ";
            std::cin >> burst_time;

            processes.emplace_back(name, priority, burst_time);
        }
    };

创建一个建立进程函数processes_set:
使用for循环,在for循环中建立变量后,提醒用户输入对应变量的值,最后使用.emplace_back方法,将生成的进程插入到std::vector< Process>容器的末尾

(2.)进程运行
void processes_running(std::vector<Process>& processes) {
        //将进程按优先级排序

        std::sort(processes.begin(), processes.end(), [](const Process& a, const Process& b) {
            return a.priority > b.priority; // 根据优先级从大到小排序
            });

        std::cout << "初始就绪队列:" << std::endl;

        //范围-based for 循环
        for (const auto& p : processes) {
            std::cout << "进程名:" << p.name << " 优先数:" << p.priority << " 运行时间:" << p.burst_time << std::endl;
        }
        //开始运行进程
        //当processes容器非空是执行while循环
        while (!processes.empty()) {
            // 选择优先级最高的进程
            Process* running_process = &processes[0];

            std::cout << "选中进程:" << running_process->name << std::endl;

            running_process->priority -= 1;
            running_process->burst_time -= 1;

            std::cout << "被选中后进程变化: 优先数:" << running_process->priority << " 运行时间:" << running_process->burst_time << std::endl;

            if (running_process->burst_time == 0) {
                std::cout << "进程 " << running_process->name << " 运行结束" << std::endl;
                processes.erase(processes.begin());
            }
            else {
                std::sort(processes.begin(), processes.end(), [](const Process& a, const Process& b) {
                    return a.priority > b.priority; // 每次运行后重新排序,以确保优先级高的进程会被选上
                    });
            }
        }

        std::cout << "所有进程执行完毕" << std::endl;

    };

创建一个进程运行函数processes_running:

首先,使用 std::sort 算法对容器 processes 中的 Process 对象进行了从大到小的优先级(priority )排序。
sort在此处使用的讲解

然后,使用一个范围-based for 循环将排序后的内容循环遍历出来
范围-based for 循环在此处使用的讲解

最后,使用一个while循环实现处理机调度

4.main函数的实现

int main() {
    Mu mu;
    std::vector<Process> processes;

    mu.processes_set(processes);
    mu.processes_running(processes);

    return 0;
}

5.完整代码

#include <iostream>
#include <vector>
#include <algorithm>

struct Process {
    std::string name;
    int priority;
    int burst_time;

    Process(std::string n, int p, int b) : name(n), priority(p), burst_time(b) {}
};

class Mu{

public:

    void processes_set(std::vector<Process>& processes) {
        for (int i = 0; i < 5; ++i) {
            std::string name;
            int priority, burst_time;

            std::cout << "输入第" << i + 1 << "个进程的名字: ";
            std::cin >> name;

            std::cout << "输入进程 " << name << " 的优先数: ";
            std::cin >> priority;

            std::cout << "输入进程 " << name << " 的运行时间: ";
            std::cin >> burst_time;

            processes.emplace_back(name, priority, burst_time);
        }
    };

    void processes_running(std::vector<Process>& processes) {
        //将进程按优先级排序

        std::sort(processes.begin(), processes.end(), [](const Process& a, const Process& b) {
            return a.priority > b.priority; // 根据优先级从大到小排序
            });

        std::cout << "初始就绪队列:" << std::endl;

        //范围-based for 循环
        for (const auto& p : processes) {
            std::cout << "进程名:" << p.name << " 优先数:" << p.priority << " 运行时间:" << p.burst_time << std::endl;
        }
        //开始运行进程
        while (!processes.empty()) {
            // 选择优先级最高的进程
            Process* running_process = &processes[0];

            std::cout << "选中进程:" << running_process->name << std::endl;

            running_process->priority -= 1;
            running_process->burst_time -= 1;

            std::cout << "被选中后进程变化: 优先数:" << running_process->priority << " 运行时间:" << running_process->burst_time << std::endl;

            if (running_process->burst_time == 0) {
                std::cout << "进程 " << running_process->name << " 运行结束" << std::endl;
                processes.erase(processes.begin());
            }
            else {
                std::sort(processes.begin(), processes.end(), [](const Process& a, const Process& b) {
                    return a.priority > b.priority; // 每次运行后重新排序,以确保优先级高的进程会被选上
                    });
            }
        }

        std::cout << "所有进程执行完毕" << std::endl;

    };

};
int main() {
    Mu mu;
    std::vector<Process> processes;

    mu.processes_set(processes);
    mu.processes_running(processes);

    return 0;
}

6.运行结果

在这里插入图片描述
在这里插入图片描述

  • 29
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在OS实验中选择一个调度算法实现处理机调度是很重要的。调度算法是操作系统中的一种重要机制,用于决定哪个进程应该在处理机上执行,以及执行的顺序。 在选择调度算法时,我们可以考虑最短作业优先算法(SJF)。 最短作业优先算法是一种非抢占式调度算法,该算法将处理机分配给已经准备好的具有最短执行时间的进程。该算法能够最大限度地降低平均等待时间,从而提高系统的吞吐量。 下面是一个简单的实现最短作业优先算法的调度代码: 1. 定义进程结构体,包括进程ID,到达时间和执行时间。 2. 定义一个进程队列,用于保存所有的进程。 3. 从输入中读取进程的数量,并将所有进程添加到进程队列中。 4. 对进程队列按照到达时间进行排序。 5. 定义一个时间片变量,并初始化为0,表示当前处理机的时间。 6. 遍历进程队列,根据进程的到达时间和执行时间计算出平均等待时间。 7. 打印每个进程的等待时间和周转时间。 8. 计算平均等待时间,并输出结果。 通过上述的实现,我们可以使用最短作业优先算法来调度处理机执行进程。该算法能够提高系统的效率和性能,减少进程的等待时间,提高系统的响应速度。 当然,除了最短作业优先算法,还有其他的调度算法可以实现进程的调度,如先来先服务算法、高优先级优先算法、时间片轮转算法等。在选择调度算法时,需要根据系统的需求和特点来进行评估和选择。 ### 回答2: 在OS实验中,我们可以选择使用最简单的调度算法——先来先服务(FCFS)算法实现处理机调度。 先来先服务算法是一种非抢占式调度算法,按照作业到达的顺序分配处理机进行执行。具体实现过程如下: 1. 首先,我们需要定义一个作业队列,用来存储到达的作业以及它们的执行顺序。作业队列可以采用数组或链表等数据结构实现。 2. 当一个作业到达时,将其加入到作业队列的末尾。 3. 当处理机空闲时,从作业队列的头部取出一个作业,分配给处理机执行。 4. 处理机执行该作业直到完成。 5. 当一个作业完成后,从作业队列中移除该作业。 6. 重复步骤3~5,直到作业队列为空。 先来先服务算法的优点是实现简单,公平性较好,适用于长作业的情景。但是它存在一个明显的短板——平均等待时间很长。因为无论作业的执行时间长短,都会按照作业的到达顺序进行执行,导致后续的短作业可能需要等待较长时间才能执行。 总结来说,选择先来先服务算法实现处理机调度,可以通过简单的实现过程来理解调度算法的基本原理。但是在实际应用中,我们需要考虑更为复杂的调度算法,以提高系统的性能和响应速度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值