当前位置: 首页 > news >正文

Linux 进程管理 实时调度类及SMP和NUMA

文章目录

  • 一、 实时调度类分析
    • 1.1 实时调度实体sched_rt_entity数据结构
    • 1.2 实时调度类rt_sched_class数据结构
    • 1.3 实时调度类功能函数
  • 二、SMP和NUMA
    • 2.1 SMP(多对称处理器结构,UMA)
    • 2.2 NUMA(非一致内存访问结构)
    • 2.3 CPU域初始化

在这里插入图片描述

一、 实时调度类分析

1.1 实时调度实体sched_rt_entity数据结构

表示实时调度实体,包含整个实时调度数据信息。具体内核源码如下:

// 表示实时调度实体
struct sched_rt_entity {struct list_head		run_list; // 用于加入优先级队列当中unsigned long			timeout; // 设置时间超时unsigned long			watchdog_stamp; // 记录jiffies值unsigned int			time_slice; // 记录时间片unsigned short			on_rq;unsigned short			on_list;struct sched_rt_entity		*back; // 临时用于从上往下连接RT调度实体
#ifdef CONFIG_RT_GROUP_SCHEDstruct sched_rt_entity		*parent; // 指向父RT调度实体/* rq on which this entity is (to be) queued: */// rt_rq:实时类struct rt_rq			*rt_rq;  // RT调度实体所属实时运行队列,被调度/* rq "owned" by this entity/group: */struct rt_rq			*my_q;  // RT调度实体拥有的实时调度队列,用于管理子任务或子组任务
#endif
} __randomize_layout;

1.2 实时调度类rt_sched_class数据结构

数据结构内核源码如下:

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, // 当任务将要被调度出时执行 .set_next_task          = set_next_task_rt,#ifdef CONFIG_SMP.balance		= balance_rt,.select_task_rq		= select_task_rq_rt,.set_cpus_allowed       = set_cpus_allowed_common,.rq_online              = rq_online_rt,.rq_offline             = rq_offline_rt,.task_woken		= task_woken_rt,.switched_from		= switched_from_rt,
#endif.task_tick		= task_tick_rt,.get_rr_interval	= get_rr_interval_rt,.prio_changed		= prio_changed_rt,.switched_to		= switched_to_rt,.update_curr		= update_curr_rt,#ifdef CONFIG_UCLAMP_TASK.uclamp_enabled		= 1,
#endif
};

1.3 实时调度类功能函数

  • 插入进程:enqueue_task_rt(…) -> ,源码如下:
/** Adding/removing a task to/from a priority array:* 更新调度信息,将调度实体插入到相应优先级队列末尾*/
static void
enqueue_task_rt(struct rq *rq, struct task_struct *p, int flags)
{struct sched_rt_entity *rt_se = &p->rt;if (flags & ENQUEUE_WAKEUP)rt_se->timeout = 0;enqueue_rt_entity(rt_se, flags);if (!task_current(rq, p) && p->nr_cpus_allowed > 1)enqueue_pushable_task(rq, p);
}
  • 选择进程:pick_next_rt_entity(…),实时调度会选择最高优先级的实时进程来运行,源码如下:
static struct sched_rt_entity *pick_next_rt_entity(struct rq *rq,struct rt_rq *rt_rq)
{struct rt_prio_array *array = &rt_rq->active;struct sched_rt_entity *next = NULL;struct list_head *queue;int idx;// 首先找到一个可用实体idx = sched_find_first_bit(array->bitmap);BUG_ON(idx >= MAX_RT_PRIO);// 从链表组中找对对应链表queue = array->queue + idx;next = list_entry(queue->next, struct sched_rt_entity, run_list);return next; // 返回找到的运行实体
}
  • 删除进程:dequeue_task_rt(…),从优先级队列中删除实时进程,并更新调度信息,然后把这个进程添加到队尾。源码如下:
// 删除进程
static void dequeue_task_rt(struct rq *rq, struct task_struct *p, int flags)
{struct sched_rt_entity *rt_se = &p->rt;update_curr_rt(rq); // 更新调度数据信息等等dequeue_rt_entity(rt_se, flags); // 将rt_se从运行队列中删除,然后添加到队列尾部dequeue_pushable_task(rq, p); // 从hash表中进行删除
}

