Книга: Разработка ядра Linux
Хранение дескриптора процесса
Хранение дескриптора процесса
Система идентифицирует процессы с помощью уникального значения, которое называется идентификатором процесса (process identification, PID). Идентификатор PID
— это целое число, представленное с помощью скрытого типа pid_t
[12] , который обычно соответствует знаковому целому— int
.
Однако, для обратной совместимости со старыми версиями ОС Unix и Linux максимальное значение этого параметра по умолчанию составляет всего лишь 32768 (что соответствует типу данных short int
). Ядро хранит значение данного параметра в поле pid
дескриптора процесса.
Это максимальное значение является важным, потому что оно определяет максимальное количество процессов, которые одновременно могут существовать в системе. Хотя значения 32768 и достаточно для офисного компьютера, для больших серверов может потребоваться значительно больше процессов. Чем меньше это значение, тем скорее нумерация процессов будет начинаться сначала, что приводит к нарушению полезного свойства: больший номер процесса соответствует процессу, который запустился позже. Если есть желание нарушить в системе обратную совместимость со старыми приложениями, то администратор может увеличить это максимальное значение во время работы системы с помощью записи его в файл /proc/sys/kernel/pid_max
.
Обычно в ядре на задачи ссылаются непосредственно с помощью указателя на их структуры task_struct
. И действительно, большая часть кода ядра, работающего с процессами, работает прямо со структурами task_struct
. Следовательно, очень полезной возможностью было бы быстро находить дескриптор процесса, который выполняется в данный момент, что и делается с помощью макроса current. Этот макрос должен быть отдельно реализован для всех поддерживаемых аппаратных платформ. Для одних платформ указатель на структуру task_struct
процесса, выполняющегося в данный момент, хранится в регистре процессора, что обеспечивает более эффективный доступ. Для других платформ, у которых доступно меньше регистров процессора, чтобы зря не тратить регистры, используется тот факт, что структура thread_info
хранится в стеке ядра. При этом вычисляется положение структуры thread_info
, а вслед за этим и адрес структуры task_struct
процесса.
Для платформы x86 значение параметра current
вычисляется путем маскирования 13 младших бит указателя стека для получения адреса структуры thread_info
. Это может быть сделано с помощью функции current_thread_info()
. Соответствующий код на языке ассемблера показан ниже.
movl $-8192, %eax
andl %esp, %eax
Окончательно значение параметра current
получается путем разыменования значения поля task
полученной структуры thread_info
:
current_thread_info()->task;
Для контраста можно сравнить такой подход с используемым на платформе PowerPC (современный процессор на основе RISC-архитектуры фирмы IBM), для которого значение переменной current
хранится в регистре процессора r2
. На платформе PPC такой подход можно использовать, так как, в отличие от платформы x86, здесь регистры процессора доступны в изобилии. Так как доступ к дескриптору процесса — это очень частая и важная операция, разработчики ядра для платформы PPC сочли правильным пожертвовать одним регистром для этой цели.
- Манипулирование текущим состоянием процесса
- Контекст процесса
- Сущность процесса миграции
- Сохранение информации о пользователях при миграции
- V Совершенствование процесса
- Сохранение информации из Интернета
- Использование сервера Yaffil внутри процесса
- Хранение конфигурации в системном реестре
- 4. Стадии бизнес-процесса взаимодействия с клиентами
- Сохранение рабочей книги с именем, представляющим собой текущую дату
- 2.2.2.2 Состояния процесса
- 1.2 Процесс, контекст процесса и потоки