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)

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

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

相关文章

JS 防抖封装方法

防抖封装方法: /*** param {Function} func* param {number} wait* param {boolean} immediate* return {*}*/ export function debounce(func, wait, immediate) {let timeout, args, context, timestamp, resultconst later function () {// 据上一次触发时间间隔…

【Linux系统化学习】进程的父子关系 | fork 进程

个人主页点击直达:小白不是程序媛 Linux专栏:Linux系统化学习 目录 前言: 父子进程 父子进程的引入 查看父子进程 查询进程的动态目录 更改进程的工作目录 fork创建进程 fork的引入 fork的使用 fork的原理 fork如何实现的&#…

PS学习笔记——图层

文章目录 图层面板图层类型新建图层新建方式图层颜色 操作图层修改图层名称选中图层隐藏图层调整图层顺序复制图层 图层面板 按F7可打开/关闭图层面板 该面板就是图层面板了 对所有图层进行筛选的按钮,第一个搜索框可以选择按什么方式进行筛选,支持&am…

html-网站菜单-点击显示导航栏

一、效果图 1.点击显示菜单栏&#xff0c;点击x号关闭&#xff1b; 2.点击一级菜单&#xff0c;展开显示二级&#xff0c;并且加号变为减号&#xff1b; 3.点击其他一级导航&#xff0c;自动收起展开的导航。 二、代码实现 <!DOCTYPE html> <html><head>&…

首尔市立大学经营学专业介绍,柯桥留学韩语培训

首尔市立大学成立于1918年&#xff0c;位于韩国首尔特别市&#xff0c;是韩国国内一所综合性公立大学&#xff0c;2022QS世界大学排名位列801-1000名区间。近年来因为实行“半价学费”策略&#xff0c;得到首尔市政府的大力支持&#xff0c;通过大幅提高高考分数&#xff0c;吸…

IDEA导入jar包

通过maven导入本地包 mvn install:install-file -DfileD:\WebProject\ERP\zhixing-heyue-erp-server\zxhy-service-api\src\main\java\com\zxhy\service\api\invoice\baiwang\lib\com_baiwang_bop_sdk_outer_3_4_393.jar -DgroupIdcom.baiwang -DartifactIdbaiwang.open -Dver…

力扣labuladong一刷day11拿下打家劫舍问题共3题

力扣labuladong一刷day11拿下打家劫舍问题共3题 文章目录 力扣labuladong一刷day11拿下打家劫舍问题共3题一、198. 打家劫舍二、213. 打家劫舍 II三、337. 打家劫舍 III 一、198. 打家劫舍 题目链接&#xff1a;https://leetcode.cn/problems/house-robber/ 思路&#xff1a;打…

【项目管理】PMO技能树21项参照

导读&#xff1a;PMO技能树让你能够有全局视野&#xff0c;让你对照着检查自己的能力是否掌握。技能树提供了构建个人知识体系参照和地图导航&#xff0c;不至于迷失方向。 目录 1、PMO层次概览 2、技能树 2.1 项目管理流程 2.2 项目组合管理 2.3 风险管理 2.4 项目资源管…

leetcode做题笔记2736. 最大和查询

给你两个长度为 n 、下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;另给你一个下标从 1 开始的二维数组 queries &#xff0c;其中 queries[i] [xi, yi] 。 对于第 i 个查询&#xff0c;在所有满足 nums1[j] > xi 且 nums2[j] > yi 的下标 j (0 < j < n) …

Redis:java和SpringBoot中使用Redis

目录 Jedis操作Redis6SpringBoot整合Redis Jedis操作Redis6 Jedis是java开发的操作redis的工具包。 引入maven依赖&#xff1a; <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.2.1</ve…

振南技术干货集:比萨斜塔要倒了,倾斜传感器快来!(6)

注解目录 1、倾斜传感器的那些基础干货 1.1 典型应用场景 &#xff08;危楼、边坡、古建筑都是对倾斜敏感的。&#xff09; 1.2 倾斜传感器的原理 1.2.1 滚珠式倾斜开关 1.2.2 加速度式倾斜传感器 1)直接输出倾角 2)加速度计算倾角 3)倾角精度的提高 &#xff08;如果…

WPF中如何在MVVM模式下关闭窗口

完全来源于十月的寒流&#xff0c;感谢大佬讲解 使用Behaviors <Window x:Class"Test_03.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:b"http://schemas.microsoft.com/xaml/behaviors"xmlns:x&quo…

使用ADS进行serdes仿真时,Tx_Diff中EQ的设置对发送端波形的影响。

研究并记录一下ADS仿真中Tx_Diff的EQ设置。原理图如下&#xff1a; 最上面是选择均衡方法Choose equalization method&#xff1a;Specify FIR taps&#xff0c;Specify de-emphasis和none。 当选择Specify de-emphasis选项时&#xff0c;下方可以输入去加重具体的dB值&#x…

市级奖项+1,持安获「创业北京」创业创新大赛优秀奖!

2274个创业项目参赛 历经五个多月的激烈角逐 第六届“创业北京”创业创新大赛 终于圆满落下帷幕 持安科技在北京市总决赛中再创佳绩&#xff01; 荣获制造业赛道优秀奖 本次大赛由北京市人力资源和社会保障局、北京市发展和改革委员会等11家单位联合主办&#xff0c;以“创…

hive sql 取当周周一 str_to_date(DATE_FORMAT(biz_date, ‘%Y%v‘), ‘%Y%v‘)

select str_to_date(DATE_FORMAT(biz_date, %Y%v), %Y%v)方法拆解 select DATE_FORMAT(now(), %Y%v), str_to_date(202346, %Y%v)

【PG】PostgreSQL高可用方案repmgr管理之配置文件

1 配置文件 1.1 配置文件格式 repmgr.conf是一个纯文本文件&#xff0c;每行包含一个参数/值组合。 空格是无关紧要的&#xff08;除了在带引号的参数值内&#xff09;&#xff0c;并且空行将被忽略。#将该行的其余部分指定为注释。不是简单标识符或数字的参数值应该用单引号…

鉴源实验室 | DoIP协议网络安全攻击

作者 | 付东杰 上海控安可信软件创新研究院工控网络安全组 来源 | 鉴源实验室 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 01 背 景 随着科技的迅猛发展&#xff0c;汽车行业正经历着前所未有的数字化变革。现代汽车中使用70多个电子控制单元&#x…

knex事务

1.数据库事务 在执行SQL语句时&#xff0c;某些业务要求&#xff0c;一系列操作必须全部执行&#xff0c;而不能仅执行一部分。例如&#xff0c;一个转账操作&#xff1a; 从id1的账户给id2的账户转账100元 -- 第一步&#xff1a;将id1的A账户余额减去100 UPDATE accounts S…

uniapp中的H5页面微信浏览器中禁止下拉出现网页由xxx.xxxxx.com提供,QQ浏览器X5内核提供技术支持这个

在App.vue文件中的onLaunch函数新增如下 onLaunch: function () {console.log(App Launch);document.body.addEventListener(touchmove,function (e) {e.preventDefault();},{ passive: false });},

数据的存储--MongoDB文档存储

MongoDB文档存储 NoSQL&#xff0c;全称为Not Only SQL&#xff0c;意为不仅仅是SQL&#xff0c;泛指非关系型数据库。NoSQL是基于键值对的&#xff0c;而且不需要经过SQL层的解析&#xff0c;数据之间没有耦合性&#xff0c;性能非常高。 非关系行数据库又可细分如下。 键值存…