linux进程管理和调度
进程的管理结构也叫做PCB(进程控制块),是一个task_struct类型的结构体,里面保存了关于该进程的所有信息,系统中每个进程的pcb都由一个链表连接起来
1、进程的状态和执行信息,进程ID号,优先级,程序执行有关的时间信息等
2、已分配的虚拟内存的信息
3、进程所属用户ID,组ID,进程的权限
进程的分类
1、软实时进程:需要快速的到结果,但可稍微晚一些,对时间的限制不像硬实时进程那样严格,优先级最高的进程
2、交互式进程:需要快速响应用户的输入。优先级低于软实时进程
3、空闲进程: 只有当cpu上没有其他正在运行的进程时才会运行的进程,优先级最低
linux内核是如何确定实时进程的优先级总是高于普通进程的?
普通进程的优先级可以用nice命令来设置,其范围是[-20, +19],这是在用户态的数值,当该数值被映射到内核中去修改进程优先级时,它被映射到的范围是[100,139], 而实时进程的优先级范围是[0,99],数值越小优先级越高,这样普通进程的优先级总是低于实时进程。
进程的调度由linux内核的一个子系统调度器来实现,调度器使用了一系列的数据结构来排序和管理系统中的进程。
通用调度器(核心调度器):本质上是一个分配器,与其他两个组件进行交互
调度类:用于判断接下来运行哪个进程,内核支持不同的调度策略(完全公平调度,实时调度等),调度类使得能够以模块化的方 法实现这些策略。
在调度器被调用后,它会去查询调度类,得知接下来运行哪个进程,选中要运行的进程后,进行底层任务的切换。每个进程都属于某一调度类,各个调度类负责管理所属的进程,而通用调度器完全不涉及进程管理,其工作都委托给调度器类。
CFS完全公平调度类的实现原理
在调度实体sched_entity结构体中有一个load成员和一个vruntime成员,前者表示一个进程的权重,值越大表示该进程越重要,后者表示一个进程在运行时所消耗的虚拟时钟的时间。虚拟时钟的速度和物理时钟不同,它取决于一个调度实体中load的值,成反比,也就是说load越大虚拟时钟速度越慢,因此当一个load大的进程在cpu上运行时,它所使用的虚拟时钟值vruntime增长就越慢。而就绪队列中有一个min_vruntime成员,表示该就绪队列中最小的虚拟运行时间,在红黑树上排序的时候按照vruntime-min_vruntime的值来存放&