操作系统中的进程调度与优先级算法:理论与实践探索

news2024/11/25 8:23:52

前言

在计算机科学领域中,进程调度是操作系统中一个重要的组成部分,它负责决定哪个进程能够获得 CPU 的执行权,以及如何合理地分配 CPU 时间。通过合理的进程调度算法,可以提高系统的性能和响应能力。在本篇博客中,我们将深入理解进程调度和优先级算法,并通过一个实验来实现一个简单的进程调度程序。

进程调度中的优先级算法与PCB管理

进程调度的目标是在有限的资源下,通过合理的算法来选择合适的进程进行执行。在实验中,我们采用了优先级调度算法,即根据进程的优先级将其插入到就绪队列中的合适位置。优先级越高的进程,越有可能获得 CPU 的执行权。我们通过排序函数将新创建的进程按照优先级插入到就绪队列中,并每次选择优先级最高的进程进行执行。

在实验过程中,我们还使用了进程控制块(PCB)来管理进程的相关信息。PCB 是一个数据结构,用于存储和管理进程的各种属性,如进程名、状态、优先级等。通过合理地使用 PCB,我们可以方便地管理进程的创建、调度和执行过程。在代码中,我们定义了 PCB 的结构体,并使用动态内存分配来创建和释放 PCB。

另一个重要的概念是时间片,它表示进程在 CPU 中执行的时间段。在每个时间片中,我们选择一个进程进行执行,并进行相应的检查和更新操作。通过不断循环执行,多个进程可以交替执行,提高了系统的并发性和效率。

代码实现:

完整代码:

#include<stdio.h>
#include<stdlib.h>
struct PCB{
	char name[10];
	char state;
	int super;
	int ntime;
	int rtime;
	struct PCB*next;	
}*Ready=NULL,*p;

void Sort(){
	PCB*first,*second;
	int insert=0;
	if((Ready==NULL)||((p->super)>(Ready->super)))
	{
		p->next=Ready;
		Ready=p;
		
	}
	else
	{
		first=Ready;
		second=first->next;
		while(second!=NULL)
		{
			if((p->super)>(second->super))
			{
				p->next=second;
				first->next=p;
				second=NULL;
				insert=1;
			}
			else
			{
				first=first->next;
				second=second->next;
				
			}
		}
		if(insert==0) first->next=p;
		
	}
}
void Input(){
	int i,num;
	printf("请输入进程总数:");
	scanf("%d",&num);
	printf("\n");
	for(i=1;i<=num;i++)
	{
		printf("进程号No.%d: \n",i);
		p=(PCB*)malloc (sizeof(PCB));
		printf("输入进程名、优先数、需要运行时间:"); 
		scanf("%s%d%d",p->name,&p->super,&p->ntime);
		printf("\n");
		p->rtime=0;
		p->state='w';
		p->next=NULL;
		Sort();
		 
	}
}
void Disp(PCB*pr)
{
	printf("进程名: 状态: 优先级: 请求服务时间:已运行时间:\n");
	printf(" %s       %c     %d       %d            %d\n",pr->name,pr->state,pr->super,pr->ntime,pr->rtime);
	
}
void Check()
{
	PCB *pr;
	printf("****当前正在运行的进程是:%s\n",p->name);
	(p->rtime)++;
	Disp(p);
	pr=Ready;
	if(pr!=NULL)
	{
		printf("****当前就绪队列中的进程为:\n");
		while(pr!=NULL)
		{
			Disp(pr);
			pr=pr->next;
			
		}
	}
}
void Running()
{
	if(p->rtime==p->ntime)//运行完后回收PCB
	{
		printf("\n");
		printf("进程%s已完成!\n",p->name);
		free(p);	 
	 }
	 else
	 {
	 	(p->super)--;
	 	p->state='w';
	 	Sort(); //重新排序 
	 }
}
int main()
{
	int h=0;
	Input();
	while(Ready!=NULL)
	{
		getchar();
		h++;
		printf("正在执行的时间片为: %d\n",h);
		p=Ready;
		Ready=p->next;
		p->next=NULL;
		p->state='R';
		Check();
		Running();
		printf("按回车键继续......\n");
		
	}
	printf("进程已全部执行完毕!\n");
	return 0;
}

思路及流程图:

