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。具体源码如下: