02_04实时调度类及SMP多核处理器的实时操作系统体系结构

news2024/11/17 7:49:56

上一篇文章说的是普通进程的调度但同时还有实时进程在linux上面进行运行
这边来看看实时进程在linux里面怎么调度 同时linux操作系统对实时任务的处理方式和设计思想

实时调度类

Linux进程分为两大类:实时进程和普通进程。
实时进程与普通进程根本不同之处,如果系统中有一个实时进程且可运行,那么调度器总是会选择它,除非另有一个优
先级更高的实时进程。
SCHED_ FIFO: 没有时间片,在被调度器选择之后,可以运行任意长的时间;
SCHED_ RR:有时间片,其值在进程运行时会减少。

实时调度中表达一个任务的结构体

实时调度的代码比较多用到的再继续从这个头文件分析结构体和作用

struct sched_rt_entity {
	struct list_head run_list;
	unsigned long timeout;主要用于判断当前进程时间是否超过RLIMIT_ RTTIME
	unsigned long watchdog_stamp;
	unsigned int time_slice;针对RR调度策略的调度时隙


	struct sched_rt_entity *back;
#ifdef CONFIG_RT_GROUP_SCHED
	struct sched_rt_entity	*parent;//指向上层调度实体
	/* rq on which this entity is (to be) queued: */
	struct rt_rq		*rt_rq;//当前实时调度实体所在的就绪队列

	/* rq "owned" by this entity/group: */
	struct rt_rq		*my_q;当前实时调度实体的子调度实体所在就绪队列

#endif
};

const struct sched_ class rt_ sched_ class = {
	.next = &fair_ sched_ class,
	..enqueue_ task = enqueue_ task_ rt, // 将一个task放入到就绪队列头部或者尾部
	.dequeue_ task = dequeue_ task_ rt, // 将一个task从就绪队列末尾
	.yield_ task = yield_ task_ rt,
	// 主动放弃执行
	.check_ preempt_ curr = check_ preempt_ curr_ rt,
	.pick_ next_ task.pick_ next_ task_ rt, // 核心调度器选择就绪队列那个任务被调度,
	.put_ prev_ task = put_ prev_ task_ rt, // 当一个任务将要被调度出时执行
#ifdef CONFIG SMP
	.select_ task_ rq = select_ task_ rq_ rt, // 核心调度器给任务待定CPU,用于将任务分发到不同CPU上执行
							.set_ cpus_ al lowed = set_ cpus_ allowed_ common,
	.rq_ onl ine = rq_ online_ rt,
	.rq_ offline = rq_ offline_ rt,
	.task_ woken = task_ woken_ rt,
	.switched from = switched_ from_ rt,
#endif
}


处理器结构

在这里插入图片描述

对称多处理器SMP

多处理器系统的工作方式分为非对称多处理(asym-metrical mulit-processing)和对称多处理(symmetrical mulit-processing,SMP)两种。
在对称多处理器系统中,所有处理器的地位都是相同的,所有的资源,特别是存储器、中断及I/O空间,都具有相同的可访问性,消除结构上的障碍。
多处理器系统上,内核必须考虑几个额外的问题,以确保良好的调度。
CPU负荷必须尽可能公平地在所有的处理器上共享。
进程与系统中某些处理器的亲合性(affinity)必须是可设置的。
内核必须能够将进程从一个CPU迁移到另一个。
linux SMP调度就是将进程安排/迁移到合适的CPU中去,保持各CPU负载均衡的过程。

NUMA

所谓物理内存,就是安装在机器上的,实打实的内存设备(不包括硬件cache),被CPU通过总线访问。在多核系统中,如果物理内存对所有CPU来说没有区别,每个CPU访问内存的方式也一样,则这种体系结构被称为Uniform Memory Access
如果物理内存是分布式的,由多个cell组成(比如每个核有自己的本地内存),那么CPU在访问靠近它的本地内存的时候就比较快,访问其他CPU的内存或者全局内存的时候就比较慢,这种体系结构被称为Non-Uniform Memory Access(NUMA)。

