Шрифт:
С помощью метода, аналогичного применяемому для сервера NTP, был изменен эхо-сервер UDP для работы с вводом-выводом, управляемым сигналом: мы стремимся выполнить чтение дейтаграммы как можно быстрее после ее прибытия, чтобы получить точную отметку времени прибытия и поставить дейтаграмму в очередь для дальнейшей обработки.
Упражнения
1. Далее приведен альтернативный вариант цикла, рассмотренного в листинге 25.2:
Верна ли такая модификация?
Глава 26
Программные потоки
26.1. Введение
Согласно традиционной модели Unix, когда процессу требуется, чтобы некое действие было выполнено каким-либо другим объектом, он порождает дочерний процесс, используя функцию
Хотя эта концепция с успехом использовалась на протяжении многих лет, с функцией
Стоимость функции
Для передачи данных между родительским и дочерним процессами послевызова функции
Обе проблемы могут быть разрешены путем использования программных потоков( threads). Программные потоки иногда называются облегченными процессами( lightweight processes), так как поток проще, чем процесс. В частности, создание потока требует в 10–100 раз меньше времени, чем создание процесса.
Все потоки одного процесса совместно используют его глобальные переменные, поэтому им легко обмениваться информацией, но это приводит к необходимости синхронизации.
Однако общими становятся не только глобальные переменные. Все потоки одного процесса разделяют:
инструкции процесса;
большую часть данных;
открытые файлы (например, дескрипторы);
обработчики сигналов и вообще настройки для работы с сигналами (действие сигнала);
текущий рабочий каталог;
идентификаторы пользователя и группы пользователей.
У каждого потока имеются собственные:
идентификатор потока;
набор регистров, включая счетчик команд и указатель стека;
стек (для локальных переменных и адресов возврата);
переменная
маска сигналов;
приоритет.
Как сказано в разделе 11.18, можно рассматривать обработчик сигнала как некую разновидность потока. В традиционной модели Unix у нас имеется основной поток выполнения и обработчик сигнала (другой поток). Если в основном потоке в момент возникновения сигнала происходит корректировка связного списка и обработчик сигнала также пытается изменить связный список, обычно начинается путаница. Основной поток и обработчик сигнала совместно используют одни и те же глобальные переменные, но у каждого из них имеется свой собственный стек.
В этой книге мы рассматриваем потоки POSIX, которые также называются Pthreads(POSIX threads). Они были стандартизованы в 1995 году как часть POSIX.1c и будут поддерживаться большинством версий Unix. Мы увидим, что все названия функций Pthreads начинаются с символов