Структура потока, показанная на рис., содержит следующие категории информации.
Планирование: приоритет потока, приоритет планирования режима пользователя, недавнее использование процессора и количество времени, проведенного в состоянии сна.
Состояние потока: состояние выполнения потока (выполняющийся, спящий); дополнительные флаги состояния; если поток спит, канал ожидания, идентичность события, которого поток ожидает, и указатель на строку, описывающую событие.
· Машинное состояние: машинно-зависимая информация потока.
· ТСВ: состояния выполнения режимов пользователя и ядра.
· Стек ядра: стек выполнения потока для ядра.
Исторически стек ядра отображался в фиксированное положение виртуального адресного пространства. Причиной использования фиксированного отображения является то, что при выполнении родителем fork его стек времени выполнения копируется для его потомка. Если стек ядра отображен по фиксированному адресу, стек порожденного процесса отображается по тем же самым адресам, что и стек ядра его родителя. Таким образом, все его внутренние ссылки, такие, как указатели фреймов и ссылки на локальные переменные, работают ожидаемым образом.
На современных архитектурах с кешами виртуальных адресов отображение пользовательской структуры на фиксированные адреса является медленным и неудобным. FreeBSD 5.2 устраняет это ограничение, удаляя из стека порожденного процесса все фреймы вызова, кроме верхнего, после копирования его из родителя таким образом, что он возвращается непосредственно в режим пользователя, избегая тем самым копирования стека и проблем перемещения.
Каждый поток, который потенциально может быть запущен, должен иметь стек в резидентной памяти, поскольку одной из задач его стека является обработка отказов страниц. Если бы он не был резидентным, при попытке запуска потока возник бы отказ страницы, а доступного стека ядра для обслуживания отказа страницы не было бы. Поскольку в системе может быть несколько тысяч потоков, стек ядра должен поддерживаться небольшим, чтобы избежать чрезмерного расходования физической памяти. В FreeBSD 5.2 на PC стек ядра ограничен двумя страницами памяти. Разработчики должны быть осторожны при написании кода, выполняющегося в ядре, избегая использования больших локальных переменных и глубоко вложенных вызовов подпрограмм, чтобы не допустить переполнения стека времени выполнения. В качестве меры безопасности в некоторых архитектурах между областью стека времени выполнения и следующими за ней структурами данных оставляют недоступную страницу. Таким образом, переполнение стека ядра вызовет отказ доступа ядра вместо пагубной перезаписи других структур данных. Можно было бы просто завершить процесс, который вызвал отказ, и продолжить выполнение. Однако ядро FreeBSD на отказ доступа ядра входит в состояние паники, поскольку такой отказ обнаруживает существенную проектную ошибку в ядре. Путем паники и создания дампа ядра ошибку обычно можно идентифицировать и исправить.
- 14/09/2010 12:02 - Синхронизация с помощью мьютекса
- 13/09/2010 12:25 - Синхронизация
- 11/09/2010 16:42 - Добровольное переключение контекста
- 08/09/2010 09:38 - Переключение контекста на низком уровне
- 01/09/2010 05:13 - Переключение контекста
- 17/08/2010 04:52 - Планирование
- 17/08/2010 04:44 - Многозадачное программирование
- 14/08/2010 01:10 - Введение в управление процессами
- 13/08/2010 12:27 - Учет использования ресурсов
- 10/08/2010 06:42 - Ограничения ресурсов