首页 > 系统相关 >操作系统实验——进程管理的算法实现

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

时间:2023-11-02 23:23:11浏览次数:35  
标签:processes 操作系统 currentTime int runningProcess 算法 arrivalTime 进程

前言

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

实验目标

编写一个简单的进程调度器

实验内容

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

标签:processes,操作系统,currentTime,int,runningProcess,算法,arrivalTime,进程
From: https://www.cnblogs.com/aobaxu/p/17806647.html

相关文章

  • 自增主键与雪花算法的优缺点、设计更适合分库分表的UUID算法
    (目录)为什么不推荐使用自增主键递增主键的作用我们在数据库里保存的数据就跟excel表一样,一行行似的而在底层,这一行行数据,就是保存在一个个16k大小的页里。每次都去遍历所有的行性能会不好,于是为了加速搜索,我们可以根据主键id,从小到大排列这些行数据,将这些数据页用双向链表......
  • 关于“聚类算法”
        今天我在csdn上看到一篇文章关于聚类算法的文章。我了解到聚类算法是一类无监督学习的算法,用于将数据集中的对象按照相似性进行分组或聚集。聚类算法的目标是将相似的数据点归为一类,同时将不相似的数据点分开。        常见的聚类算法包括:1.K-means聚类算法。......
  • JUC并发编程学习笔记(一)认知进程和线程
    进程和线程进程一个程序,如QQ.exe,是程序的集合一个进程往往可以包含多个线程,至少包含一个java默认有两个线程,GC垃圾回收线程和Main线程线程:一个进程中的各个功能java无法真正的开启线程,因为java是运行在虚拟机上的,所以只能通过C++,通过native本地方法调用C++开启线程priva......
  • 软考--操作系统
    操作系统前趋图:顺序执行:顺序性、封闭性(执行时独享资源)、可再现性  前驱图:并发执行:失去程序封闭性、程序和机器的执行程序的活动不再一一对应、并发程序间的相互制约性考点比较简单进程状态   ......
  • AI智能分析网关高空抛物算法如何实时检测高楼外立面剥落?
    高楼外立面剥落是一种十分危险的行为,会造成严重的人身伤害和财产损失。TSINGSEE青犀智能分析网关利用高楼外立面剥落的信息,结合高空抛物算法来进行处理就可很好解决此问题。1.数据收集首先,需要收集关于高楼外立面剥落的数据。这可以通过安装EasyCVR智能监控平台来实现,可以感......
  • 文心一言 VS 讯飞星火 VS chatgpt (126)-- 算法导论11.1 1题
    一、用go语言,假设一动态集合S用一个长度为m的直接寻址表T来表示。请给出一个查找S中最大元素的过程。你所给的过程在最坏情况下的运行时间是多少?文心一言,代码正常运行:在这个问题中,我们需要实现一个查找动态集合S中最大元素的算法,该动态集合使用一个长度为m的直接寻址......
  • TSINGSEE智慧安防:AI人员入侵检测算法的工作原理及应用场景概述
    人员入侵检测算法基于视频分析技术,自动对视频画面进行分析识别,可以对危险区的人员闯入、靠近等行为进行实时进行检测并预警,无需人工干预,协助管理者对场所的安全问题进行监管,可以广泛运用在学校、园区、工地、车站、地铁、厂区等地方。旭帆科技AI智能分析网关是基于边缘计算技术......
  • 算法开端
    算法三大特性:有穷性确定性可行性评判标准:正确性可读性健壮性效率和存储量要求表示时间复杂度的价:\(O(1)\):常数时间价\(O(n)\):线性时间价\(O(log_n)\):对数时间价\(O(nlog_n)\):线性对数时间价\(O(n^k)\):\(k\)次方时间价\(O(1)<O(log_n)<O(n)<O(nlog_n)<O(n^k)\)......
  • 浅述青犀AI算法人体攀爬行为检测的应用场景及解决方案
    人体攀爬行为检测是指利用计算机视觉技术对人类攀爬物体的行为进行识别和分析。该技术主要依靠图像和视频数据进行分析,通过识别人类身体的各个部位,以及其在攀爬过程中的动作和姿态,实现对攀爬行为的检测和跟踪。该技术的场景应用比较广泛,今天我们来介绍一下TSINGSEE青犀AI边缘计算硬......
  • 终于有人把进程与线程讲清楚了
    前言很多人对进程、线程没有什么概念,面试的时候也说不出其中的核心内涵。所以,今天我打算花点篇幅把进程和线程讲清楚。01CPU与内存**CPU**大家都知道是计算机的中央运算单元,用来计算的。CPU从内存里面读取一条一条的代码指令,然后根据指令来执行运算(加,减,乘,除,复制数据等)。......