Operating system 合作式多任务处理和先发制人式多任务处理之间的区别是什么?

Operating system 合作式多任务处理和先发制人式多任务处理之间的区别是什么?,operating-system,multitasking,Operating System,Multitasking,最近我了解了线与纤维的区别。 答案是 线程使用抢占式调度,而光纤使用协作式调度 日程安排 为了获得更多关于协作式多任务处理和抢占式多任务处理的信息,没有专门的帖子。希望此问题有助于获取有关此主题的所有信息。简短回答: 抢占:线程不决定何时运行,而是被迫共享CPU 协作:每个线程一旦运行,就决定CPU保留多长时间,以及(关键的)何时放弃CPU以便另一个线程可以使用它 长话短说 先发制人 这意味着线程无法控制何时和/或使用CPU并运行多长时间。调度程序(操作系统的一个组件)随时决定哪个线程可以运行,

最近我了解了线与纤维的区别。 答案是

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

为了获得更多关于协作式多任务处理和抢占式多任务处理的信息,没有专门的帖子。希望此问题有助于获取有关此主题的所有信息。

简短回答: 抢占:线程不决定何时运行,而是被迫共享CPU

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

长话短说 先发制人

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

合作

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

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

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

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


我在Under1K中编写了自己的操作系统,它可以做到这一点。

在强制社区服务和志愿服务之间或多或少有着相同的区别。第一个线程迫使线程共享某些东西,第二个线程将共享的选择留给一个线程,如果需要的话,可以永远保持资源本身。因此,建议使用协作多任务实时应用吗?不,它有很糟糕的I/O性能。没有一个或另一个。如果你的程序工作正常,真正的多任务系统会让你的代码互相协作,但是如果你的代码试图获得所有的CPU资源,多任务系统会抢占并使代码休眠,并安排稍后执行。