156
или же может быть сначала создан пул нитей, а затем новые нити
создаются из пула. Второй вариант обеспечивает более рациональное
использование ресурсов, в частности, меньшую фрагментацию памяти. В
первой реализации Менеджера Нитей поддерживалась вытесняющая
многопоточность в рамках невытесняющей многозадачности, но затем
дисциплину управления нитями сделали также кооперативной. Нить,
получившая процессорное обслуживание, может отдать его либо уступив
процессор любой нити (в этом случае готовые к выполнению нити
выбираются из очереди по дисциплине FCFS), либо уступив процессор
какой-то конкретной нити, либо просто изменив свое состояние на
ожидание. Отличие последнего случая от первых двух состоит в том, что
выполнение нити приостанавливается даже если нет других готовых
нитей. Пользователь имеет возможность также определить свою
процедуру диспетчеризации нитей, которая выполняется перед
выполнением системного планировщика.
Хотя при невытесняющей многозадачности в этом нет
необходимости, предусмотрены специальные системные вызовы – скобки
критической секции. Внутри критической секции просто игнорируются
выдаваемые нитью системные вызовы, уступающие процессор.
Интересной особенностью Mac OS является возможность создания
также пользовательских процедур переключения контекста для нитей. Для
каждой нити может быть создано две таких процедуры, одна из них
выполняется перед переключением контекста на другую нить, вторая – при
переключении контекста на данную нить.
Поскольку MasOS работает на двух разных аппаратных платформах,
имеются некоторые различия в форматах структур данных для платформ
M68K и PowerPC (например, в PowerPC роль регистра A5 играет другой
регистр), но эти различия не касаются качественной структуры и
алгоритмов обработки. Системы программирования для Mac OS позволяют