Как работает совместная многозадачность?

Я прочитал этот фрагмент текста в Википедии:

Поскольку совместная многозадачная система полагается на каждый процесс регулярно , отдавая время другим процессы в системе, одна плохо спроектированная программа может занять все время процессора для себя или привести к зависанию всей системы.

Из любопытства, как можно отказаться от этого времени? Это какой-то вызов ОС? Давайте подумаем о случаях без вытеснения, таких как оптоволокно или даже организованный ввод-вывод, которые выполняют совместную многозадачность. Как они отказываются от этого времени?

Возьмем этот пример NodeJS :

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

Мне очевидно, что процесс ничего не делает, пока ожидает данных, но как V8 в этом случае отказаться от времени для других процессов?

Предположим, что Linux / Windows является нашей ОС.

Редактировать: Я выяснил, как Google делает это с их V8.

В Windows они в основном спят нулевое время:

void Thread::YieldCPU() {
  Sleep(0);
}

А в Linux они делают вызов ОС:

void Thread::YieldCPU() {
  sched_yield();
}

из sched.h .

7
задан skaffman 29 June 2011 в 16:24
поделиться