合作多任务如何工作?

Tow*_*wer 7 linux windows multitasking

我读了这篇维基百科的文章:

由于协同多任务系统依赖于每个进程定期给予系统上其他进程的时间,因此一个设计不良的程序可能会占用自身的所有CPU时间或导致整个系统挂起.

出于好奇,如何放弃那个时间?这是某种操作系统调用吗?让我们考虑一些非抢占式的情况,比如光纤或协议多任务执行的协议IO.他们如何放弃那段时间?

以此NodeJS为例:

var fs = require('fs');
fs.readFile('/path/to/file', function(err, data) {});
Run Code Online (Sandbox Code Playgroud)

对我来说很明显,这个过程在等待数据时什么都不做,但是在这种情况下V8如何为其他进程腾出时间?

我们假设Linux/Windows是我们的操作系统.

编辑:我发现谷歌是如何使用他们的V8做到这一点的.

Windows上,他们基本上睡眠零时间:

void Thread::YieldCPU() {
  Sleep(0);
}
Run Code Online (Sandbox Code Playgroud)

Linux上,他们进行操作系统调用:

void Thread::YieldCPU() {
  sched_yield();
}
Run Code Online (Sandbox Code Playgroud)

sched.h.

Kil*_*oth 4

是的,每个程序都参与操作系统的调度决策,因此您必须调用特定的系统调用来告诉内核接管。通常这被称为yield()。如果您想象一下保证定期、短时间间隔甚至根本不调用特定代码行有多么困难,您就会明白为什么协作多任务处理是次优解决方案。

在您的示例中,如果它是抢占式操作系统,则 JavaScript 引擎本身会被操作系统调度程序中断。如果它是一个合作性的,那么不,引擎不会完成任何工作,任何其他进程也不会完成任何工作。因此,此类系统通常不适合实时(甚至严重)工作负载。