Ю. Вахалия - UNIX изнутри (2003) (1114670), страница 22
Текст из файла (страница 22)
Определите его интерфейс и синтаксис. Каким образом этот вызов будет поддерживать такие возможности системы, как перенаправление ввода-вывода, выполнение в интерактивном или фоновом режиме, а также каналы? Какие возникают проблемы при возврате ошибки от системного вызова ехес? Как эти проблемы решены ядром? Создайте функцию, позволяющую процессу ожидать завершения работы своего родителя (для любой реализации 1)Ь!1Х по вашему выбору). Представьте, что процессу не нужно блокироваться, пока не будет завершено функционирование его потомка.
Как можно убедиться в том, что потомок был удален из системы полностью после завершения? Почему завершившийся процесс будит своего родителя? Айвап, Е., «()Ы1Х: ТЬе Раса Еогпи», Ргосеег!!пйз о1 гЬе Ю!пгег 1987 1)5ЕЫ1Х ТесЬп!са! Соп1егепсе, )ап. 1987, рр. 9 — 15. АгпеНсап Те1ерЬопе апг! Те!ейгарЬ, «ТЬе Бузгев Ъ" 1пгег1асе Рейшйоп (5Ъ"1Р)», 1ззце 2, 1987. ВасЬ, М.
Я., «ТЬе Рез!яп о11Ье 1)1ч1Х Орегаг!п8 сумев», Ргепг!се-На!1, Епя!етчоог! СИЬ, Щ, 1986. Кегш8Ьап, В, Ъ',, апг! Р1Ье, К„«ТЬе 1)Ь!1Х Рго8гаппп!пя Епу!гопвепг», Ргепйсе-На11, Епй!етуоог! СИЬ, Щ, 1984. 1.ей)ег, 5. !., МсКцяс1с, М. К., Каге1я М. !., апг! Япаггегвап, ).
5., «ТЬе Рез!8п апг! 1вр!евепгаг!оп о1 гЬе 4.3 В5Р 1)Ь!1Х Орегаг!пя 5узгев», 96 Глава 2. Ядро и процессы 7. !пвг!гоге 1ог Е!есгг!са! апс! Е!есггоп!с Еп8!пеегя, РОЯ!Х Р1003Аа, ТЬгеай Ех1епв!оп !ог РоггаЫе Орегаг!п8 5увгепи, 1994. 8. 5а!еш1, С., БЬаЬ, 5., апд !.цпд, Е„вА Рг!ч!!е8е МесЬап!яп 1ог УЬ!!Х 8уягеш Ч Ке!евое 4 Орегаг!п8 8уяГетз», Ргосеейп8а о11Ье 8цштег 1992 178Е!41Х ТесЬшса! Соп1егепсе, !цп. 1992, рр. 235 — 241.
9. ТЬошряоп, К., 1!Ь!1Х 1тр!етепгас!оп», ТЬе Ве!! 5уясет ТесЬп!са! !оцгпа1, Чо!. 57, Ь!о. 6, Рагс 2, !ц!.— Ац8. 1978, рр. 1931 — 1946. Глава 3 Нити и легковесные процессы 3.1. Введение Технология использования процессов обладает двумя важными ограничениями. Прежде всего, некоторым приложениям необходимо выполнять несколько крупных независимых друг от друга задач, при этом используя одно и то же адресное пространство, а также другие ресурсы.
Примерами таких приложений являются серверные части систем обслуживания баз данных, мониторы прохождения транзакций, а также реализации сетевых протоколов среднего и верхнего уровня. Такие процессы должны функционировать параллельно— и, следовательно, для них должна применяться иная программная модель, поддерживающая параллелизм. Традиционные системы УХ!Х могут предложить таким приложениям либо выполнять отдельные задачи последовательно, либо придумывать неуклюжие и малоэффективные механизмы поддержки выполнения таких операций. Вторым ограничением применения традиционной модели является невозможность в полной мере задействовать преимущества многопроцессорных систем, так как процесс способен одновременно использовать только один процессор. Приложение может создать несколько отдельных процессов и выполнять их на имеющихся процессорах компьютера.
Необходимо найти методики, позволяющие таким процессам совместно использовать память и ресурсы, а также синхронизироваться друг с другом. Современные системы 11Х1Х предлагают решение приведенных проблем при помощи различных технологий, реализованных в ОС с целью поддержки параллельного выполнения заданий. К сожалению, скудость стандартной терминологии сильно усложняет задачу описания и сравнения большого количества существующих механизмов параллелизации. В каждом варианте 1Л~ПХ для их обозначения применяются свои термины, например нити ядра, прикладные нити, прикладные нити, поддерживаемые ядром, С-гйгеадв, рг1ггеасЬ и «легковесные» процессы (1!ВЬГые1ВЬС ргосеззез).
Эта глава классифицирует используемую терминологию, объясняет основные понятия и описы- 98 Глава 3. Нити и легковесные процессы вает возможности основных реализаций П1ч1Х. В конце главы вы увидите анализ преимуществ и недостатков описываемых механизмов, А начнем мы с рассмотрения важности и полезности технологии нитей. 3.1.1. Причины появления технологии нитей Многие программы выполняют отдельные крупные независимые задачи, которые не могут функционировать последовательно. Например, сервер баз данных находится в режиме приема и обработки множества запросов от клиентов. Так как поступающие запросы не требуется обрабатывать в каком-то определенном порядке, то их можно считать отдельными, независимыми друг от друга задачами, имеющими принципиальную возможность функционирования параллельно.
Если система позволяет выполнять параллельно отдельные задачи приложения, то его производительность существенно увеличивается. В традиционных системах У111Х такие программы используют несколько процессов. Большинство серверных приложений запускают процесс прослушивания, функция которого заключается в ожидании запросов клиентов. После поступления запроса процесс вызывает Гог1 для запуска нового процесса, обрабатывающего запрос клиента.
Так как эта задача часто требует проведения операций ввода-вывода, существует потенциальная возможность блокирования работы процесса, что даст некоторую степень одновременности выполнения даже на однопроцессорных системах. Представим еще одну ситуацию. Имеется некоторое научное приложение, вычисляющее значения различных элементов массива, каждый из которых независим от остальных. Для решения задачи можно создать отдельные процессы для каждого элемента массива и выполнять их параллельно, выделив для каждого процесса отдельную машину или процессор в многопроцессорной системе.
Однако даже на однопроцессорной машине имеет смысл разделить поставленную задачу между несколькими процессами. Если один из них заблокируется, ожидая окончания ввода-вывода или обработки ошибки доступа к страницам памяти, то другие в это время смогут продолжить функционирование. В качестве еще одного примера можно привести утилиту шзке системы ПХ1Х, позволяющую пользователям параллельно производить компиляцию нескольких файлов, при этом каждый их них будет обрабатываться в отдельном процессе. Использование приложением нескольких процессов имеет некоторые недостатки.
При их создании происходят значительные перегрузки системы, так как вызов 1огк является весьма затратным (даже в том случае, если применяется совместное использование адресного пространства при помощи техники копирования-при-записи). Каждый процесс находится в своем адресном пространстве, поэтому для взаимодействия между ними необходимо применять такие средства, как сообщения, или разделяемую память. Еще зл. Введение 99 больше затрат требуется на разделение процессов между несколькими процессорами или компьютерами, передачу информации между такими процессами, ожидание завершения и сбор результатов их работы.
В заключение необходимо также упомянуть о том, что система 01ч11Х не обладает необходимыми базовыми элементами для совместного использования таких ресурсов, как сетевые соединения и т. д. Применение подобной модели оправдано в тех случаях, когда преимушества одновременной работы процессов перекрывают расходы на их создание и управление. Приведенные примеры показывают неудобства модели процессов и необходимость применения более производительных средств параллельной обработки.
Мы можем теперь определить концепцию независимого вычислительного блока в качестве части общей задачи приложения. Такие блоки относительно мало взаимодействуют друг с другом и, следовательно, требуют малого количества действий по синхронизации. Приложение может содержать один или несколько блоков. Описываемый вычислительный блок называется нитью. Процесс в традиционной системе Б1ч11Х является однонитевым, то есть все действия в нем происходят последовательно.
Механизмы, обсуждаемые в этой главе, подчеркивают ограничения технологии процессов. Они, конечно, тоже имеют определенные недостатки, описание которых вы увидите в конце главы. 3.1.2. Нити и процессоры Преимущества многонитевых систем хорошо заметны, если такие системы сочетать с многопроцессорными архитектурами. Если каждая нить будет функционировать на отдельном процессоре, то можно говорить о настоягдей параллельности работы приложения. Если количество нитей превышает количество имеющихся процессоров, то такие нити должны быть мультиплексированы на эти процессоры'. В идеальном случае, если приложение имеет п нитей, выполняющихся на п процессорах, то однонитевая версия той же программы на однопроцессорной системе будет тратить на выполнение задачи в п раз больше времени.
На практике часть времени занимает создание, управление и синхронизация нитей, однако при использовании многопроцессорной системы эта величина стремится к идеальному соотношению. На рис. 3.1 показан набор однонитевых процессов, выполняющихся на однопроцессорной машине. Операционная система создает некоторую иллюзию одновременности при помощи выделения каждому процессу некоторого определенного промежутка времени для работы (квантование времени), после чего происходит переключение на следующий процесс.
В приведенном ' Это означает, что каждый процессор должен использоваться для обработки работающих нитей. Конечно, в один момент времени на одном процессоре может выполняться только одна нить. 100 Глава 3. Нити и легковесные процессы примере первые три процесса являются задачами серверной части клиентсерверного приложения, Серверная программа при поступлении каждого нового запроса запускает еще один процесс. Все процессы обладают схожими адресными пространствами и совместно используют данные при помощи механизмов межпроцессного взаимодействия.
Нижние два процесса созданы другим серверным приложением, адресное лроопренстео Яф и, Р' Процесс Время Рис. 3.1. Традиционная система цМХ: однонитееые процессы на однопроцессорной машине На рис. 3.2 представлены два сервера, реализованные на нитях. Каждый сервер представляет собой единый процесс, имеющий несколько нитей, разделяющих между собой единое адресное пространство. Переключение контекста нитей в рамках одного процесса может обрабатываться либо ядром системы, либо на уровне прикладных библиотек, в зависимости от версии ОС.
В обоих случаях в приведенном примере видны преимущества использования нитей, Исключение нескольких схожих адресных пространств приложений, порожденных для параллельной обработки чего-либо, сокращает нагрузку на подсистему памяти (даже при использовании современными системами такого метода разделения памяти, как копирование при записи, необходимо оперировать раздельными картами трансляции адресов для каждого процесса). Так как все нити приложения разделяют одно и то же адресное пространство, они могут использовать эффективные легковесные механизмы межнитевого взаимодействия и синхронизации.