Многозадачность (мультитаскливость:)

Всё относительно тривиально за мелкими исключениями.

Интерпретируемые нити

Это просто отдельные копии интерпретатора, работающие каждая со своим состоянием. Каждая из них время от времени исполняет native-код процессора -в методах встроенных классов. Состояние интепретации или исполнения родного кода ничем принципиально для подсистемы многозадачности не отличаются.

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

Системные нити

Некоторое количество нитей исполняется в подземелье для исполнения его кода. Это пейджер (одна или две нити для ленивых swapin/swapout), генератор срезов (формирование среза идёт без остановки работы системы), сборщик мусора (тоже параллельно).

Прерывания

Во время прерывания переключение задач не происходит, выполняется код, заявленный в качестве обработчика прерывания. Как правило это - метод какого-либо объекта. Может быть встроенным, может быть интерпретируемым.

Приоритеты.

Классы приоритетов:

имя разновидность значение
sys_timecritical realtime 40-4F
timecritical realtime 30-3F
normal timeshared 20-2F
idle idle 10-1F
sys_idle idle 00-0F

Приоритеты реального времени гарантируют нити, что пока она готова к исполнению ни одна нить с меньшим приоритетом (см. значение) не будет исполняться. Приоритеты вида idle гарантируют нити, что пока есть готовые к исполнению нити с большим приоритетом, она не будет исполняться.

Обычные приоритеты (20-2F) конкурируют между собой за процессор более мягко - нить с приоритетом 2F получает в 4 раза больше процессора, чем с приоритетом 28.

Кстати, именно 0x28 - приоритет по умолчанию.

Возможные проблемы

Если нить с большим приоритетом по какой-то причине ждёт нить с маленьким приоритетом, то не стоит ли второй давать большой приоритет на это время? Правомерно ли это?

Переключение контекста

Контексты хранятся в объектах типа нить. Это, кстати, гарантирует простоту рестарта - загрузил нитями шедулер, и поехали...

Нить

class phantom_thread {

cpu_state cpu;

interpreter_state interp;

phantom_priority prio;

scheduler_stats stat;

};

 

 

Сигналы

Предложение: Nikita V. Belenki: signal -- это не exception, а вызов процедуры/метода объекта на верхушке стека треда. Захочет -- откатится (кинет exception -- dz).

 

 

Используются технологии uCoz