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

Linux源码阅读笔记04-实时调度类及SMP和NUMA

  • Linux进程分类
    • 实时进程
    • 普通进程
  • 如果系统中有一个实时进程并且可执行,调度器总是会选择他,除非有另外一个优先级高的实时进程。
  • SCHED_FIFO:没有时间片,被调度器选择之后,可以运行任意长的时间。
  • SCHED_RR:有时间片,进程运行时会减少。

实时调度类分析

实时调度实体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;
#ifdef CONFIG_RT_GROUP_SCHEDstruct sched_rt_entity		*parent; // 指向父RT调度实体/* rq on which this entity is (to be) queued: */// 实时类struct rt_rq			*rt_rq; // RT调度实体所属的实时运行队列/* rq "owned" by this entity/group: */struct rt_rq			*my_q; // RT调度实体所拥有的实时运行队列,用于管理子任务或子组任务
#endif
} __randomize_layout;
  • 实时类
struct rt_rq {struct rt_prio_array	active;unsigned int		rt_nr_running;unsigned int		rr_nr_running;
#if defined CONFIG_SMP || defined CONFIG_RT_GROUP_SCHEDstruct {int		curr; /* highest queued rt task prio */
#ifdef CONFIG_SMPint		next; /* next highest */
#endif} highest_prio;
#endif
#ifdef CONFIG_SMPunsigned long		rt_nr_migratory;unsigned long		rt_nr_total;int			overloaded;struct plist_head	pushable_tasks;#endif /* CONFIG_SMP */int			rt_queued;int			rt_throttled;u64			rt_time;u64			rt_runtime;/* Nests inside the rq lock: */raw_spinlock_t		rt_runtime_lock;#ifdef CONFIG_RT_GROUP_SCHEDunsigned long		rt_nr_boosted;struct rq		*rq;struct task_group	*tg;
#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,// 选择就绪队列的拿个任务将要被调度,prev是将要被调度出的任务,返回是将要被调度的任务.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
};
  • 选择进程

  • 插入进程

  • 删除进程

SMP和NUMA

SMP(对称多处理器结构)

对称多处理器结构(symmetrical mulit-processing,SMP),在对称多处理器系统中,所有处理器的地位都是平等的,所有CPU共享全部资源,比如内存,总线,中断及IO系统等等,都具有相同的可访问性,消除结构上的障碍,最大的特点是共享资源。

  • SMP服务器CPU利用率最好的情况下是2-4个CPU,实践证明。
  • 从应用层到架构层,目前商用服务器大体分三类:SMP、NUMA、MPP。
    • NUMA优势:以太物理服务器内集成多CPU,使系统具有较高的事务处理能力。由于远程内存访问有延迟,所以需要尽量减少不同CPU模块之间的交互。所以显然,NUMA架构适合OLTP事务处理环境。
    • SMP优势:当前使用OTLP程序当中,用户访问一个中断数据库,如果采用SMP架构,他的效率比MPP块。

多处理器系统中,内核需要额外考虑几个问题,确保良好调度。

  • CPU符合尽可能公平。
  • 进程与系统重某些处理器的亲核性。

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

NUMA是多处理器计算机,系统各个CPU都有本地内存都可以支持超快的访问能力,各个处理器之间用总线链接,支持对其他CPU的本地内存访问(但是访问比自己内存慢一点)。

CPU域初始化

  • 物理属性分类

    • SMT(Simultaneous Multithreading):超线程,在单个物理处理核心上同时执行多个线程来提高并行性和吞吐量。

    • MC(Multi-core):多核心,在同一芯片上集成了多个独立的处理核心,每个核心都可以独立运行任务。

    • SoC(System on Chip):处理器,集成了整个计算机系统功能的芯片,包括处理器、内存、输入输出接口等。它将多个硬件组件集成在一个芯片上,实现高度集成和协作。

  • Linux内核分类

    • CONFIG_SCHED_SMT。
    • CONFIG_SCHED_MC。
    • DIE。
  • Linux内核多CPU的管理是通过bitmap来管理的,并且定义4种状态:possible/present/online/active。具体源码如下:


推荐课程:https://xxetb.xetslk.com/s/3oyV5o

相关文章:

  • 跟《经济学人》学英文:2024年6月15日这期 The war for AI talent is heating up
  • AI与音乐:创新之光还是毁灭之剑?
  • 微型操作系统内核源码详解系列五(四):cm3下svc启动任务
  • 天马学航——智慧教务系统(移动端)开发日志三
  • 用友U9-UBF自定义报表-打印模板开发学习笔记
  • SpringBoot测试实践
  • Spark SQL 血缘解析方案
  • 【Apache Doris】周FAQ集锦:第 7 期
  • python,ipython 和 jupyter notebook 之间的关系
  • 什么是N卡和A卡?有什么区别?
  • Python设计模式 - 简单工厂模式
  • Linux驱动开发笔记(十一)tty子系统及其驱动
  • AMSR/ADEOS-II L1A Raw Observation Counts V003地球表面和大气微波辐射的详细观测数据
  • 计算机组成原理笔记-第1章 计算机系统概论
  • 大疆无人机航点飞行KMZ文件提取航点坐标
  • [笔记] php常见简单功能及函数
  • ➹使用webpack配置多页面应用(MPA)
  • classpath对获取配置文件的影响
  • es的写入过程
  • go append函数以及写入
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • PHP CLI应用的调试原理
  • tab.js分享及浏览器兼容性问题汇总
  • ubuntu 下nginx安装 并支持https协议
  • unity如何实现一个固定宽度的orthagraphic相机
  • vue中实现单选
  • 基于HAProxy的高性能缓存服务器nuster
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 王永庆:技术创新改变教育未来
  • 为视图添加丝滑的水波纹
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 项目实战-Api的解决方案
  • 延迟脚本的方式
  • 一些css基础学习笔记
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • # linux从入门到精通(三)
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • #include<初见C语言之指针(5)>
  • (汇总)os模块以及shutil模块对文件的操作
  • (十七)、Mac 安装k8s
  • (十三)Maven插件解析运行机制
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .NET Core中如何集成RabbitMQ
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET开源、简单、实用的数据库文档生成工具
  • /bin/rm: 参数列表过长"的解决办法
  • @Autowired 和 @Resource 区别的补充说明与示例
  • @media screen 针对不同移动设备
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [20171106]配置客户端连接注意.txt
  • [2669]2-2 Time类的定义
  • [AutoSar]工程中的cpuload陷阱(三)测试
  • [BFS广搜]迷阵