O Torvalds Linus

Сайт о *nix системах и всем что с ними связано

Процессы, создаваемые программой, находятся в отношениях ”родитель – потомок”. Когда процесс создает несколько потомков, между ними возникают отношения “братства”. Несколько полей в дескрипторе процесса отражают эти взаимоотношения. Они перечислены для некоторого процесса Р. Процессы 0 и 1 создаются ядром. Как мы увидим далее в этой главе, процесс 1 (называемый init) является предком всех остальных процессов.

Процесс РО последовательно создал процессы PI, Р2 и РЗ. Процесс может быть лидером в группе или в сеансе, он может быть лидером в группе потоков, а также он может отслеживать выполнение других процессов. Поля дескриптора процесса, которые определяют отношения между процессом Р и остальными процессами.

Таблица pidhash и цепные списки

При некоторых обстоятельствах ядро должно уметь вычислять указатель на дескриптор процесса по идентификатору процесса. Это бывает, например, при обслуживании системного вызова kill о. Когда процесс Р1 желает отправить сигнал процессу Р2, он делает системный вызов kill о, задавая в качестве параметра идентификатор процесса Р2. Ядро получает указатель на дескриптор процесса по его идентификатору, а затем извлекает из дескриптора процесса Р2 указатель на структуру, регистрирующую сигналы, ожидающие доставки.

Последовательный перебор списка процессов и проверка полей pid дескрипторов процессов —допустимое, но неэффективное решение. Для ускорения поиска были введены четыре хеш – таблицы. Зачем понадобилось несколько хеш – таблиц? Дело в том, что дескриптор процесса включает в себя поля, представляющие разные типы идентификаторов процессов, и каждому типу требуется своя хеш – таблица.

Эти четыре хеш – таблицы выделяются динамически на этапе инициализации ядра, и их адреса хранятся в массиве pid hash. Размер одной хеш – таблицы

зависит от объема доступной оперативной памяти. Например, для систем, имеющих 512 Мбайт памяти, каждая хеш – таблица хранится в четырех страничных кадрах и содержит 2048 записей.

Идентификатор процесса преобразуется в индекс таблицы с помощью макроса pid hashfn, который развертывается в следующий код:

define pid_hashfn(х) hash_long((unsigned long) x, pidhash_shift)

Переменная pidhash shift хранит длину индекса таблицы в битах (в нашем примере 11). Функция hash iongO используется многими хеш – функциями, и для 32 – разрядных архитектур она эквивалентна следующему коду:

unsigned long hash_long(unsigned long val, unsigned int bits)

(

unsigned long hash = val 0x9e370001UL; return hash » (32 —bits);

)

Поскольку в нашем примере значение pidhash shift равно 11, макрос pid hashfn возвращает значение от 0 до 211-1 = 2047.

Add A Comment