段代码实现了一个使用优先级调度算法进行进程调度的程序。以下是该段代码的功能和执行流程的简要说明:

  1. 定义了一个结构体 PCB,用于表示进程的属性,包括进程名、状态、优先级、需要运行时间和已运行时间等信息。
  2. 实现了一个排序函数 Sort(),用于将新创建的进程按照优先级插入到就绪队列中的合适位置。
  3. 实现了一个输入函数 Input(),用于输入进程的数量和相关属性,创建进程并插入到就绪队列中。
  4. 实现了一个显示函数 Disp(),用于显示进程的信息。
  5. 实现了一个检查函数 Check(),用于检查当前正在运行的进程和就绪队列中的进程,并显示其信息。
  6. 实现了一个运行函数 Running(),用于模拟进程的执行过程,包括更新已运行时间和调整进程的优先级。
  7. 在主函数中,首先调用输入函数 Input(),创建并初始化就绪队列。然后通过循环进行时间片的执行,每次选择优先级最高的进程进行执行,直到就绪队列为空。
  8. 每次执行一个时间片后,调用检查函数 Check()显示当前进程和就绪队列的状态,并调用运行函数 Running()模拟进程的执行过程。
  9. 最后输出所有进程已全部执行完毕的提示。

需要注意的是,这段代码只是一个简单的模拟程序,并没有涉及真正的进程调度和并发控制机制。它仅仅通过优先级调度算法和就绪队列来模拟进程的执行顺序。如果需要实现真正的进程调度算法和并发控制,还需要考虑诸如时间片轮转、进程状态切换、互斥访问等更复杂的机制。

image.png

运行截图

image.png

image.png

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

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

相关文章

ubuntu开发环境

boost介绍 Boost是一个广受欢迎的、开源的C程序库集合&#xff0c;提供了许多高质量和可重用的组件&#xff0c;涵盖了广泛的领域&#xff0c;如容器、算法、函数对象、日期与时间、正则表达式、文件系统、线程等。Boost旨在通过提供开发人员友好的C工具和组件来增强C的功能。…

阿里云主机详解:ECS/轻量/虚拟主机/GPU/裸金属/云电脑详解

阿里云云主机分为云虚拟主机、云服务器ECS、轻量应用服务器、GPU云服务器、弹性裸金属服务器、专有宿主机、FPGA云服务器、高性能计算E-HPC、无影云电脑等&#xff0c;阿里云百科来详细说下阿里云云主机详解&#xff1a; 目录 阿里云云主机 云服务器ECS 轻量应用服务器 云…

博泰应宜伦:把Vision Pro放大二十倍,就是未来汽车的终极形态

作者 | Amy 编辑 | 德新 新能源是上半场&#xff0c;智能化是下半场。 而随着智能汽车发展&#xff0c;智能座舱也不断革新&#xff0c;过去智能座舱的各项功能全面开花&#xff0c;竞争愈演愈烈&#xff0c;未来的座舱将如何被定义&#xff1f; 6月15日&#xff0c;博泰车联…

微信小程序手机号授权登录

文章目录 小程序端服务端注意事项 微信小程序&#xff0c;手机号授权登录需求。 大体流程是这样的&#xff1a; 小程序端使用 getPhoneNumber 向微信平台获取授权通过微信授权后&#xff0c;小程序端接收微信授权后的回调小程序携带微信的回调请求自己的服务端服务端请求微信获…

QML 模型和视图

模型/视图架构简介 使用 QML 时&#xff0c;有些情况下需要使用模型视图结构显示一些列表等控件&#xff0c;比较好的方式是用 Python 接管数据模型部分&#xff0c;方便处理数据&#xff1b;QML 和 JavaScript 负责前端部分&#xff0c;实现前端和后端的分离。 MVD 简介 Mo…

C# 特性(一)——什么是特性

目录 什么是特性 Serializable DllImport Obsolete Conditional Attribute类 自定义特性 AttributeUsage的使用例子 特性非常常见&#xff0c;官方解释为&#xff1a; 特性&#xff08;Attribute&#xff09;是用于在运行时传递程序中各种元素&#xff08;比如类、方法…

【批处理DOS-CMD命令-汇总和小结】上网和通信相关命令-查看路由表,查看网卡GUID UUID(route、getmac)

一、查看、编辑路由表&#xff08;route&#xff09; 首先我们看看route命令的帮助信息&#xff0c;可以发现这个命令其实就是用来查看路由表、以及添加&#xff08;或编辑、删除&#xff09;路由项目的。 路由项目是指操作系统对数据包的导向规则&#xff0c;往往包括目标IP…

《统计学习方法》——条件随机场#习题解答#

