协作式多任务
协作式多工(Cooperative Multitasking),是一种多工处理方式,多工是使电脑能同时处理多个程序的技术,相对于抢占式多工(Preemptive multitasking)由操作系统决定任务切换时机。协作式多工要求每一个运行中的程序,定时放弃(yield)自己的执行权利,告知操作系统可让下一个程序执行[1][2],因为需要程序之间合作达到调度,故称作协作式多工。
在多工处理中,处理器(CPU)会在相对于用户来说极短的时间内,依次分配处理能力给不同的程序,以实现看似同时运行多个程序的效果。举例来说,当你同时使用浏览器浏览网页和播放MP3音乐时,CPU会快速切换处理能力,让你感觉网页在下卷时音乐仍在播放。然而,如果其中一个程序出现问题,例如因为设计不良或出现故障而无法释放执行权,这样的行为会导致整个操作系统停顿,甚至死机。因此,在开发软件时,需要注意程序的质量和稳定性,避免出现此类问题,以确保系统的稳定运行。
用途
编辑尽管协作式多工调度在现代操作系统中很少用作主要的调度机制,但在受限制存储器的嵌入式系统和特定应用程序(例如 CICS 或 JES2 子系统)中广泛使用。在 Windows 95 和 Windows NT 之前以及Classic Mac OS 中,协作式多工调度是 16 比特应用程序的主要调度方式。Windows 9x使用非抢占式多工调度处理 16 比特应用程序,而 Mac OS X 的 PowerPC 版本在 Leopard 之前使用它处理经典应用程序。NetWare 是一个面向网络的操作系统,它在 NetWare 6.5 之前使用协作式多工调度。RISC OS 系统仍在使用合作式多工调度。
协作式多工调度与 await 在某些语言(例如 JavaScript 或 Python)中交互使用,这些语言的运行时特征是单线程事件循环。这与操作系统合作式多工调度形成对比,因为 await 只限于函数或块的作用范围,这意味着在单个函数等待时,代码的其他部分可能会并发运行。在大多数现代语言中,async 和 await 被当作是coroutine。
问题
编辑作为一个协同多任务系统,依靠每个程序定期主动放弃执行给系统上的其他程序。一个设计不良的程序在执行大量计算、忙碌等待(busy waiting)可能消耗所有CPU时间,会导致整个系统无法动弹。在服务器环境中,这是一个危险,使整个环境变得终止服务的漏洞。
相比之下,抢占式多任务可以中断应用程序并将控制权交给应用程序控制之外的其他进程。
使用watchdog程序可以避免系统死机的潜在问题,通常借由硬件实现。
协同多任务允许更简单与精巧的应用程序实现,因为它们的执行永远不会被进程调度程序意外中断。因此,不必要求每个函数都设计成可重入的。
参见
编辑引用
编辑- ^ Definition of non-preemptive multitasking. pcmag.com. [August 15, 2015]. (原始内容存档于2019-07-26).
- ^ Joe Bartel. Non-Preemptive Multitasking (PDF). classiccmp.org. November 5, 2011 [August 15, 2015]. (原始内容存档 (PDF)于2019-08-19).