Собственно, как осуществилась революция можно понять по следующему коду(из компилятора):
Код:
      
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} переменные для которых введен механизм подсчета ссылок.
Ну это я так понял, могу ошибаться, документации то нет. Но может у кого-то есть?