引言 这是统计学习方法第十一章条件随机场的阅读笔记&#xff0c;包含所有公式的详细推导。 条件随机场(conditional random field,CRF)是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型&#xff0c;其特点是假设输出随机变量构成马尔可夫随机场。 建议先阅…

【计算机网络】为什么是TCP四次挥手,可以变成三次吗?

【计算机网络】为什么是TCP四次挥手&#xff0c;可以变成三次吗&#xff1f; 文章目录 【计算机网络】为什么是TCP四次挥手&#xff0c;可以变成三次吗&#xff1f;引言TCP 四次挥手为什么 TCP 挥手需要四次呢&#xff1f;粗暴关闭 vs 优雅关闭 什么情况会出现三次挥手&#xf…

MySQL—SQL优化详解(下)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

FFmpeg 内存模型分析

标题 1. 内存模型图2. 分析流程3.追溯本源————源码分析3.1 AVPacket队列 什么时候生成的&#xff1f; 4 .AVPacket和AVFrame相关操作API5. av_read_frame源码分析 1. 内存模型图 2. 分析流程 我们解复用后,媒体流数据就会被分离开来,分别生成对应AVPacketList,然后通过av_…

BART论文解读

1 概述 全称&#xff1a;Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension。BART来源于Bidirectional and Auto-Regressive Transformers发表时间: 2019.10.29团队&#xff1a;Facebook AI Paper地址​arxiv.o…

chatgpt赋能python:Python怎么求解方程

Python怎么求解方程 在数学中&#xff0c;求解方程是一种基本的技能。Python作为一种广泛应用于科学计算和数据分析领域的编程语言&#xff0c;可以帮助我们求解各种类型的方程。Python提供了多个库和函数&#xff0c;使得求解方程在Python中变得非常轻松。 一元方程求解 一…

Android Framework分析SystemServer进程

SystemServer进程是Android系统的核心进程&#xff0c;运行在Android系统启动后&#xff0c;负责管理和加载系统服务。本文将介绍SystemServer进程的详细结构和工作原理&#xff0c;并使用代码注释的方式阐述其关键部分代码。 结构&#xff1a; SystemServer进程的核心是Syste…

SSH基本概念,带你了解SSH

1、SSH基本概念 SSH&#xff08;Secure Shell&#xff09;是一种网络协议&#xff0c;用于在不安全的网络中安全地传输数据。它是一种加密协议&#xff0c;可以保护数据在传输过程中不被窃取、篡改或伪造。SSH协议最初是由芬兰的Tatu Ylonen开发的&#xff0c;现在已经成为了一…

Hadoop集群之模板虚拟机的安装

Hadoop集群之模板虚拟机的安装 文章目录 Hadoop集群之模板虚拟机的安装0. 写在前面1. CentOS的安装1.1 配置电脑1.1.1 进入VMware1.1.2 自定义新的虚拟机1.1.3 解决虚拟机的兼容性1.1.4 选择当前虚拟机的操作系统1.1.5 选择虚拟机将来需要安装的系统1.1.6 电脑的具体配置1.1.7 …

KUKA机器人通过示教器进行关机冷启动的具体方法演示

KUKA机器人通过示教器进行关机冷启动的具体方法演示 如下图所示,首先需要登录管理员权限,默认密码:KUKA,然后点击左上角的机器人图标进行菜单选项,找到并点击“关机”选项, 如下图所示,找到并点击“重新启动控制系统PC”, 如下图所示,此时系统提示:确实要重新启动…

chatgpt赋能python:Python生成序列的方法详解

Python生成序列的方法详解 在Python编程中&#xff0c;序列&#xff08;Sequence&#xff09;是常用的数据类型之一。序列是有序的&#xff0c;可以通过下标访问其中的元素。Python中有多种方法可以生成序列&#xff0c;下面将对常用的几种方法进行详细介绍。 利用range函数生…

2023-06-16 Android Studio 使用CMakeList编译JNI ,最简单的demo源码

一、代码结构图&#xff0c;代码路径https://download.csdn.net/download/qq_37858386/87913001 二、cmakedemo\app\build.gradle 加下面的代码 externalNativeBuild {cmake {cppFlags "-frtti -fexceptions"}}externalNativeBuild {cmake {path src/main/jni/CMakeL…

国内大模型研究

自从chatgpt发布以来&#xff0c;国内大模型发展非常迅速。我对这项目技术也保持了非常多的持续关注&#xff0c;我一直认识&#xff0c;chatGPT以及其他GPT会给社会带来更大的变革。经过专业训练的大模型可以替代部分客服&#xff0c;部分程序员&#xff0c;部分美工&#xff…