linux 进程调度

一、调度策略

1、I/O消耗型:图型界面程序。处理器消耗型:执行大量数学计算的程序。

2、进程优先级:

①nice值:值越大,优先级越低。nice值代表时间片的比例

②实时优先级:越高的实时优先级数值意味着进程优先级越高。

3、时间片:

它表示进程在被抢占前所能持续运行的时间。

linux中使用新的CFS调度器,其抢占时机取决于新的可运行程序消耗了多少处理器使用比,如果消耗的使用比比当前进程小,则新进程立刻投入运行,抢占当前进程。

二、调度算法

1、调度器类:

它允许多种不同的可动态添加的调度算法并存,调度属于自己范围的进程。每个调度器也都有优先级,最高优先级的调度器去选择下面要执行的那一个程序。

2、公平调度算法(CFS):针对普通进程的调度类,

理想模型:每个进程能获得1/n的处理器时间。

现实:CFS的做法是允许每个进程运行一段时间,循环轮转,选择运行最少的进程作为下一个运行进程,不再采用分配给每个进程时间片的做法了。CFS在所有可运行进程总数基础上计算出一个进程应该运行多久,而不是依靠nice值来计算时间片。nice值在cfs中被作为进程获得的处理器运行比的权重。同时设置每个进程获得的时间片底线,防止时间片过小。

三、linux调度的实现

①时间记账

每当系统时钟节拍发生时,时间片都会被减少一个节拍周期。当一个进程的时间片减少到0时,它会被另一个尚未减到0的时间片可运行进程抢占。

②进程选择

CFS使用红黑树来组织可运行进程队列,并利用其迅速找到最小vruntime值得进程。

当进程变成可运行状态或fork()调用第一次创建进程时,向树中加入进程。

当进程变成阻塞或终止态时候,从红黑树中删除进程。

③调度器入口

schedule()函数:通常和一个具体的调度类相关联,也就是说,它会找到一个更高优先级的调度类,该类要有自己的可运行队列,然后问后者谁才是下一个该运行的进程。

④睡眠和唤醒

如:睡眠事件可能是从文件I/O读更多数据,或尝试读取一个已经被占用的信号量等。

四、抢占

1、用户抢占:

  • 从系统调用返回用户空间时候
  • 从中断处理程序返回用户空间时

2、内核抢占:只要没有锁,内核就可以抢占。

  • 中断处理程序正在执行,且返回内核空间前
  • 内核代码再一次具有可抢占性的时候
  • 如果内核中的任务显式的调用schedule()
  • 如果内核中的任务阻塞(这同样会导致调用schedule())

五、实时调度策略

实时调度策略被一个特殊的实时调度器管理。

1、SCHED_FIFO:比任何一个SCHED_NORMAL级的进程都先得到调度,一旦SCHED_FIFO级进程处于可执行状态,就会一直执行下去。直到它受阻塞或显示的释放处理器。不基于时间片。

2、SCHED_RR: 是带有时间片的SCHED_FIFO,当耗尽它的时间片后,在同一优先级的其他实时进程被轮流调度。

六、放弃处理器时间:

sched_yield()

猜你喜欢

转载自blog.csdn.net/qq_36183935/article/details/81279150