Собственно, как осуществилась революция можно понять по следующему коду(из компилятора):
Код:
PROCEDURE VisitWhileStatement(x: SyntaxTree.WhileStatement);
VAR start: Label; true,false: Label;
BEGIN
IF Trace THEN TraceEnter("VisitWhileStatement") END;
IF cooperativeSwitches THEN EmitCooperativeSwitch END;
start := NewLabel();
true := NewLabel();
false := NewLabel();
SetLabel(start);
Condition(x.condition,true,false);
SetLabel(true);
StatementSequence(x.statements);
IF cooperativeSwitches THEN EmitCooperativeSwitch END;
BrL(start);
SetLabel(false);
IF Trace THEN TraceExit("VisitWhileStatement") END;
END VisitWhileStatement;
Т.е. в нужных местах компилятор генерирует код переключения. Переписывать приложения в кооперативном стиле не нужно, т.е. не требуется ручная передача управления и специальное проектирование приложений.
При этом, в рамках одного ядра действует кооперативная многозадачность, но ядер может быть не одно, естественно, все может распараллеливаться и, видимо, есть балансировка нагрузки на ядра.
Введено понятие виртуальных процессоров, на которые,видимо, и происходит планирование, затем они связываются с реальным процессором/ядром.
Есть {DISPOSABLE} переменные для которых введен механизм подсчета ссылок.
Ну это я так понял, могу ошибаться, документации то нет. Но может у кого-то есть?