linux抢占发生的时间,抢占分为用户抢占和内核抢占。
用户抢占在以下情况下产生:
l 从系统调用返回用户空间
l 从中断处理程序返回用户空间
内核抢占会发生在:
l 当从中断处理程序返回内核空间的时候,且当时内核具有可抢占性;
l 当内核代码再一次具有可抢占性的时候。(如:spin_unlock时)
l 如果内核中的任务显式的调用schedule()
l 如果内核中的任务阻塞。
基本的进程调度就是发生在时钟中断后,并且发现进程的时间片已经使用完了,则发生进程抢占。通常我们会利用中断处理程序返回内核空间的时候可以进行内核抢占这个特性来提高一些I/O操作的实时性,如:当I/O事件发生的是时候,对应的中断处理程序被激活,当它发现有进程在等待这个I/O事件的时候,它会激活等待进程,并且设置当前正在执行进程的need_resched标志,这样在中断处理程序返回的时候,调度程序被激活,原来在等待I/O事件的进程(很可能)获得执行权,从而保证了对I/O事件的相对快速响应(毫秒级)。可以看出,在I/O事件发生的时候,I/O事件的处理进程会抢占当前进程,系统的响应速度与调度时间片的长度无关。