协作式多任务处理与抢占式多任务处理有什么区别?

时间:2019-04-16 08:05:36

标签: operating-system multitasking

最近,我正在了解线与纤维的不同之处。 This答案表明

  

线程使用抢占式调度,而光纤使用协作式   安排。

为了获得有关协作式多任务与抢先式多任务的更多信息,SO上没有特定的文章。希望这个问题对获取有关该主题的所有信息有所帮助。

2 个答案:

答案 0 :(得分:1)

简短答案:

抢占式:线程不决定何时运行,而被迫共享CPU

合作:每个线程一旦运行,就决定将CPU保持多长时间以及何时将其放弃,以便另一个线程可以使用它。

长答案

抢先

表示线程在何时和/或要使用CPU多长时间内不受控制。调度程序(操作系统的组件)在任何时候决定哪个线程可以运行,哪个线程必须休眠。您无法保证线程下一次将运行什么时间以及运行多长时间。 这完全取决于调度程序。

合作社

在协作式多任务处理中,发生的事情是调度程序无法确定线程何时可以运行。每个线程决定将CPU保留多长时间。如果决定不与任何其他线程共享CPU,则不会运行其他线程,从而导致饥饿

请注意,停止一个线程并启动另一个线程会产生一定的开销。这意味着您花费时间和资源不是为了执行任务代码,而仅仅是为了允许CPU共享。 在某些实时情况下,这可能是完全不能接受的。

答案 1 :(得分:1)

协作式多任务处理对于嵌入式系统非常有用。 像通常在main.c中创建事件处理程序一样,仅让IRQ将标志传递给它,而不是在ISR中实际运行此代码。 因此,如果您将事件处理程序扩展为还允许RTC计数器让每个任务进入睡眠状态,并告诉它们在1毫秒或60秒内返回,那么这对于电池寿命非常有用,因为即使是5毫秒,您也要尽可能多地睡眠。

您不必辛苦,所以您的任务必须像状态机一样, 告诉它立即返回或每隔5毫秒返回一次。

我用不到1K的代码编写了自己的操作系统。