操作系统实验——进程管理的算法实现

这篇具有很好参考价值的文章主要介绍了操作系统实验——进程管理的算法实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

笔者在大学下属的事业单位上班,最近去帮着带下操作系统的实验课,这里随手水点参考代码,欢迎各位领导老师莅临指正

实验目标

编写一个简单的进程调度器文章来源地址https://www.toymoban.com/news/detail-740180.html

实验内容

  1. 进程控制块(PCB)的定义与管理
  2. 进程调度算法的实现
  3. 进程创建、销毁和切换
  4. 给定一批进程对比3-4种调度算法的时间(自选算法)

实验参考答案

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

// 进程控制块(PCB)
struct ProcessControlBlock
{
    // 进程ID
    int processID;
    // 到达时间
    int arrivalTime;
    // 执行时间
    int burstTime;
    // 等待时间
    int waitingTime;
    // 周转时间
    int turnaroundTime;
};

// 先来先服务 (FCFS) 调度算法
void FCFS(vector<ProcessControlBlock> &processes)
{
    int currentTime = 0;
    for (int i = 0; i < processes.size(); i++)
    {
        if (processes[i].arrivalTime > currentTime)
        {
            currentTime = processes[i].arrivalTime;
        }

        // 计算等待时间
        processes[i].waitingTime = currentTime - processes[i].arrivalTime;

        // 执行进程
        currentTime += processes[i].burstTime;

        // 计算周转时间
        processes[i].turnaroundTime = currentTime - processes[i].arrivalTime;
    }
}

// 最短作业优先 (SJF) 调度算法
void SJF(vector<ProcessControlBlock> &processes)
{
    int currentTime = 0;
    vector<ProcessControlBlock> remainingProcesses = processes;

    while (!remainingProcesses.empty())
    {
        int shortestJobIndex = -1;
        int shortestJobTime = INT_MAX;

        for (int i = 0; i < remainingProcesses.size(); i++)
        {
            if (remainingProcesses[i].arrivalTime <= currentTime && remainingProcesses[i].burstTime < shortestJobTime)
            {
                shortestJobIndex = i;
                shortestJobTime = remainingProcesses[i].burstTime;
            }
        }

        if (shortestJobIndex == -1)
        {
            currentTime++;
        }
        else
        {
            ProcessControlBlock &selectedProcess = remainingProcesses[shortestJobIndex];

            // 计算等待时间
            selectedProcess.waitingTime = currentTime - selectedProcess.arrivalTime;

            // 执行进程
            currentTime += selectedProcess.burstTime;

            // 计算周转时间
            selectedProcess.turnaroundTime = currentTime - selectedProcess.arrivalTime;
            for (auto& pcb : processes)
            {
                if (selectedProcess.processID == pcb.processID)
                {
                    pcb.waitingTime = selectedProcess.waitingTime;
                    pcb.turnaroundTime = selectedProcess.turnaroundTime;
                    break;
                }
            }
            remainingProcesses.erase(remainingProcesses.begin() + shortestJobIndex);
        }
    }
}
// 轮转时间片 (Round Robin) 调度算法
void RoundRobin(vector<ProcessControlBlock> &processes, int timeQuantum)
{
    int currentTime = 0;
    queue<ProcessControlBlock> readyQueue;
    int processIndex = 0;

    while (!readyQueue.empty() || processIndex < processes.size())
    {
        while (processIndex < processes.size() && processes[processIndex].arrivalTime <= currentTime)
        {
            readyQueue.push(processes[processIndex]);
            processIndex++;
        }

        if (readyQueue.empty())
        {
            currentTime++;
        }
        else
        {
            ProcessControlBlock &runningProcess = readyQueue.front();
            readyQueue.pop();

            // 执行进程
            int remainingTime = min(timeQuantum, runningProcess.burstTime);
            currentTime += remainingTime;
            runningProcess.burstTime -= remainingTime;

            if (runningProcess.burstTime > 0)
            {
                readyQueue.push(runningProcess);
            }
            else
            {
                // 计算等待时间
                runningProcess.waitingTime = currentTime - runningProcess.arrivalTime;

                // 计算周转时间
                runningProcess.turnaroundTime = currentTime - runningProcess.arrivalTime;
                for (auto &pcb: processes)
                {
                    if (runningProcess.processID == pcb.processID)
                    {
                        pcb.waitingTime = runningProcess.waitingTime;
                        pcb.turnaroundTime = runningProcess.turnaroundTime;
                        break;
                    }
                }
            }
        }
    }
}

