进程分类
Linux进程可以分为普通进程(包含交互进程和批处理进程)和实时进程(软实时),实时进程的优先级都高于普通进程。而且他们的调度策略也会有所不同
调度策略
Linux的调度策略大致可以分为循环时间分享策略(分时系统TSS)和实时调度策略
- 分时系统:
普通进程则被认为是没有实时需求的进程,于是调度程序力图让各个处于可执行状态的普通进程和平共处地分享CPU,从而让用户觉得这些进程是同时运行的
普通的进程都是通过分时运行的,使用CPU的时间达到分配给进程的时间(时间片)时,就会切换到其他进程,其一般为SCHED_OTHER 或 SCHED_NORMAL - 实时系统:
实时的进程需要交严格要求保证实时的处理,需要指定静态的执行优先级,并严格按照执行优先级进行调度。有99个优先级,1(最低)——99(最高)
实时进程调度的中心思想是,让处于可执行状态的最高优先级的实时进程尽可能地占有CPU,因为它有实时需求
普通进程调度
与实时进程相比,普通进程的调度要复制的多,内核需要考虑两件事:
-
动态跳帧进程的优先级
按照进程的行为特征,进程可以分为如下:- 交互式进程
- 批处理进程
-
用程序未必就像桌面程序、编译程序这样典型。程序的行为可能五花八门,可能一会儿像交互式进程,一会儿又像批处理进程。以致于用户难以给它设置一个合适的优先级。
-
再者,即使用户明确知道一个进程是交互式还是批处理,也多半碍于权限或因为偷懒而不去设置进程的优先级。
-
最终,区分交互式进程和批处理进程的重任就落到了内核的调度程序上。
调度程序关注进程近一段时间内的表现(主要是检查其睡眠时间和运行时间),根据一些经验性的公式,判断它现在是交互式的还是批处理的?程度如何?最后决定给它的优先级做一定的调整。
进程的优先级被动态调整后,就出现了两个优先级:
1. 用户程序设置的优先级(如果未设置,则使用默认值),称为静态优先级。这是进程优先级的基准,在进程执行的过程中往往是不改变的;
2. 优先级动态调整后,实际生效的优先级。这个值是可能时时刻刻都在变化的;
- 调度的公平性
在支持多进程的系统中,理想情况下,各个进程应该是根据其优先级公平地占有CPU。而不会出现“谁运气好谁占得多”这样的不可控的情况。
linux实现公平调度基本上是两种思路:
-
给处于可执行状态的进程分配时间片(按照优先级),用完时间片的进程被放到“过期队列”中。等可执行状态的进程都过期了,再重新分配时间片;
-
动态调整进程的优先级。随着进程在CPU上运行,其优先级被不断调低,以便其他优先级较低的进程得到运行机会;
实时进程调度
- 高优先级的实时进程会抢占优先级低的实时进程。
- 对于相同优先级的多个实时进程同时处于可执行状态的情况,分为两种具体策略:
- SCHED_RR
时间片轮转的实时进程,当进程具有相同优先级,按照优先级权重分配运行时间,当调度程序把CPU分配给进程时,会把该进程描述符放在运行队列队尾,所以不会及时执行该进程。 - SCHED_FIFO
先进先出实时进程,当调度程序把CPU分配给进程时,会把该进程的描述符放在运行队列当前位置,所以会及时执行该进程,而且如果没有比它优先等级高的进程,且它不主动放弃CPU,它将一直执行下去。
- SCHED_RR
https://blog.csdn.net/weixin_42092278/article/details/89187728