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

简介: 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_SCHED
  struct 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_SCHED
  struct {
    int   curr; /* highest queued rt task prio */
#ifdef CONFIG_SMP
    int   next; /* next highest */
#endif
  } highest_prio;
#endif
#ifdef CONFIG_SMP
  unsigned 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_SCHED
  unsigned 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。具体源码如下:

相关文章
|
1月前
|
Unix Linux 开发工具
linux笔记 diff及patch的制作与使用
这篇文章是关于Linux系统中使用`diff`命令生成补丁文件以及使用`patch`命令应用这些补丁的详细教程和实战案例。
22 2
linux笔记 diff及patch的制作与使用
|
1月前
|
数据采集 Linux
Linux源码阅读笔记20-PCI设备驱动详解
Linux源码阅读笔记20-PCI设备驱动详解
|
1月前
|
Linux
Linux源码阅读笔记19-插入删除模块实战
Linux源码阅读笔记19-插入删除模块实战
|
1月前
|
Ubuntu Linux Shell
【linux】PetaLinux 2024.1安装笔记
【linux】PetaLinux 2024.1安装笔记
78 0
|
19天前
|
机器学习/深度学习 安全 网络协议
Linux防火墙iptables命令管理入门
本文介绍了关于Linux防火墙iptables命令管理入门的教程,涵盖了iptables的基本概念、语法格式、常用参数、基础查询操作以及链和规则管理等内容。
178 73
|
12天前
|
Linux Shell
Linux 中 Tail 命令的 9 个实用示例
Linux 中 Tail 命令的 9 个实用示例
42 6
Linux 中 Tail 命令的 9 个实用示例
|
8天前
|
设计模式 Java Linux
Linux的20个常用命令
Linux的23个常用命令
Linux的20个常用命令
|
17天前
|
Linux 应用服务中间件 nginx
|
3天前
|
机器学习/深度学习 存储 Linux
linux中强大且常用命令:find、xargs、grep
linux中强大且常用命令:find、xargs、grep
25 9
|
3天前
|
SQL 移动开发 Linux
linux下find、grep命令详解
linux下find、grep命令详解
39 8