梁越

进程调度策略

0 人看过

读书笔记

根据优先级

根据优先级,进程分为实时进程非实时进程(普通进程),Linux的进程优先级范围为[0, 139],其中实时进程优先级的范围为[0, 99],非实时进程的优先级为[100, 139),优先级的数值越低,说明优先级越高。

进程和线程都用task_struct表示,这个结构体里面包含了用到的所有的信息,线程的信息比较少,主要是进程里的一些资源和线程信息,而进程里包含的字段比较多,主要有标识符,状态,优先级,程序计数器,内存指针,上下文信息,IO状态记录,记账信息。

其中static_prio是普通进程的优先级,rt_priority是实时进程的优先级

对于实时进程的调度策略

  1. SCHED_FIFO:先来先服务算法,高优先级可以抢占低优先级,低优先级可以主动让出CPU

  2. SCHED_RR:轮转调度,按优先级调度,但优先级相同时,每个任务分配相同的时间片

  3. SCHED_DEADLINE:选择离deadline时间点最近的进程执行

对于非实时进程的调度策略

  1. SCHED_NORMAL:根据进程优先级和当前可用时间片来给进程分配一个固定的时间片,使用的是CFS调度管理器

  2. SCHED_BATCH:批处理,类似NORMAL,用来调度侧重吞吐量的任务

  3. SCHED_IDLE:用于调度CPU需求极低的任务

根据不同场景

  1. 先来先服务,通俗易懂,但是如果前面来的几个全是长任务,会导致系统吞吐量降低

  2. 短服务优先,解决了上面吞吐量的问题,但是这又对长任务不利

  3. 高响应比优先,有个公式 优先权=(就绪等待时间+要求服务的时间)/ 要求服务时间,就绪越久,优先级越高,任务越短,优先级也越高

  4. 时间片轮转,每个任务时间一样

  5. 最高优先级,每个任务的优先级可以静态设置,也可以动态改变

  6. 多级反馈队列,结合时间片和优先级,每个优先级都有一个队列,每个级别的队列里的任务,时间片都是一样的,但是不同级别队列的时间片不一样,级别越高,时间片越短