Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Материалы по конспектам 2011.docx
Скачиваний:
13
Добавлен:
21.04.2019
Размер:
967.53 Кб
Скачать

43. Межпроцессные взаимодействия (ipc)

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

Каждый процесс работает изолированно в своём адресном пространстве.

Задачи IPC:

- передача данных между процессами;

- совместное использование данных (без копирования);

- синхронизация между процессами и потоками при использовании ресурсов.

Средства IPC:

- сигналы;

- неименованные каналы (pipe);

- именованные каналы (FIFO) – особый тип файла в ФС;

- очереди сообщений (messages queue);

- разделяемая память (shared memory) – управление посредством семафоров;

- семафоры;

- сокеты.

44. Каналы (pipe)

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

Системный вызов: int pipe(int *filedes);

filedes[0] – указатель на запись;

filedes[1] – указатель на чтение;

По сути, системный вызов вызывает 2 файловых дескриптора, которые позволяют открыть файл на запись и файл на чтение.

Эти каналы могут использоваться самим процессом и его потомками => pipes не подходят для взаимодействия между независимыми процессами. Используются только родственными процессами.

Работают медленно. Передача происходит через область памяти, которую выдаёт ФС (но она не является файлов, т.к. не видна извне и не именована). Возможна буферизация в рамках ОЗУ -> некоторое ускорение работы.

45. Fifo

В отличие от неименованных каналов (pipe) – возможен обмен данными не только между родственными процессами, так как буферизация происходит в рамках файловой системы с именованием -> cпециальный файл (тип FIFO). Чтение происходит в порядке записи.

Системный вызов: mknode(char *pathname, int mode, int dev);

*pathname – имя FIFO;

mode – флаги прав доступа;

Правила открытия канала на запись и чтение для независимых процессов:

1) при чтении n байт из N (n<N) системный вызов возвращает n байт, а остальное сохраняет до следующего чтения;

2) при чтении n байт из N (n<N) (n>N) возвращается N и происходит обработка прерывания;

3) если канал пуст, то возвращается 0 байт, если канал открыт на запись, то процесс будет заблокирован до того момента, пока не появится хотя бы 1 байт;

4) если в канал пишут несколько процессов, то информация не смешивается (у каждого свой буфер + использование tag’ов);

5) при записи, когда FIFO полон, процесс блокируется до тех пор, пока не появится место для записи.

При использовании FIFO не гарантируется атомарность операций.

Попытка записать в неоткрытый FIFO приводит к выработке сигнала SIGPIPE, который обрабатывается системой или программистом.

При записи FIFO работает как клиент-серверное приложение.

Функции сервера:

- создание FIFO (mknode());

- открытие FIFO на чтение (open());

- чтение сообщений (recv());

- запись сообщений (print());

- закрытие FIFO (close()).

Функции клиента:

- открытие FIFO на запись (open());

- запись сообщений для сервера в FIFO (send());

- закрытие FIFO (close()).

- удаление FIFO (rm()).