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

news2025/2/27 10:29:12

一、简介

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 运行示例

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小白浅学Vue3

目录 前端环境 依赖管理NPM安装配置 创建Vue项目 模板语法 文本插值{{ }} v-html 属性绑定 条件渲染 v-if 、v-else-if 、v-else v-show 列表渲染v-for 状态管理 事件 事件 事件传参 事件修饰符 数组变化监听 计算属性 Class绑定 Style绑定 侦听器 v-mod…

Fastadmin上传图片服务端压缩图片,实测13.45M压缩为29.91K

先前条件&#xff1a;第一步安装compose&#xff0c;已安装忽略。 先上截图看效果 一、在fastadmin的根目录里面输入命令安装think-image composer require topthink/think-image二、找到公共上传类&#xff0c;application/common/library/Upload.php&#xff0c;在最下面…

【数据结构与算法】之数组系列-20240113

这里写目录标题 一、66. 加一二、121. 买卖股票的最佳时机三、136. 只出现一次的数字四、268. 丢失的数字五、350. 两个数组的交集 II 一、66. 加一 简单 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&…

七:Day08_任务调度

第一章 定时任务概述 在项目中开发定时任务应该一种比较常见的需求&#xff0c;在 Java 中开发定时任务主要有三种解决方案&#xff1a;一是使用JDK 自带的 Timer&#xff0c;二是使用 Spring Task&#xff0c;三是使用第三方组件 Quartz。 建议&#xff1a; 单体项目架构使用…

Linux系统——远程访问及控制

目录 一、OpenSSH服务器 1.SSH&#xff08;Secure Shell&#xff09;协议 2.OpenSSH 2.SSH原理 2.1公钥传输原理 2.2加密原理 &#xff08;1&#xff09;对称加密 &#xff08;2&#xff09;非对称加密 2.3远程登录 2.3.1延伸 2.3.2登录用户 3.SSH格式及选项 3.1延…

K8s-Pod资源(一)Pod介绍、创建Pod、Pod简单资源配额

Pod概述 Kubernetes Pod | Kubernetes Pod是Kubernetes中的最小调度单元&#xff0c;k8s都是以pod的方式运行服务的 一个pod可以指定镜像&#xff0c;封装一个或多个容器 pod需要调度到工作节点运行&#xff0c;节点的选择由scheduler调度器实现 pod定义时&#xff0c;会…

【Python学习】Python学习17- File(文件) 方法

目录 [TOC](【Python学习】Python学习17- File(文件) 方法) 文章所属专区 Python学习 前言 本章节主要说明Python文件操作的具体说明 open()方法 Python open() 方法用于打开一个文件&#xff0c;并返回文件对象&#xff0c;在对文件进行处理过程都需要使用到这个函数&#…

C++ QtCreator启动执行报错的各类问题解决++持续更新!!

1.QTCreator启动报错"由于找不到 python310.dll" 在QtCreator加载自动缩进的LLVM插件后, 再次打开Qt时, 会报错找不到python310.dll 解决方法&#xff1a;下载python310.dll,随后复制到目录&#xff1a;C:\Program Files\LLVM\bin 即可解决该问题。下载路径附件如…

TensorRT(C++)基础代码解析

TensorRT(C)基础代码解析 文章目录 TensorRT(C)基础代码解析前言一、TensorRT工作流程二、C API2.1 构建阶段2.1.1 创建builder2.1.2 创建网络定义2.1.3 定义网络结构2.1.4 定义网络输入输出2.1.5 配置参数2.1.6 生成Engine2.1.7 保存为模型文件2.1.8 释放资源 2.2 运行期2.2.1…

C#--核心

CSharp核心知识点学习 学习内容有&#xff1a; 绪论&#xff1a;面向对象的概念 Lesson1&#xff1a;类和对象 练习&#xff1a; Lesson2&#xff1a;封装--成员变量和访问修饰符 练习: Lesson3:封装--成员方法 Lesson4&#xff1a;封装--构造函数和析构函数 知识点四 垃圾回收…

Web前端-移动web开发——flex布局

