多线程的调度:
1. 调度时机:
a. 当前执行的进程进入非执行的状态。
b. 抢占的方式,进程运行时,非预期的被剥夺CPU的使用权,出现了更高优先级的进程。
内核抢占:理想情况下,只要满足出现了优先级更高的进程,当前进程就应该立刻被抢占,但是,就像多线程需要用锁来保护临界区资源一样,内核中也存在很多这样的临界区,不大可能随时随地接收抢占。linux 2.4时的设计就非常简单,内核不支持抢占。进程运行在内核态时(比如正在执行系统调用、正处于异常处理函数中),是不允许抢占的。必须等到返回用户态时才会触发调度(确切的说,是在返回用户态之前,内核会专门检查一下是否需要调度);linux 2.6则实现了内核抢占,但是在很多地方还是为了保护临界区资源而需要临时性的禁用内核抢占。
内核不能抢占的情况:
i. 内核正在进行中断处理
ii. 内核正在进行上下文切换
iii. 内核的代码段持有自旋锁和读写锁