根据下面的帖子,总结下抢占的概念。
抢占并不等同与调度,应该说抢占是通过调度来实现的。
抢占发生在什么时候?
一般来说抢占发生在中断、系统调用返回或释放某些资源之后,比如:
(1)时钟中断,如果当前进程的时间片减少为0,则调用schedule()调度其他进程(我认为这种行为属于抢占)。
(2)调用wake_up类函数,在《linux设备驱动程序》中说“通常,被唤醒的进程可能会抢占当前进程,并在wake_up返回前被调度到处理器上”, 因此内核才提供了wake_up_interruptible_sync来确保原子的唤醒操作。
(3)创建一个子进程。
上述行为的共同特征是会设置need_resched标志,进程从中断或系统服务返回之前,都要检查这个标志,如果这个标志设置了,则调用schedule(),引发抢占。
但在《linux内核设计与实现》的第11章说“假定有一个正在运行的进程,它的时间片只剩下2ms了,此时调度程序又要求抢占该进程,然后去运行另一个进程;然而,该抢占行为不会在下一个时钟中断到来前发生,也就是说,在这2ms内不可能进行抢占。实际上,对于频率为100HZ的时钟来说,最坏要在10ms后,当下一个时钟中断到来时才能进行抢占”。
这段话像是说抢占只能发生在时钟中断到来时,但是这段话有一个奇怪的地方,如果我们能够感知到调度程序要求抢占某个进程,说明调度程序正在占用这某个CPU,既然占用这CPU,那么为什么不能调用schedule()重新调度呢?因此我觉得这段话的意思是“如果一个时间片只剩下2ms的进程只可能发生时间片用光的抢占,那么它最坏在10ms后才能被抢占”。
阅读(1660) | 评论(0) | 转发(0) |