二、SMP和NUMA

2.1 SMP(多对称处理器结构,UMA)

在这里插入图片描述
实践证明SMP服务器CPU利用率最高是2-4个CPU
在这里插入图片描述

2.2 NUMA(非一致内存访问结构)

在这里插入图片描述

2.3 CPU域初始化

在这里插入图片描述

extern struct cpumask __cpu_possible_mask;
extern struct cpumask __cpu_online_mask;
extern struct cpumask __cpu_present_mask;
extern struct cpumask __cpu_active_mask;
// 表示有多少可以执行的CPU核心
#define cpu_possible_mask ((const struct cpumask *)&__cpu_possible_mask)
// 表示有多少正处于运行状态的CPU核心
#define cpu_online_mask   ((const struct cpumask *)&__cpu_online_mask)
// 表示有多少个具备online条件的CPU核心(不一定都处于online状态,有的CPU核心可能被热插拔)
#define cpu_present_mask  ((const struct cpumask *)&__cpu_present_mask)
// 表示系统中有多少个活跃的CPU核心
#define cpu_active_mask   ((const struct cpumask *)&__cpu_active_mask)

相关文章:

Linux 进程管理 实时调度类及SMP和NUMA

文章目录 一、 实时调度类分析1.1 实时调度实体sched_rt_entity数据结构1.2 实时调度类rt_sched_class数据结构1.3 实时调度类功能函数 二、SMP和NUMA2.1 SMP(多对称处理器结构,UMA)2.2 NUMA(非一致内存访问结构)2.3 C…...

线性表--链表-1

文章目录 主要内容一.链表练习题1.设计一个递归算法,删除不带头结点的单链表 L 中所有值为 X 的结点代码如下(示例): 2.设 L为带头结点的单链表,编写算法实现从尾到头反向输出每个结点的值代码如下(示例): …...

WPF小知识

在编写WPF程序遇到一些小问题&#xff0c;所以记录起来&#xff0c;查其他方便。 Label自动换行 网上搜的都不能自动换行&#xff0c;发现使用Run 就可以。在脚本中直接调用labTip.Text进行赋值就可以了。 <Label Foreground"#FF9E9E9E" FontSize"16"…...

坐标系下的运动旋量转换

坐标系下的运动旋量转换 文章目录 坐标系下的运动旋量转换前言一、运动旋量物体运动旋量空间运动旋量 二、伴随变换矩阵三、坐标系下运动旋量的转换四、力旋量五、总结参考资料 前言 对于刚体而言&#xff0c;其角速度可以写为 ω ^ θ ˙ \hat {\omega} \dot \theta ω^θ˙&…...

Android Termux安装MySQL,通过内网穿透实现公网远程访问

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f516;系列专栏&#xff1a; C语言、Linux、Cpolar ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 前言1.安装MariaDB2.安装cpolar内网穿透工具3. 创建安全隧道映射mysql4. 公网远程连接5. 固定远程连接地址 前…...

Python in Visual Studio Code 2023年11月发布

排版&#xff1a;Alan Wang 我们很高兴地宣布 Visual Studio Code 的 Python 和 Jupyter 扩展将于 2023 年 11 月发布&#xff01; 此版本包括以下公告&#xff1a; 改进了使用 Shift Enter 在终端中运行当前行弃用内置 linting 和格式设置功能对 Python linting 扩展的改进重…...

算法通关村——数字中的统计、溢出、进制转换处理模板

数字与数学基础问题 1、数字统计 1.1、符号统计 LeetCode1822. 给定一个数组&#xff0c;求所有元素的乘积的符号&#xff0c;如果最终答案是负的返回-1&#xff0c;如果最终答案是正的返回1&#xff0c;如果答案是0返回0. 这题其实只用看数组中0和负数的个数就好了&#x…...

ESP01S通过心知天气获取天气和时间信息

ESP01S通过心知天气获取天气和时间信息 设置STA模式 ATCWMODE1 连接wifi ATCWJAP"wifi名称","wifi密码"3.设置时间地域 ATCIPSNTPCFG1,8获取时间 ATCIPSNTPTIME?返回&#xff1a; CIPSNTPTIME:Fri Nov 17 17:09:22 2023 OK连接心知服务器 ATCIPSTAR…...

