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

21

最近我在了解线程和纤程之间的区别。

这个回答说:

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

为了获取有关协作式多任务处理与抢占式多任务处理的更多信息,在SO上没有特定的帖子。希望这个问题能帮助获取关于该主题的所有信息。


基本上,你可以将强制性社区服务和志愿服务之间的差异视为相同。前者强制线程共享某些内容,而后者则将共享的选择留给单个线程,如果愿意,它可以永远保留资源。 - Davide Spataro
那么,建议在协作式多任务实时应用程序中使用吗? - Mayur
1
不,它的I/O性能很差。 - Martin James
我认为实际情况在某种程度上是中间的,不存在绝对的一方或另一方。真正的多任务系统将让你的代码相互协作,如果你的程序正常工作,但如果你的代码试图获取所有CPU资源,多任务系统将抢占并使代码休眠,并安排稍后执行。 - minus one
2个回答

40

简短回答:

抢占式:线程无法决定何时运行,被强制共享CPU

合作式:每个线程一旦运行,便决定了要使用CPU的时间长度,并且在必要时主动让出CPU,以便其他线程可以使用它。

详细回答

抢占式

这意味着线程不能控制何时和/或多久使用CPU并运行。操作系统的调度程序(OS的一个组件)在任何时刻都会决定哪个线程可以运行,哪个必须休眠。您无法保证下一个线程将何时运行以及持续多长时间。这完全由调度程序决定。

合作式

在协作式多任务处理中,调度程序没有发言权来决定线程何时可以运行。每个线程决定保持CPU使用的时间长度。如果它不与任何其他线程共享CPU,则不会运行其他线程,从而导致所谓的饥饿情况。

请注意,停止一个线程并启动另一个线程会产生一定的开销。这意味着您会花费时间和资源,而不是纯粹为了实现共享CPU而执行任务的代码。在某些实时低延迟应用程序(例如高频交易)中,这可能是不可接受的。


该主题上最好的答案之一。 - Arnab Mukherjee

2
合作式多任务处理对于嵌入式系统非常有用。通常情况下,您会在main.c中创建事件处理程序,并且只允许IRQ通过标志将其传递给此处理程序,而不是在ISR中实际运行此代码。因此,如果您将事件处理程序扩展到还允许RTC计数器使每个任务休眠并告诉它在1ms或60sec后回来,这将对节省电池寿命非常有益,因为您尽可能频繁地睡眠,即使只是5ms。

不能没有硬等待,因此您的任务必须像状态机一样,在立即返回或5ms间隔等方式下工作。

我自己编写了一个小于1K的操作系统来实现此功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接