Потоки могут осуществлять взаимный обмен данными через совместно используемые глобальные переменные. API для работы с потоками предоставляет условные переменные
и мьютексы, являющиеся примитивами, позволяющими потокам процесса обмениваться данными и синхронизировать свои действия, в частности их использование общих переменных. Потоки могут также обмениваться друг с другом данными с применением IPC и механизмов синхронизации, рассмотренных в разделе 2.10. Основным преимуществом использования потоков является упрощение обмена данными (через глобальные переменные) между сотрудничающими потоками. Кроме того, некоторые алгоритмы более естественно преобразуются в многопоточные реализации, чем в варианты использования нескольких процессов. Помимо этого, многопоточные приложения могут легко воспользоваться преимуществами параллельной обработки на многопроцессорном оборудовании.
2.13. Группы процессов и управление заданиями в оболочке
Каждая программа, выполняемая оболочкой, запускается в новом процессе. Например, оболочка создает три процесса для выполнения следующего конвейера команд, который выводит на экран список файлов в текущем рабочем каталоге (список отсортирован по размеру файлов):
$ ls — l | sort — k5n | less
Все основные оболочки, за исключением Bourne shell, предоставляют интерактивные возможности, называемые управлением заданиями
. Они позволяют пользователю одновременно выполнять несколько команд или конвейеров и манипулировать ими. В оболочках, допускающих управление заданиями, все процессы в конвейере помещаются в новую группу процессов или в задание. (В простейшем случае, когда командная строка оболочки содержит только одну команду, создается новая группа процессов, включающая только один процесс.) Каждый процесс в группе процессов имеет одинаковый целочисленный идентификатор группы процессов. Он совпадает с идентификатором процесса одного из процессов группы, который называется лидером группы процессов.Ядро позволяет всем процессам, входящим в группу, выполнять различные действия, в особенности доставку сигналов. Оболочки, допускающие управление заданиями, применяют эту функцию, чтобы позволить пользователю, как показано в следующем разделе, приостанавливать или возобновлять все процессы в конвейере.
2.14. Сессии, управляющие терминалы и управляющие процессы
Сессией
называется коллекция групп процессов (заданий). У всех имеющихся в сессии процессов будет один и тот же идентификатор сессии. Ведущим в сессии является процесс, создающий сессию, а идентификатор этого процесса становится идентификатором сессии.Сессии в основном используются оболочками, допускающими управление заданиями. Все группы процессов, созданные такой оболочкой, принадлежат той же сессии, что и оболочка, являющаяся ведущим процессом сессии.
У сессий обычно имеется связанный с ними управляющий терминал
, который устанавливается, когда ведущий процесс сессии первый раз открывает терминальное устройство. Для сессии, созданной интерактивной оболочкой, это терминал, с которого пользователь вошел в систему. Терминал может быть управляющим для нескольких сессий.Вследствие открытия управляющего терминала ведущий процесс сессии становится для него управляющим процессом
. Если происходит отключение от терминала (например, если закрыто окно терминала), управляющий процесс получает сигнал SIGHUP.В любой момент времени одна из групп процессов в сессии является приоритетной группой (приоритетным заданием)
, которая может считывать ввод с терминала и отправлять на него вывод. Если пользователь набирает на управляющем терминале символ прерывания (обычно это Ctrl+C) или символ приостановки (обычно это Ctrl+Z), драйвер терминала отправляет сигнал, уничтожающий или приостанавливающий приоритетную группу процессов. У сессии может быть любое количество фоновых групп процессов (фоновых заданий), создаваемых с помощью символа амперсанда (&) в конце командной строки.Оболочки, допускающие управление заданиями, предоставляют команды для просмотра списка всех заданий, отправки заданиями сигналов и перемещением заданий между режимом первого плана и фоновым режимом.
2.15. Псевдотерминалы
Псевдотерминалом
называется пара подключенных виртуальных устройств, называемых ведущим (master) и ведомым (slave). Эта пара устройств предоставляет IPC-канал, позволяющий перемещать данные в обоих направлениях между двумя устройствами.