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

What is the difference between cooperative multitasking and preemptive multitasking?

最近我正在了解线程与纤程的不同之处。 This 回答说

Threads use pre-emptive scheduling, whereas fibers use cooperative scheduling.

为了获得有关协作式多任务处理与抢占式多任务处理的更多信息,SO 上没有具体的 post。希望这个问题对获取有关该主题的所有信息有所帮助。

简答:

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

合作:每个线程一旦运行决定保留CPU多长时间,以及(至关重要的)何时放弃它以便另一个线程可以使用它。

长答案

先发制人

这意味着线程无法控制何时 and/or 它们将使用 CPU 和 运行 多长时间。调度程序(OS 的一个组件)随时决定哪个线程可以 运行 以及哪个线程必须休眠。对于下一次线程 运行 会是什么以及持续多长时间,您没有强有力的保证。 这完全取决于调度程序。

合作

在协作式多任务处理中,调度程序无法决定线程何时可以 运行。每个线程决定它保留 CPU 的时间。如果它决定不与任何其他线程共享 CPU,则没有其他线程会 运行 导致所谓的 饥饿

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

协作式多任务处理非常适合嵌入式系统。 正如您通常会在 main.c 中创建一个事件处理程序,并且只让 IRQ 将标志传递给它,而不是实际上 运行 ISR 中的这个代码。 因此,如果您扩展事件处理程序以允许 RTC 计数器让每个任务休眠并告诉它在 1 毫秒或 60 秒后返回,这对电池寿命非常有用,因为即使只有 5 毫秒,您也要尽可能多地休眠。

你不能没有硬等待,所以你的任务必须像状态机一样, 告诉它立即返回或以 5 毫秒的间隔等返回。

我自己写的 OS 不到 1K 就可以做到这一点。