术语约定: gse: group se grq: group cfs_rq tg: task_group 一、前言 1.1 为什么要引入组调度 Linux调度器的粒度是一个进程,这样的粒度在很多场景是不合适的,比如,希望达到用户粒度,也就是希望每个用户占有相同的cpu时间。但是,在各个用户拥有的进程数量不同的情况下,显然调度器会将cpu更多地分配给进程数量多的用户。组调度的引入,正是解决此问题的 linux的cgroup(control group)支持将进程分组,然后按 [……
术语约定: gse: group se grq: group cfs_rq tg: task_group 一、前言 1.1 为什么要引入组调度 Linux调度器的粒度是一个进程,这样的粒度在很多场景是不合适的,比如,希望达到用户粒度,也就是希望每个用户占有相同的cpu时间。但是,在各个用户拥有的进程数量不同的情况下,显然调度器会将cpu更多地分配给进程数量多的用户。组调度的引入,正是解决此问题的 linux的cgroup(control group)支持将进程分组,然后按 [……
一、知识点梳理 首先列出本文要点: 虚拟运行时间计算流程: 进程每降低一个nice值,将多获得10%cpu的时间 nice为0时,虚拟运行时间=物理运行时间 nice为0时,权重为1024,即下面的NICE_0_LOAD=1024 牢记做功的概念: vruntime1 * weight1 = vruntime2 * weight2 由做功的概念可知虚拟运行时间和物理运行时间的转换关系如下: vriture_runtime * weight = wall_time * NI [……
调度是一个庞大的模块,涉及的知识点很多,下面我们来简单梳理一下 X、调度器 调度器决定了将哪个进程放到CPU上执行,以及执行多长时间。操作系统进行合理的进程调度,使得资源得到最大化的利用。调度器需要合理的分配CPU时间给运行的进程,创造一种所有进程并行运行的错觉,这就对调度器提出了要求: 调度器分配给task的时间不能太长,否则会导致其他的程序响应延迟,难以保证公平性 调度器分配给task的时间也不能太短,因为每次调度会导致上下文切换,这种切换开销也很大,即频繁的上下文切换导 [……
X、sched_class - 调度类 struct sched_class { //系统中所有的调度类通过该成员链接起来,排在链表前面的优先级最高 const struct sched_class *next; //向该调度器的runqueue链表上添加/删除一个进程,即入列/出列操作 void (*enqueue_task) (struct rq *rq, struct task_struct *p, int flags); void […]