linux针对对称多处理器的负载调度均衡

在多处理器系统当中,内核必须考虑几个额外的问题,主要以确保良好的调度。
➢CPU负荷必须尽可能公平地在所有的处理器上共享。
➢进程与系统中某些处理器的亲合性(affinity) 必须是可设置的。
➢内核必须能够将进程从一个CPU迁移到另-一个。

启动加载

Linux 内核编译时,CONFIG_SMP 配置项用于控制内核是否支持SMP。
在这里插入图片描述
Linux 系统中SMP 模式的启动流程如图所示,复位之后,CPU0 和CPU1 同时执行ROM code 中的代码,此时的CPU0 和CPU1 运行的是一模一样的指令,此后ROM code 引导CPU0 去执行Bootloader(包括tfa 和uboot)的代码和内核代码
在这里插入图片描述
如果你曾经留意过内核启动的输出,你就会发现如图所示的打印信息,提示我们当前内核是在CPU0 上运行的
而CPU1 则进入循环,直到收到CPU0 发来的唤醒信号,在这个过程中,CPU0 已经为CPU1 创建空闲任务,CPU1 则被唤醒,开始执行空闲任务。

内核识别CPU

在这里插入图片描述
上面只是简单介绍了整个启动流程,实际上,内核是如何识别到芯片中有几个CPU 核的呢?CPU0又是如何唤醒CPU1 的呢?首先,为了描述当前系统中各个CPU 核心的工作状态,内核在kernel/cpu.c 中定义四个cpumask 类型的结构体变量,
__cpu_possible_mask:记录物理存在且可能被激活的CPU 核心对应的编号,由设备树解析CPU 节点获得;
__cpu_online_mask:记录当前系统正在运行的CPU 核心的编号;
__cpu_present_mask:动态地记录了当前系统中所有CPU 核心的编号,如果内核配置了CONFIG_HOTPLUG_CPU,那么这些CPU 核心不一定全部处于运行状态,因为有的CPU 核心可能被热插拔了;
__cpu_active_mask:用于记录当前系统哪些CPU 核心可用于任务调度;

用户空间的操作

在/sys/devices/system/cpu 目录下,记录了系统中所有的CPU 核以及上述各变量的内容,例如文件present,对应于__cpu_present_mask 变量,执行以下命令,可以查看当前系统中所有的CPU 核编号。

cat /sys/devices/system/cpu/present

此外,我们可以通过文件/sys/devices/system/cpu/cpu1/online 在用户空间控制一个CPU 核运行与否。

# 关闭CPU1
echo 0 > /sys/devices/system/cpu/cpu1/online
# 打开CPU1
echo 1 > /sys/devices/system/cpu/cpu1/online

接下来,看看内核是如何建立CPU 之间的关系的。在设备树根节点下有个/cpus 的子节点,其内容如下

cpus {
	#address-cells = <1>;
	#size-cells = <0>;

	cpu0: cpu@0 {
		compatible = "arm,cortex-a7";
		device_type = "cpu";
		reg = <0>;
		clocks = <&rcc CK_MPU>;
		clock-names = "cpu";
		operating-points-v2 = <&cpu0_opp_table>;
		nvmem-cells = <&part_number_otp>;
		nvmem-cell-names = "part_number";
	};

	cpu1: cpu@1 {
			compatible = "arm,cortex-a7";
			device_type = "cpu";
			reg = <1>;
			clocks = <&rcc CK_MPU>;
			clock-names = "cpu";
			operating-points-v2 = <&cpu0_opp_table>;
	};
};

该节点描述了当前硬件上存在两个CPU,分别是CPU0 和CPU1,内核代码通过解析该节点,便可以获得当前系统的CPU 核心个数,并且我们可以看到该节点还包含了“operating-points-v2”属性,指向了cpu0_opp_table 节点,该节点是用于配置CPU 核心支持的频率。

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

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

相关文章

ModuleNotFoundError: No module named ‘transformers_modules.chatglm2-6b‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

青少年机器人技术一级核心知识点:机械结构及模型(四)

随着科技的不断进步&#xff0c;机器人技术已经成为了一个重要的领域。在这个领域中&#xff0c;机械结构是机器人设计中至关重要的一部分&#xff0c;它决定了机器人的形态、运动方式和工作效率。对于青少年机器人爱好者来说&#xff0c;了解机械结构的基础知识&#xff0c;掌…

LabVIEW大模拟数据解决方案

LabVIEW大模拟数据解决方案 比亚迪汽车对于在动力总成标定和控制部门工作的400多名工程师来说&#xff0c;这种投资包括实现NI的新战略和解决方案&#xff0c;以更好地捕获和管理大量的原始测试数据&#xff0c;在车辆上市前做出更明智的决策。 因为能够更好地获取更优质的数…

Go语言开发者的Apache Arrow使用指南:内存管理

如果你看了上一篇《Go语言开发者的Apache Arrow使用指南&#xff1a;数据类型》[1]中的诸多Go操作arrow的代码示例&#xff0c;你很可能会被代码中大量使用的Retain和Release方法搞晕。不光大家有这样的感觉&#xff0c;我也有同样的feeling&#xff1a;**Go是GC语言[2]&#x…

MWCS 2023,到底有些啥?(下篇)

█ 亚信科技 5G行业专网一体机&#xff1a; 反光太厉害了&#xff0c;看不太清&#xff1a; 这几张都是小枣妹拍的&#xff0c;^_^&#xff1a; █ 浩鲸科技 浩鲸&#xff0c;就是以前的中兴软创&#xff1a; █ 紫光展锐 6G这块&#xff0c;干货很多&#xff1a; 这次重点展示…

docker容器日志占满硬盘空间的解决方案

目录 原因分析解决方案方案一 定时清空日志文件方案二 全局容器日志大小方案三 修改日志驱动 docker常用清理空间命令 原因分析 由于默认情况下&#xff0c;docker使用json-file类型的日志驱动&#xff0c;该日志驱动默认情况下&#xff0c;每个容器的日志会一直追加在文件名为…

chatgpt赋能python:用Python模拟用户登录,实现多个网站的SEO优化

用Python模拟用户登录&#xff0c;实现多个网站的SEO优化 介绍 在互联网时代&#xff0c;SEO已成为许多网站提高曝光率和流量的重要手段之一。而SEO优化的一个重要方面就是网站的用户登录。然而&#xff0c;手动登录多个网站进行SEO操作是非常耗时耗力的。那么&#xff0c;有…

卷积神经网络实现猫狗分类

目录 一、环境配置二、神经网络CNN1、简介2、CNN结构3、层次说明 三、数据集准备1、下载数据集2、数据集分类 四、 猫狗分类的实例——基准模型1、构建网络模型2、配置训练方法3、转换格式4、模型训练并保存生成的模型5、结果可视化 五、调整基准模型1、图像增强2、增强后的图像…

【C语言初阶(8)】函数1

文章目录 1. 函数的介绍2. 函数的分类2.1 库函数2.2 自定义函数 3. 函数的参数4. 函数的调用4.1 传值调用4.2 传址调用 1. 函数的介绍 1. 什么是函数&#xff1f; 函数是完成特定任务的独立程序代码单元。语法规则定义了函数的结构和使用方式。 一些函数执行某些动作&#xff…

Guava 之 EventBus

​​EvenBus​​​ 是 Guava 中 Pub/Sub 模式的轻量级实现。平时开发如果我们要实现自己的 Pub/Sub 模型&#xff0c;要写不少类&#xff0c;设计也挺复杂&#xff0c;对业务代码也有一定的侵入&#xff0c;但是在使用了 ​​EventBus​​ 之后就很方便了。 在 Pub/Sub 模式中…