int main()
{
    vector<ProcessControlBlock> processes = {
        {1, 0, 6, 0, 0},
        {2, 2, 3, 0, 0},
        {3, 4, 1, 0, 0},
        {4, 7, 5, 0, 0}};

    // 先来先服务 (FCFS) 调度算法
    FCFS(processes);
    cout << "FCFS Scheduling:\n";
    for (const auto &pcb : processes)
    {
        cout << "Process " << pcb.processID << " Turnaround Time: " << pcb.turnaroundTime << endl;
    }

    // 重置进程数据
    for (auto &pcb : processes)
    {
        pcb.waitingTime = 0;
        pcb.turnaroundTime = 0;
    }

    // 最短作业优先 (SJF) 调度算法
    SJF(processes);
    cout << "\nSJF Scheduling:\n";
    for (const auto &pcb : processes)
    {
        cout << "Process " << pcb.processID << " Turnaround Time: " << pcb.turnaroundTime << endl;
    }

    // 重置进程数据
    for (auto &pcb : processes)
    {
        pcb.waitingTime = 0;
        pcb.turnaroundTime = 0;
    }

    // 轮转时间片 (Round Robin) 调度算法
    int timeQuantum = 2;
    RoundRobin(processes, timeQuantum);
    cout << "\nRound Robin Scheduling:\n";
    for (const auto &pcb : processes)
    {
        cout << "Process " << pcb.processID << " Turnaround Time: " << pcb.turnaroundTime << endl;
    }

    return 0;
}

到了这里,关于操作系统实验——进程管理的算法实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 操作系统进程调度算法(c语言模拟实现)

            前言: 本文旨在分享如何使用c语言对操作系统中的部分进程调度算法进行模拟实现,以及算法描述的讲解, 完整代码放在文章末尾,欢迎大家自行拷贝调用 目录 常见的调度算法 数据结构 先来先服务调度算法 算法模拟思路: 算法模拟:  最短作业优先调度算法

    2024年02月06日
    浏览(41)
  • 二、操作系统进程管理(10)——用信号量机制实现进程互斥、同步、前驱关系

        (1)分析并发进程的关键活动,划定临界区。(如对临界区资源打印机的访问就应放在临界区)     (2)设置互斥信号量mutex,初值为1。     (3)在临界区之前执行P(mutex)。      //即使用资源前先申请(P操作)     (4)在临界区之后执行V(mutex)。     (5)对不

    2023年04月08日
    浏览(30)
  • 操作系统进程调度算法的模拟实现(c语言版本)

            前言: 本文旨在分享如何使用c语言对操作系统中的部分进程调度算法进行模拟实现,以及算法描述的讲解, 完整代码放在文章末尾,欢迎大家自行拷贝调用 目录 常见的调度算法 数据结构 先来先服务调度算法 算法模拟思路: 算法模拟:  最短作业优先调度算法

    2024年02月06日
    浏览(44)
  • 操作系统实验三虚拟存储器管理之模拟页面置换算法(FIFO&LRU)

    一、概述  (1)置换算法  (2)缺页率与命中率 二、先进先出置换算法(FIFO)    (1)定义    (2)示例  (3)Belady异常  三、最近最久未使用置换算法(LRU) (1)定义 (2)示例 四、FIFOLRU置换算法的模拟    (1)流程图  (2)完整代码  (3)实验结果         进程运行

    2024年02月04日
    浏览(29)
  • 【操作系统原理实验】银行家算法模拟实现

    选择一种高级语言如C/C++等,编写一个银行家算法的模拟实现程序。1) 设计相关数据结构;2) 实现系统资源状态查看、资源请求的输入等模块;3) 实现资源的预分配及确认或回滚程序;4) 实现系统状态安全检查程序;5) 组装各模块成一个完整的模拟系统。 (1)设计思想: 1、

    2024年02月01日
    浏览(33)
  • 操作系统实验(进程调度)

      1.1理解有关进程控制块、进程队列的概念。   1.2掌握进程优先权调度算法和时间片轮转调度算法的处理逻辑。   2.1设计进程控制块PCB的结构,分别适用于优先权调度算法和时间片轮转调度算法。   2.2建立进程就绪队列。   2.3编制两种进程调度算法:优先权调度

    2024年02月06日
    浏览(35)
  • 计算机操作系统实验:页面置换算法的实现

    本实验的目的是通过编程模拟不同的页面置换算法,比较它们的缺页率和命中率,加深对操作系统内存管理的理解。本实验采用C语言编写,实现了最佳置换算法(OPT)、先进先出置换算法(FIFO)和最近最久未使用算法(LRU)。实验中,页面号引用串从文本文件中读取,输出

    2024年02月02日
    浏览(28)
  • 操作系统实验:虚拟存储器 (C语言实现) 模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断。

    模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺 页中断。 模拟分页式存储管理中硬件的地址转换和产生缺页中断。 用先进先出(FIFO)页面调度算法处理缺页中断。 由于是模拟调度算法,所以,不实际启动输出一页和装入一页的程序,

    2024年02月04日
    浏览(49)
  • 计算机操作系统实验:进程调度实验

    前言 二、实验目的 三、实验要求 四、实验原理 五、实验过程 六、代码详解 总结 计算机操作系统是管理计算机硬件和软件资源的核心软件,它负责为用户提供一个友好、高效、安全的使用环境。进程调度是操作系统的一个重要功能,它决定了进程在处理器上的执行顺序和时

    2024年02月07日
    浏览(39)
  • 操作系统实验:进程同步控制

    前言 一、开发语言及实验平台或实验环境 二、实验目的 三、实验要求 四、实验原理 五、实验过程 六、代码详解 七、diy一下 总结 计算机操作系统是一门研究计算机系统的基本原理和设计方法的课程,它涉及到计算机系统的结构、功能、性能和管理等方面。操作系统实验是

    2024年02月05日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包