Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учеб.пос.СП.doc
Скачиваний:
28
Добавлен:
31.03.2015
Размер:
1.33 Mб
Скачать
    1. Другие атрибуты процесса

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

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

Соответствующий процессу лимит размера файла может иметь меньшее значение, чем общесистемный лимит. Это предотвращает запись огромных файлов неопытными пользователями. Процесс суперпользователя может увеличить свой лимит.

    1. Межпроцессное взаимодействие

В системах Unix процессы могли взаимодействовать друг с другом, используя общие смещения в файлах, сигналы, трассировку процесса, файлы и каналы. Позднее в этот список были добавлены именованные каналы (FIFO), за которыми последовали семафоры, блокировки файлов, сообщения, общая память и сетевые сокеты.

Общие смещения в файлах редко используются для реализации межпроцессного взаимодействия. Один процесс может задать смещение, указывающее на некоторое место в файле, а второй процесс может узнать, куда оно указывает. Это смещение и было бы переданными данными. Чтобы совместно использовать смещение в файле, процессы должны быть связанными, поэтому они могут с тем же успехом воспользоваться каналами.

Если одному процессу нужно сообщить другому о каком-то событии, можно использовать сигналы. Например, спулер печати мог бы посылать сигнал процессу, выполняющему печать, при поступлении файла в очередь печати. Однако сигналы недостаточно информативны. Кроме того, сигнал прерывает работу процесса-получателя, что делает программирование более сложным в сравнении с подходом, при котором получатель принимает информацию, когда он готов к этому. Как правило, сигналы используются просто для завершения процессов или для информирования об очень необычных событиях.

Трассировка процесса позволяет родительскому процессу управлять выполнением дочернего процесса. Так как при этом родитель может читать и записывать данные дочернего процесса, оба процесса могут свободно взаимодействовать. Трассировка процесса используется только отладчиками, так как она слишком сложна и небезопасна для обычного применения.

Самой популярной формой межпроцессного взаимодействия является использование файлов. Например, мы можем записать файл при помощи редактора vi и затем выполнить его в интерпретаторе python. Однако если два процесса выполняются одновременно, файлы неудобны. Это имеет две причины: во-первых, процесс-читатель, работающий быстрее процесса-писателя, при достижении конца файла может решить, что взаимодействие завершено. Во-вторых, по мере взаимодействия процессов файл становится все больше и больше. Иногда процессы взаимодействуют многие дни, передавая друг другу миллиарды байтов. Файловая система может не справиться с такой нагрузкой.

При синхронизации файлов лучше использовать каналы. Канал не является разновидностью обычного файла, хотя он имеет, индексный узел и на него нет ссылок. Операции чтения и записи канала в целом похожи на чтение и запись файла, но имеет и некоторые важные отличия: если писатель отстает от читателя, читатель блокируется до появления данных. Если писатель намного обгоняет читателя, он блокируется и ждет читателя, поэтому ядру не приходится иметь дело с очень большими очередями. Наконец, как только какой-то байт прочитан, он уходит в небытие, так что при длительном выполнении процессов, соединенных посредством каналов, файловая система не переполняется.

Каналы хорошо известны пользователям командных оболочек. Например, команда ls | wc , позволяющая узнать число файлов, также используется канал. Ядро поддерживает гораздо более общие средства работы с каналами, чем командные оболочки.

Каналы имеют три основных недостатка:

  • процессы, взаимодействующие при помощи канала, должны быть родственными, т.е. они должны быть родителем и потомком или двумя потомками одного родителя. Это слишком жесткое ограничение: например, если один процесс является менеджером базы данных, а второй относится к приложению, которому нужно обращаться к базе данных, то этот подход непременим;

  • при записи блоков, объем которых превышает локально заданный максимум (скажем, 4096 байтов), атомарность операций не гарантируется. Это не позволяет использовать каналы при наличии нескольких процессов-писателей: их данные могут перемешаться;

  • быстродействие каналов может оказаться слишком низким, потому что данные пользовательского процесса-писателя копируются в структуры ядра, после чего передаются другому пользовательскому процессу-читателю. Никакой дисковый ввод-вывод при этом не выполняется, но копирование само по себе может оказаться слишком длительным для некоторых требовательных приложений.

Из-за этих недостатков были разработаны усовершенствованные методики межпроцессного взаимодействия.

Именованные каналы устраняют первый недостаток каналов. Именованный канал является специальным файлом, и любой процесс, имеющий такое право, может открыть его для чтения или записи. Именованные каналы не лишены второго и третьего недостатков каналов: они не исключают чередование при записи больших блоков данных и иногда работают слишком медленно.

Семафором называют счетчик, не позволяющий получить доступ к одному ресурсу сразу двум или более процессам.

Блокировка файла – специализированный семафор, не позволяющий сразу двум или более процессам, обратиться к тому же сегменту файла. Обычно она эффективна только в том случае, если процессы ее проверяют.

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

Общая память потенциально является самой быстрой технологией межпроцессного взаимодействия. Этот подход основан на отображении одной области памяти на адресные пространства двух или более процессов. Данные, записанные в общую память, сразу же становятся доступны процессам-читателям. Для синхронизации читателя и писателя используется семафор или сообщение.

Сетевое межпроцессное взаимодействие с использованием сокетов выполняется при помощи соответствующих системных вызовов, таких как bind, connect, accept. Сокеты позволяют взаимодействовать по локальной сети или Интернету с процессом, выполняемым на другом компьютере, причем этот компьютер может не быть Unix-системой. Он может работать под управлением Windows или другой ОС. Он даже может быть сетевым принтером.