- 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。具体源码如下:
推荐课程:https://xxetb.xetslk.com/s/3oyV5o