这章的主要内容是进程调度相关知识,下面我们来看本章总结:
多任务操系统分为两类:
- 非抢占式多任务
- 抢占式多任务
Linux同Unix一样,提供了抢占式的多任务模式,这种模式是由调度器来决定什么时候停止一个进程。
Linux的进程调度使用了CFS算法进行调度。
进程的类型一般分为两类:
- I/O消耗类型(I/O型)
- 处理器消耗类型(计算密集型)
调度策略的主要目标:在两个矛盾间寻找平衡点,即进程快速响应和最大系统利用率。
那么CFS调度策略是怎样找到这个平衡点的?
在CFS调度器调度进程时,没有将时间片直接分配给进程,而是将处理器的使用比划分给进程,这样一来,进程执行所获得的处理器时间和系统负载密切相关,这也是Linux的调度策略同其它操作系统不同之处。(CFS算法实现喜欢的童鞋可以再看看,其中CFS使用红黑树来组织进程)
睡眠和唤醒:
睡眠通过等待队列进行处理,等待队列是由某些时间发生的进程组成的简单链表。
唤醒时,会将此进程放入红黑树中,通常哪段代码促使唤醒条件达成,它就负责随后的唤醒操作。
在进程调度中还有两个重要的概念,那就是:抢占和上下文切换
首先,我们先来看上下文切换,就是从一个可执行进程切换到另一个可执行进程,这其中要完成两个步骤的工作:
1.调用switch_mm()函数,该函数作用是将虚拟内存从上一个进程映射切换到新进程中。
2.调用switch_to()函数,该函数将处理器状态进行切换,包括:保存,恢复栈信息,寄存器信息,还有其它关联信息。
下面是抢占,抢占分为用户抢占和内核抢占:
1.用户抢占:内核即将返回用户空间的时候会产生抢占,因为此时内核进程知道自己是安全的,即可以发生抢占。
2.内核抢占:Linux完整的支持内核抢占,只要重新调度是安全的,内核就可以在任何时间抢占正在执行的任务,怎样才算重新调度安全?只要没有持有锁就都是安全的,锁是非抢占区域的表示。我们多线程编程中加锁也是同样道理。
这一章我们了解了内核进程调度的过程和一些概念信息。