引起进程调度的原因有以下几类
进程调度发生在什么时机呢?这与引起进程调度的原因以及进程调度的方式有关。
(1)正在执行的进程执行完毕。这时,如果不选择新的就绪进程执行,将浪费处理机资源。
(2)执行中进程自己调用阻塞原语将自己阻塞起来进入睡眠等状态。
(3)执行中进程调用了P原语操作,从而因资源不足而被阻塞;或调用了v原语操作激活了等待资源的进程队列。
(4)执行中进程提出I/O请求后被阻塞。
(5)在分时系统中时间片已经用完。
(6)在执行完系统调用等系统程序后返回用户进程时,这时可看作系统进程执行完毕,从而可调度选择一新的用户进程执行。
以上都是在可剥夺方式下的引起进程调度的原因。在CPU执行方式是可剥夺时.还有
(7)就绪队列中的某进程的优先级变得高于当前执行进程的优先级,从而也将引发进程调度。
两种占用CPU的方式
可剥夺式 (可抢占式preemptive):就绪队列中一旦有优先级高于当前执行进程优先级的进程存在时,便立即发生进程调度,转让处理机。
不可剥夺式 (不可抢占式non_preemptive):即使在就绪队列存在有优先级高于当前执行进程时,当前进程仍将占用处理机直到该进程自己因调用原语操作或等待I/O而进入阻塞、睡眠状态,或时间片用完时才重新发生调度让出处理机。
对内核线程来说,内核调度对象为线程;而对用户线程,内核是以进程作为调度对象,而非用户线程,用户线程在用户空间中实现,内核并没有直接对用户线程进程调度,内核的调度对象是进程,内核并不知道用户线程的存在。
在linux内核中,内核线程通常也叫内核进程,一个内核线程处于阻塞状态时不影响其他的内核线程(或者说是内核进程),但在用户空间时,用户进程中的某一个用户线程发生了阻塞,都会导致其所在进程的休眠。
补充:当进程阻塞时(包括内核线程),进程挂起,挂起的进程进入休眠状态。获取自旋锁失败时,不会阻塞,而是在一个死循环中检查资源是否可以得到,
循环等待并不代表阻塞。
阻塞操作是指,在执行设备操作时,若不能获得资源,则进程挂起直到满足可操作的条件再进行操作。
转载于:https://blog.51cto.com/yiluohuanghun/1304572