Java——《面试题——tomcat篇》

全文章节 Java——《面试题——基础篇》 Java——《面试题——JVM篇》 Java——《面试题——多线程&并发篇》 Java——《面试题——Spring篇》 Java——《面试题——SpringBoot篇》 Java——《面试题——MySQL篇》​​​​​​ Java——《面试题——SpringCloud》 Java——…

干货 | 智慧教育平台生成式人工智能应用的安全要求

以下内容整理自清华大学《数智安全与标准化》课程大作业期末报告同学的汇报内容。 第一部分&#xff1a;编制说明 标准制定的基本原则主要包括以下四个方面&#xff1a; 综合性&#xff1a;本标准全面漫盖了智慧教育平台ChatGPT安全保护的要求&#xff0c;以便用户参考&#xf…

Spring:Bean

Bean 概述配置方式自动装配继承与依赖作用域外部属性文件的使用 概述 Spring 容器负责管理依赖注入&#xff0c;它将被管理的对象都称为 bean 。我们通过 xml 文件配置方式进行对 bean 的声明和管理。 写法如下&#xff1a; <beans><bean id"bean的唯一标识符…

Scrapy框架--CrawlSpider (详解+例子)

目录 CrawlSpider 简介 基本运行 特性和概念 基本使用 创建CrawlSpider 运行 使用CrawlSpider中核心的2个类对象 Rule对象 LinkExtractors 作用 使用 查看效果-shell中验证 示例 注意 CrawlSpider 简介 CrawlSpider 是 Scrapy 框架提供的一个特殊的 Spider 类…

Jvm内存模型剖析优化-JVM(四)

上篇文章代码实例详解如何自定义双亲委派&#xff0c;主要实现ClassLoader&#xff0c;有两个方法&#xff0c;一个直接loadClass用父类的&#xff0c;如果想在破坏&#xff0c;则需要重写loadClass&#xff0c;一个findClass必须要重新&#xff0c;因为父类是空的&#xff0c;…

SpringBoot3之GraalVM之Linux详细安装及使用教程

Linux安装底层工具相关依赖 yum install -y gcc glibc-devel zlib-devel安装GraalVM JDK 《GraalVM官网下载》 找到最近的GraalVM Community Edition X.X.X点击Assets&#xff08;因为我的是SpringBoot3项目&#xff0c;起始JDK就要求17&#xff0c;所以我下载17&#xff09;下…

青少年机器人技术一级核心知识点:机械结构及模型(一)

随着科技的不断进步&#xff0c;机器人技术已经成为了一个重要的领域。在这个领域中&#xff0c;机械结构是机器人设计中至关重要的一部分&#xff0c;它决定了机器人的形态、运动方式和工作效率。对于青少年机器人爱好者来说&#xff0c;了解机械结构的基础知识&#xff0c;掌…

vim背景颜色设置

cd ~进入个人家目录下&#xff0c;vim .vimrc进入vimrc文件&#xff1a; 在主题设置部分对颜色背景进行设置&#xff0c;onedark表示黑色背景&#xff0c;default表示白色背景&#xff0c;按需设置即可&#xff01;

网络知识点-链路聚合

链路聚合&#xff08;英语&#xff1a;Link Aggregation&#xff09;是一个计算机网络术语&#xff0c;指将多个物理端口汇聚在一起&#xff0c;形成一个逻辑端口&#xff0c;以实现出/入流量吞吐量在各成员端口的负荷分担&#xff0c;交换机根据用户配置的端口负荷分担策略决定…

【数据结构】算法的时间和空间复杂度

目录 1.什么是算法&#xff1f; 1.1算法的复杂度 2.算法的时间复杂度 2.1 时间复杂度的概念 计算Func1中count语句总共执行了多少次 2.2 大O的渐进表示法 2.3常见时间复杂度计算举例 实例1:执行2N10次 实例2:执行MN次 实例3:执行了100000000次 实例4:计算strchr的时…