读书笔记
根据优先级
根据优先级,进程分为实时进程和非实时进程(普通进程),Linux的进程优先级范围为[0, 139],其中实时进程优先级的范围为[0, 99],非实时进程的优先级为[100, 139),优先级的数值越低,说明优先级越高。
进程和线程都用task_struct表示,这个结构体里面包含了用到的所有的信息,线程的信息比较少,主要是进程里的一些资源和线程信息,而进程里包含的字段比较多,主要有标识符,状态,优先级,程序计数器,内存指针,上下文信息,IO状态记录,记账信息。
其中static_prio是普通进程的优先级,rt_priority是实时进程的优先级
对于实时进程的调度策略
- SCHED_FIFO:先来先服务算法,高优先级可以抢占低优先级,低优先级可以主动让出CPU
- SCHED_RR:轮转调度,按优先级调度,但优先级相同时,每个任务分配相同的时间片
- SCHED_DEADLINE:选择离deadline时间点最近的进程执行
对于非实时进程的调度策略
- SCHED_NORMAL:根据进程优先级和当前可用时间片来给进程分配一个固定的时间片,使用的是CFS调度管理器
- SCHED_BATCH:批处理,类似NORMAL,用来调度侧重吞吐量的任务
- SCHED_IDLE:用于调度CPU需求极低的任务
根据不同场景
- 先来先服务,通俗易懂,但是如果前面来的几个全是长任务,会导致系统吞吐量降低
- 短服务优先,解决了上面吞吐量的问题,但是这又对长任务不利
- 高响应比优先,有个公式 优先权=(就绪等待时间 要求服务的时间)/ 要求服务时间,就绪越久,优先级越高,任务越短,优先级也越高
- 时间片轮转,每个任务时间一样
- 最高优先级,每个任务的优先级可以静态设置,也可以动态改变
- 多级反馈队列,结合时间片和优先级,每个优先级都有一个队列,每个级别的队列里的任务,时间片都是一样的,但是不同级别队列的时间片不一样,级别越高,时间片越短