【进程调度】基于优先级的轮转调度C++实现算法

一、简介

1.1 背景

在计算机科学领域,进程调度是操作系统中一个关键的组成部分,它负责协调系统中各个进程的执行顺序,以最大程度地提高系统资源利用率。在这篇博客中,将深入探讨基于优先级的轮转调度算法,该算法结合了进程的优先级时间片轮转的思想,以实现高效的任务执行。
在这里插入图片描述

1.2 目的

本文的主要目的是解释和分析一个使用C++编写的简单进程调度程序。将详细介绍程序的结构和实现细节,同时提供示例以帮助读者理解基于优先级的轮转调度算法的工作原理。

1.3 代码概览

程序需要使用一个结构体 content 来表示进程,包括进程名、优先级、到达时间、需要时间、已用时间和进程状态等信息。主要功能包括增加进程、打印结果以及实现基于优先级的轮转调度。以下是进程调度程序的框架:
程序框架 { m a i n 主函数:用于循环菜单操作 m a r k 主菜单:提示用户包括输入时间片、打印结果等 p r t 函数:进程调度算法以及输出进程调度的结果 a d d 函数:增加进程信息 c o n t e n t 结构体:进程名、优先级、到达时间、需要时间、已用时间和进程状态等信息 程序框架\begin{cases} main主函数:用于循环菜单操作\\mark主菜单:提示用户包括输入时间片、打印结果等\\prt函数:进程调度算法以及输出进程调度的结果\\add函数:增加进程信息\\content结构体:进程名、优先级、到达时间、需要时间、已用时间和进程状态等信息 \end{cases} 程序框架 main主函数:用于循环菜单操作mark主菜单:提示用户包括输入时间片、打印结果等prt函数:进程调度算法以及输出进程调度的结果add函数:增加进程信息content结构体:进程名、优先级、到达时间、需要时间、已用时间和进程状态等信息

二、进程调度算法概述

2.1 优先级调度算法

优先级调度算法是一种常见的进程调度策略,它根据进程的优先级来确定执行顺序。在我们的程序中,每个进程都被赋予一个优先级 (f),并根据该优先级进行排序。较高优先级的进程将在较低优先级的进程之前执行。
在这里插入图片描述

2.2 轮转调度算法

轮转调度算法引入了时间片的概念,即每个进程被分配的执行时间。在我们的实现中,用户可以输入时间片的大小,这将影响每个进程的运行时间。当一个进程用完它的时间片后,调度程序将切换到下一个就绪队列中的进程,以此类推。
在这里插入图片描述

三、代码详解

3.1 结构体定义

在程序中,使用一个名为 content 的结构体来表示每个进程的信息。这个结构体包含进程名 (name)、优先级 (f)、到达时间 (arrtime)、所需时间 (needtime)、已用时间 (gettime) 以及进程状态 (process)。

struct content
{
    string name;     // 进程名
    int f;           // 优先级
    int arrtime;     // 到达时间
    int needtime;    // 所需时间
    int gettime;     // 已用时间
    string process;  // 进程状态
};

这个结构体的定义来组织和存储每个进程的相关信息。

3.2 主菜单函数 (mark)

主菜单函数 mark 用于引导用户进行操作选择。用户可以选择增加进程、打印进程状态,或结束任务。该函数返回用户的选择。

int mark()
{
    int pd;
    cout << "增加进程并调度进程,请按1\n打印进程,请按2\n任务结束,请按0" << endl;
    cin >> pd;
    if (pd < 0 || pd > 2)
    {
        return mark();
    }
    return pd;
}

3.3 增加进程函数 (add)

增加进程函数 add 用于向进程数组中添加新的进程。用户需要输入进程的名称、优先级以及所需时间。这个函数返回一个标志,指示是否继续增加进程。

int add(struct content a[], int i)
{
    char pd;
    cout << "请输入进程名:";
    cin >> a[i].name;
    cout << "请输入进程的优先级:";
    cin >> a[i].f;
    cout << "请输入进程需要的时间:";
    cin >> a[i].needtime;
    a[i].arrtime = i;        // 设置到达时间
    a[i].gettime = 0;        // 初始化已用时间
    a[i].process = 'W';      // 初始化进程状态(等)
    cout << "还要继续增加进程吗,是(Y)否(N)";
    cin >> pd;
    if (pd == 'N')
        return 0;
    return 1;
}

函数允许用户连续添加多个进程,直到用户选择停止。

3.4 打印结果函数 (prt)

打印结果函数 prt 负责对进程进行排序,并根据优先级和到达时间打印进程状态。该函数还包括递归调用以模拟进程的运行。

void prt(struct content a[], int n, int time)
{
    // (排序和打印结果的实现)
    	int i,j,pd=0;
	//排序
	for(i=0;i<=n-1;i++)
	{
		for(j=0;j<=n-i-1;j++)
		{
			if(a[j].f<a[j+1].f||(a[j].f==a[j+1].f&&a[j].arrtime>a[j+1].arrtime))//先根据优先级,后根据到达时间判断
			{
				struct content temp;
				temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}
		}
	}
	a[0].process='R';//改变第一个进程的状态(运行)
	for(i=0;i<=n;i++)
	{
		if(a[i].gettime<a[i].needtime)
		{
			pd=1;
			break;
		}
	}
	if(pd==0)
	{
		a[0].process='F';//修改最后进程完成状态
	}	
	cout<<"进程名  优先级  到达时间  需要时间  已用时间  进程状态"<<endl;
	for(i=0;i<=n;i++)
	{
		cout<<a[i].name<<"\t"<<a[i].f<<"\t"<<a[i].arrtime<<"\t  "<<a[i].needtime<<"\t    "<<a[i].gettime<<"\t      "<<a[i].process<<endl;
	}
    if (pd == 0)
    {
        return; // 退出递归
    }

    // 修改数据
    a[0].f -= 1;
    a[0].gettime += time;
    a[0].process = 'W';

    if (a[0].gettime >= a[0].needtime)
    {
        a[0].f = -1000;
        a[0].gettime = a[0].needtime;
        a[0].process = 'F';
    }

    prt(a, n, time); // 递归打印
}

这个函数通过递归调用自身,模拟了进程的调度和执行过程。在打印结果时,它显示了每个进程的详细信息,包括进程名、优先级、到达时间、需要时间、已用时间和进程状态。

3.5 主函数(main)

int main()
{
    int time;     // 时间片大小
    int i = -1;    // 记录进程个数和到达时间
    struct content a[10];

    cout << "请输入时间片大小:";
    cin >> time;

    while (1)
    {
        int pd = mark();  // 主菜单判断
        if (pd == 0)
            break;  // 退出
        if (pd == 1)
        {
            while (1)
            {
                i++;
                int pd = add(a, i);
                if (pd == 0)
                    break;  // 增加进程完毕,退出
            }
        }
        if (pd == 2)
        {
            prt(a, i, time);
            continue;
        }
        prt(a, i, time);
    }
}

3.6 运行示例

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/319384.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构第十四弹---链式二叉树基本操作(下)

链式二叉树 1、翻转二叉树2、判断两棵树是否相同3、判断二叉树是否是单值二叉树4、对称二叉树5、判断二叉树是否是平衡二叉树6、判断二叉树是否是另一棵二叉树的子树7、二叉树的销毁8、二叉树的深度遍历8.1、前序遍历8.2、中序遍历8.3、后序遍历 9、二叉树的构造和遍历总结 1、…

Mysql数据库高版本向低版本迁移方法

操作步骤 1、首先低版本Mysql创建数据库 2、使用navicat工具&#xff0c;复制高版本数据库的表 3、在低版本数据库中粘贴&#xff0c;弹出数据传输界面&#xff0c;选项去掉包含字符集、包含引擎及表类型 使用该版本实现了Mysql8.0向Mysql5.5的迁移&#xff0c;如果在Mysql8.0生…

海外融合CDN之火伞云

在当今互联网全球化的时代&#xff0c;出海业务已经成为许多企业的必然选择。在海外市场上&#xff0c;快速、稳定的内容传输对于企业的成功至关重要。然而&#xff0c;如何合理的运用多家CDN供应商的资源实现智能化的调度&#xff0c;以及如何与业务更紧密地结合起来&#xff…

华为手机备份全过程(保姆级问题解决方案)

手机备份 前言主体信息备份一、关闭windows安全中心的内存完整性二、开启 USB 调试&#xff0c;尝试使用 ADB 连接三、开始备份 微信备份QQ备份写在最后 前言 我的手机是荣耀 20&#xff0c;虽然不是华为&#xff0c;但系统还是鸿蒙的系统&#xff08;毕竟那阵荣耀还是华为的子…

P4学习(一) 环境搭建

系列文章目录 第一章 P4学习入门之虚拟机环境搭建 文章目录 系列文章目录前言一、P4是什么&#xff1f;二、搭建步骤1.下载虚拟机镜像2.虚拟机管理软件载入镜像2.1 找到你镜像的所在位置2.2 打开VMware Workstation2.3 载入镜像 3.检验环境是否配置成功 P4 的真机环境搭建 前言…

transfomer中Multi-Head Attention的源码实现

简介 Multi-Head Attention是一种注意力机制,是transfomer的核心机制. Multi-Head Attention的原理是通过将模型分为多个头&#xff0c;形成多个子空间&#xff0c;让模型关注不同方面的信息。每个头独立进行注意力运算&#xff0c;得到一个注意力权重矩阵。输出的结果再通过…

大模型背景下计算机视觉年终思考小结(一)

1. 引言 在过去的十年里&#xff0c;出现了许多涉及计算机视觉的项目&#xff0c;举例如下&#xff1a; 使用射线图像和其他医学图像领域的医学诊断应用使用卫星图像分析建筑物和土地利用率相关应用各种环境下的目标检测和跟踪&#xff0c;如交通流统计、自然环境垃圾检测估计…

国内首款支持苹果Find My芯片-伦茨科技ST17H6x

深圳市伦茨科技有限公司&#xff08;以下简称“伦茨科技”&#xff09;发布ST17H6x Soc平台。成为继Nordic之后全球第二家取得Apple Find My「查找」认证的芯片厂家&#xff0c;该平台提供可通过Apple Find My认证的Apple查找&#xff08;Find My&#xff09;功能集成解决方案。…

PYTHON通过跳板机巡检CENTOS的简单实现

实现的细节和引用的文件和以前博客记录的基本一致 https://shaka.blog.csdn.net/article/details/106927633 差别在于,这次是通过跳板机登陆获取的主机信息,只记录差异的部份 1.需要在跳板机相应的路径放置PYTHON的脚本resc.py resc.py这个脚本中有引用的文件(pm.sh,diskpn…

代码随想录 Leetcode242. 有效的字母异位词

题目&#xff1a; 代码&#xff08;首刷看解析 2024年1月14日&#xff09;&#xff1a; class Solution { public:bool isAnagram(string s, string t) {int hash[26] {0};for(int i 0; i < s.size(); i) {hash[s[i] - a];}for(int i 0; i < t.size(); i) {hash[t[i]…

java编程解小学生一年级竞赛题

抖音教学视频 目录 1、题目三角形加起来为10 大纲 1、题目三角形加起来为10 连接&#xff1a;小学一年级数学竞赛练习题3套&#xff0c;有点难度&#xff01; 第16题 此方法不是最优解&#xff0c;穷举法&#xff0c;比较暴力解决 主要给大家演示如何用编程去解决我们的实…

智能寻迹避障清障机器人设计(电路图附件+代码)

附 录 智能小车原理图 智能小车拓展板原理图 智能小车拓展板PCB 智能小车底板PCB Arduino UNO原理图 Arduino UNO PCB 程序部分 void Robot_Traction() //机器人循迹子程序{//有信号为LOW 没有信号为HIGHSR digitalRead(SensorRight);//有信号表明在白…

vue3 - 自定义弹框组件

写了一个弹框组件 <template><transition name"modal-fade"><div v-if"showFlag" class"myModal"><div class"content"><div class"topBox"><div class"leftTitle"><spa…

Chapter 8 怎样使用类和对象(下篇)

⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️ 8.2 对象数组 1.对象数组的每一个元素都是同类的对象 2.在建立数组时&#xff0c;同样…

day18【LeetCode力扣】19.删除链表的倒数第N个结点

day18【LeetCode力扣】19.删除链表的倒数第N个结点 1.题目描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&a…

SpringBoot+SSM项目实战 苍穹外卖(10) Spring Task WebSocket

继续上一节的内容&#xff0c;本节学习Spring Task和WebSocket&#xff0c;并完成订单状态定时处理、来单提醒和客户催单功能。 目录 Spring Task&#xff08;cron表达式&#xff09;入门案例 订单状态定时处理WebSocket入门案例 来单提醒客户催单 Spring Task&#xff08;cron…

pyqt调用UI和开启子进程

UI制作 qrc 注意调用UI前把样式表里绑定的资源(qrc)转换成py导入进去 xxx.qrc转xxx.py 两种方法 1命令 pyrcc5 -o icons_rc.py icons.qrc 2外部工具pyrcc 实参 -o $FileNameWithoutExtension$.py $FileNameWithoutExtension$.qrcsdz.qrc→→sdaz.py 在代码里写 import…

Springboot3新特性:开发第一个 GraalVM 本机应用程序(完整教程)

在讲述之前&#xff0c;各位先自行在网上下载并安装Visual Studio 2022&#xff0c;安装的时候别忘了勾选msvc 概述&#xff1a;GraalVM 本机应用程序&#xff08;Native Image&#xff09;是使用 GraalVM 的一个特性&#xff0c;允许将 Java 应用程序编译成本机二进制文件&am…

视频剪辑软件Camtasia2024最新版本快捷键大全

Camtasia Studio是一款专门录制屏幕动作的工具&#xff0c;它能在任何颜色模式下轻松地记录 屏幕动作&#xff0c;包括影像、音效、鼠标移动轨迹、解说声音等等。 今天来给大家介绍一下Camtasia快捷键的相关内容&#xff0c;Camtasia也是一个十分好用的电脑屏幕录制与视频剪辑…

GRE隧道(初级VPN)配置步骤

一、拓朴图&#xff1a; 二、配置步骤&#xff1a; 1、配置IP 2、R1、R2 配置nat&#xff0c;代理内网地址通过G0/0/0口上外网 acl 2000rule permit source anyquit # int G0/0/0ip addr 100.1.1.1 24nat outbound 2000 # 3、R1、R2 配置默认出口路由G0/0/0&#xff0c;这一…