移动web开发——flex布局 1.0传统布局和flex布局对比 1.1传统布局 兼容性好布局繁琐局限性&#xff0c;不能再移动端很好的布局 1.2 flex布局 操作方便&#xff0c;布局极其简单&#xff0c;移动端使用比较广泛pc端浏览器支持情况比较差IE11或更低版本不支持flex或仅支持部…

SouthernBiotech抗荧光淬灭封片剂

荧光淬灭又称荧光熄灭或萃灭&#xff0c;是指导致特定物质的荧光强度和寿命减少的所有现象。引起荧光淬灭的物质称为荧光淬灭剂。SouthernBiotech专门开发的Fluoromount-G系列荧光封片剂是以甘油为基础&#xff0c;加入抗荧光淬灭剂&#xff0c;可明显降低荧光淬灭现象&#xf…

使用setdefault撰写文本索引脚本(出自Fluent Python案例)

背景介绍 由于我们主要介绍撰写脚本的方法&#xff0c;所以用一个简单的文本例子进行分析 a[(19,18),(20,53)] Although[(11,1),(16,1),(18,1)] ambiguity[(14,16)] 以上内容可以保存在一个txt文件中&#xff0c;任务是统计文件中每一个词&#xff08;包括字母&#xff0c;数…

AI编程可视化Java项目拆解第一弹,解析本地Java项目

之前分享过一篇使用 AI 可视化 Java 项目的文章&#xff0c;同步在 AI 破局星球、知乎、掘金等地方都分享了。 原文在这里AI 编程&#xff1a;可视化 Java 项目 有很多人感兴趣&#xff0c;我打算写一个系列文章拆解这个项目&#xff0c;大家多多点赞支持~ 今天分享的是第一…

C语言之从浅入深一步一步全方位理解指针【附笔试题】

文章目录 前言从浅入深理解指针《第一阶段》一、内存和地址1.1 内存1.2 究竟该如何理解编址 二、指针变量和地址2.1 取地址操作符&#xff08;&&#xff09; 三、指针变量和解引用操作符&#xff08;*&#xff09;3.1 指针变量3.2 如何拆解指针类型3.3 解引用操作符 四、指…

OpenCV-Python的版本介绍及区别

OpenCV-Python版本介绍 OpenCV-Python有多个版本&#xff0c;每个版本都有其特定的功能和改进。以下是一些常见OpenCV-Python版本及其介绍和区别&#xff1a; OpenCV-Python 2.x版本 这是OpenCV-Python的旧版本&#xff0c;支持Python 2.x。它包含了许多传统的计算机视觉功能&…

rpc的正确打开方式|读懂Go原生net/rpc包

前言 大家好&#xff0c;这里是白泽&#xff0c;之前最近在阅读字节跳动开源RPC框架Kitex的源码&#xff0c;分析了如何借助命令行&#xff0c;由一个IDL文件&#xff0c;生成client和server的脚手架代码&#xff0c;也分析了Kitex的日志组件klog。当然Kitex还有许多其他组件&…

sqlilabs第五十三五十四关

Less-51(GET - GET - Error based - ORDER BY CLAUSE-String- Stacked injection) 手工注入 单引号闭合&#xff0c;和上一关一样堆叠注入解决 自动注入 和上一关一样 Less-52(GET - challenge - Union- 10 queries allowed -Variation 1) 手工注入 这一关开始后面的可以看…

Linux 内核如何根据设备树文件来匹配内核

一. 简介 上一篇文章学习了 Linux内核如何确定是否支持此设备&#xff0c;如果支持&#xff0c;设备就会启动 Linux 内核。 文章地址如下&#xff1a; 设备树根节点下的compatile属性的作用-CSDN博客 本文继上面文章的学习。这里简单看一下&#xff0c; Linux 内核是如何根…

学习资料: uni-app HBuilderX

编译器&#xff1a;HBuilderX HBuilderX-高效极客技巧 uni-app介绍&#xff1a;uni-app官网 uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、Android、Web&#xff08;响应式&#xff09;、以及各种小程序&#…