Многозадачность (мультитаскливость:)
Всё относительно тривиально за мелкими исключениями.
Интерпретируемые нити
Это просто отдельные копии интерпретатора, работающие каждая со своим состоянием. Каждая из них время от времени исполняет 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).