docker容器内core dumped却找不到core文件

1. 检查ulimit&#xff0c; 使用命令&#xff1a; ulimit -a rootb7c19f6da1e3:/usr# ulimit -a core file size (blocks, -c) unlimited data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks…...

ubuntu提高 github下载速度

Github一般用于Git的远程仓库&#xff0c;由于服务器位于国外&#xff0c;国内访问速度比较慢&#xff0c;为了提高访问速度&#xff0c;决定绕过DNS域名解析。 获取Github的IP地址 按下ctrl&#xff0b;alt&#xff0b;T打开命令终端&#xff0c;输入&#xff1a; nslookup gi…...

Node.js之path路径模块

让我为大家介绍一下path路径模块吧&#xff01; 什么是path路径模块&#xff1f; path 模块是 Node.s 官方提供的、用来处理路径的模块。它提供了一系列的方法和属性&#xff0c;用来满足用户对路径的处理需求。 介绍三个关于path模块的方法&#xff1a; path.join() 方法&…...

TCP与UDP协议

TCP与UDP协议 1、TCP协议&#xff1a; 1、TCP特性&#xff1a; TCP 提供一种面向连接的、可靠的字节流服务。在一个 TCP 连接中&#xff0c;仅有两方进行彼此通信。广播和多播不能用于 TCP。TCP 使用校验和&#xff0c;确认和重传机制来保证可靠传输。TCP 给数据分节进行排序…...

“ /^A-Z:\\{1,2}^/:\*\?<>\|+\.(jpg|gif|png|bmp)$/i ”这个正则表达式的理解

这个正则表达式可以分解为以下几个部分&#xff1a; ^&#xff1a;这是一个开始符号&#xff0c;表示匹配必须从字符串的开始部分开始。/&#xff1a;这是一个斜杠符号&#xff0c;通常在正则表达式中用来表示特殊字符的转义。A-Z:&#xff1a;这部分表示匹配一个大写字母后跟…...

批量下载Sentinel数据脚本2023

批量下载Sentinel数据脚本2023 那些最好的程序员不是为了得到更高的薪水或者得到公众的仰慕而编程&#xff0c;他们只是觉得这是一件有趣的事情&#xff01; 批量下载Sentinel数据脚本2023 批量下载Sentinel数据脚本2023&#x1f33f;前言&#x1f33f;脚本地址&#x1f4e7;Su…...

lv11 嵌入式开发 ARM指令集中(伪操作与混合编程) 7

目录 1 伪指令 2 伪操作 3 C和汇编的混合编程 4 ATPCS协议 1 伪指令 本身不是指令&#xff0c;编译器可以将其替换成若干条等效指令 空指令NOP 指令LDR R1, [R2] 将R2指向的内存空间中的数据读取到R1寄存器 伪指令LDR R1, 0x12345678 R1 0x12345678 LDR伪指令可以将任…...

北邮22级信通院数电:Verilog-FPGA(10)第十周实验 实现移位寄存器74LS595

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分 二.管脚分配 三.实现过程讲解及效…...

麒麟系统安装找不到安装源!!!!设置基础软件仓库时出错

记录--华为RH2288 V3服务器安装麒麟系统遇到的问题 1.遇到的问题--“设置基础软件仓库时出错”报错导致无法继续安装 没办法下一步 先说结论&#xff1a;系统bug 该问题在CentOS、Rocky Linux最新版中均存在 解决&#xff1a; &#xff08;一&#xff09;、如果是外网直接配…...

代码随想录算法训练营第三十九天【动态规划part02】 | 62.不同路径、63. 不同路径 II

62.不同路径 题目链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 求解思路&#xff1a; 动规五部曲 确定dp数组及其下标含义&#xff1a;dp[i][j] 表示从&#xff08;0,0&#xff09;出发&#xff0c;到&#xff08;i,j&#x…...

鸿蒙4.0开发笔记之DevEco Studio如何使用Previewer窗口预览器(一)

一、预览器作用 DevEco Studio预览器概况在HarmonyOS应用开发过程中&#xff0c;通过使用预览器&#xff0c;可以查看应用的UI效果&#xff0c;方便开发者实时查看应用的运行效果&#xff0c;随时调整代码。 二、打开Previewer预览器 1、正常启动 打开预览器的位置在DevEco…...

