O Torvalds Linus

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

В качестве общего правила надо утверждать, что каждый контекст выполнения, который может быть запланирован к выполнению независимо, должен иметь собственный дескриптор процесса. Поэтому даже облегченные процессы, которые совместно используют значительную часть структур данных, обладают своими структурами типа task struct.

Строго однозначное соответствие между процессом и его дескриптором делает 32 – битовый адрес3 структуры task struct удобным для ядра средством идентификации процесса. Такие адреса называются указателями на дескрипторы процессов. Большинство ссылок на процессы в ядре делается с помощью указателей на дескрипторы.

С другой стороны, Unix – подобные операционные системы позволяют пользователям идентифицировать процессы с помощью числа, называемого идентификатором процесса (PID, Process ID), которое хранится в поле pid дескриптора процесса. Системный администратор может понизить предел, записав меньшее значение в файл /proc/sys/kemel/pid_max (/ргос —это точка монтирования специальной файловой системы, см. разд. “Специальные файловые системы” главы 12).

В 64 – разрядных архитектурах системный администратор может увеличить максимальный идентификатор процесса до 4 194 303.

При повторном использовании освободившихся идентификаторов процессов ядро поддерживает битовую карту pidmap array, которая показывает, какие идентификаторы в данный момент заняты, а какие —нет. Поскольку страничный кадр содержит 32 768 битов, в 32 – разрядных архитектурах битовая карта pidmap array занимает одну страницу. В 64 – разрядных архитектурах к битовой карте могут быть добавлены дополнительные страницы, если ядро присвоит процессу идентификатор, слишком большой для текущего размера битовой карты. Эти страницы уже не освобождаются.

Linux ассоциирует индивидуальный идентификатор с каждым процессом и облегченным процессом в системе. (Как мы увидим чуть позже в этой главе, в многопроцессорных системах существует маленькое исключение из этого правила.) Такой подход обеспечивает максимальную гибкость, потому что позволяет уникальным образом идентифицировать каждый контекст выполнения в системе.

С другой стороны, программисты в Unix хотели бы, чтобы у потоков в одной группе был общий идентификатор. Более того, стандарт POSIX 1003.1с требует, чтобы все потоки многопоточного приложения имели один идентификатор процесса.

Чтобы соответствовать этому стандарту, Linux работает с группами потоков. Идентификатор, общий для всех потоков —это идентификатор лидера группы потоков (то есть первого облегченного процесса в группе), хранящийся в поле tgid дескрипторов процесса. Системный вызов getpid () возвращает для текущего процесса значение tgid, а не pid, так что у всех потоков многопоточного приложения будет один идентификатор. Являясь лидерами своих групп, они имеют одинаковые значения в полях tgid и pid, и для них системный вызов getpid () работает как обычно.

Add A Comment