协作式多任务

协作式多工(Cooperative Multitasking),是一种多工处理方式,多工是使电脑能同时处理多个程序的技术,相对于抢占式多工(Preemptive multitasking)由作业系统决定任务切换时机。协作式多工要求每一个运行中的程序,定时放弃(yield)自己的执行权利,告知作业系统可让下一个程序执行[1][2],因为需要程序之间合作达到排程,故称作协作式多工。


在多工处理中,处理器(CPU)会在相对于用户来说极短的时间内,依次分配处理能力给不同的程序,以实现看似同时运行多个程序的效果。举例来说,当你同时使用浏览器浏览网页和播放MP3音乐时,CPU会快速切换处理能力,让你感觉网页在下卷时音乐仍在播放。然而,如果其中一个程序出现问题,例如因为设计不良或出现故障而无法释放执行权,这样的行为会导致整个作业系统停顿,甚至当机。因此,在开发软体时,需要注意程式的品质和稳定性,避免出现此类问题,以确保系统的稳定运行。

用途 编辑

尽管协作式多工排程在现代作业系统中很少用作主要的排程机制,但在受限制记忆体的嵌入式系统和特定应用程式(例如 CICSJES2英语JES2 子系统)中广泛使用。在 Windows 95Windows NT 之前以及Classic Mac OS 中,协作式多工排程是 16 位元应用程式的主要排程方式。Windows 9x使用非抢占式多工排程处理 16 位元应用程式,而 Mac OS X 的 PowerPC 版本在 Leopard 之前使用它处理经典应用程式。NetWare 是一个面向网络的作业系统,它在 NetWare 6.5 之前使用协作式多工排程。RISC OS 系统仍在使用合作式多工排程。

协作式多工排程与 await 在某些语言(例如 JavaScriptPython)中交互使用,这些语言的运行时特征是单执行绪事件循环。这与作业系统合作式多工排程形成对比,因为 await 只限于函数或块的作用范围,这意味著在单个函数等待时,程式码的其他部分可能会并行运行。在大多数现代语言中,async 和 await 被当作是coroutine

问题 编辑

作为一个协同多任务系统,依靠每个程序定期主动放弃执行给系统上的其他程序。一个设计不良的程序在执行大量计算、忙碌等待(busy waiting)可能消耗所有CPU时间,会导致整个系统无法动弹。在伺服器环境中,这是一个危险,使整个环境变得终止服务的漏洞。

相比之下,抢占式多任务可以中断应用程序并将控制权交给应用程序控制之外的其他进程。

使用watchdog程式可以避免系统当机的潜在问题,通常借由硬件实现。

协同多任务允许更简单与精巧的应用程序实作,因为它们的执行永远不会被进程调度程序意外中断。因此,不必要求每个函式都设计成可重入的。

参见 编辑

引用 编辑

  1. ^ Definition of non-preemptive multitasking. pcmag.com. [August 15, 2015]. (原始内容存档于2019-07-26). 
  2. ^ Joe Bartel. Non-Preemptive Multitasking (PDF). classiccmp.org. November 5, 2011 [August 15, 2015]. (原始内容存档 (PDF)于2019-08-19).