音视频转换软件Permute mac中文板特点介绍

Permute mac是一款Mac平台上的媒体格式转换软件&#xff0c;由Chaotic Software开发。它可以帮助用户快速地将各种音频、视频和图像文件转换成所需格式&#xff0c;并提供了一些常用工具以便于用户进行编辑和处理。 Permute mac软件特点 - 支持大量格式&#xff1a;支持几乎所…...

Kubernetes多集群管理策略:统一管理多个K8s集群

Kubernetes多集群管理策略&#xff1a;统一管理多个K8s集群 一、多集群管理概述 Kubernetes多集群管理是指在企业环境中管理多个独立的Kubernetes集群&#xff0c;实现统一的部署、监控和运维。 1.1 多集群场景 场景说明示例地域隔离不同区域部署独立集群北京、上海、广州各…...

别再乱改sshd_config主文件了!Ubuntu 22.04下用sshd_config.d目录的正确姿势

Ubuntu 22.04下SSH配置管理的现代实践&#xff1a;告别直接修改sshd_config的时代 在Linux系统管理中&#xff0c;SSH服务的配置一直是个看似简单实则暗藏玄机的领域。许多管理员至今仍保持着直接修改 /etc/ssh/sshd_config 文件的习惯&#xff0c;却不知道Ubuntu等现代Linux…...

观察Taotoken按Token计费模式如何让项目成本更可控

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 观察Taotoken按Token计费模式如何让项目成本更可控 对于许多开发团队而言&#xff0c;将大模型能力集成到产品中&#xff0c;除了技…...

电脑里突然冒出的FNPLicensingService.exe是啥?手把手教你关闭它(附Adobe/CAD/Xshell等软件排查指南)

电脑里突然冒出的FNPLicensingService.exe是啥&#xff1f;手把手教你关闭它&#xff08;附Adobe/CAD/Xshell等软件排查指南&#xff09;当你打开任务管理器&#xff0c;突然发现一个陌生的进程FNPLicensingService.exe在后台运行&#xff0c;甚至频繁请求联网&#xff0c;这难…...

2026年AI写作辅助网站实测精选:5款神器从选题到格式全流程护航

写论文的难处&#xff0c;是每个科研人和学生都心知肚明的“隐形负担”。选题无从下手&#xff0c;文献检索耗时费力&#xff0c;格式排版反复调整&#xff0c;查重降重更是让人抓耳挠腮。2026年的AI工具早已不再是冷冰冰的“文字机器”&#xff0c;而是进化成了能理解学术逻辑…...

【Redis基础篇】Redis的Java客户端

温馨提示&#xff1a;建议在PC端浏览~ Redis的Java客户端在Redis官网中提供了各种语言的客户端&#xff0c;地址&#xff1a;https://redis.io/clientsJedis客户端Jedis的官网地址&#xff1a;https://github.com/redis/jedis&#xff0c;我们先来个快速入门&#xff1a;1、引入…...

从机器学习到生化电路:基于维度缩减与内部模型的趋势预测设计

1. 项目概述&#xff1a;当机器学习遇见生化电路在合成生物学和计算神经科学的交叉地带&#xff0c;有一个问题一直让我着迷&#xff1a;一个由简单化学反应构成的生物系统&#xff0c;如何能像一台精密的计算机一样&#xff0c;对未来做出预测&#xff1f;这听起来像是科幻小说…...

利用Taotoken模型广场为你的智能客服场景选择合适的大模型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 利用Taotoken模型广场为你的智能客服场景选择合适的大模型 构建智能客服系统时&#xff0c;一个核心决策是选择合适的大语言模型。…...

深度解密:如何通过SMUDebugTool完全掌控AMD锐龙处理器的隐藏性能

深度解密&#xff1a;如何通过SMUDebugTool完全掌控AMD锐龙处理器的隐藏性能 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: …...

BiliBiliCCSubtitle架构解析:C++实现的B站CC字幕高效下载与转换技术方案

BiliBiliCCSubtitle架构解析&#xff1a;C实现的B站CC字幕高效下载与转换技术方案 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle BiliBiliCCSubtitle是一款基于C…...