Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
17
Добавлен:
01.05.2014
Размер:
7.32 Mб
Скачать

Министерство образования Российской Федерации

Санкт-Петербургский государственный электротехнический

университет «ЛЭТИ»

Кафедра МОЭВМ

Отчёт по лабораторной работе №4

«Средства межпроцессного обмена данными»

Выполнил : Белов Д.А.

Группа : 3341

Санкт-Петербург

2006 г.

1. Введение

1.1. Постановка задачи.

Цель работы: Изучить средства предоставляемые ОС для обмена данными через границы процессов (inter-process).

1.2.Формулировка задачи

Разработать программы демонстрирующие работу сервера

К серверу может присоединяться более одного клиента.

На компьютере может находиться не более одного сервера.

    1. Программа «сервер»

      1. Принимает запросы на открытие канала

      2. Выводит в консоль события

    2. Программа «клиент»

      1. Инициирует передачу сообщения

      2. Запрашивает у сервера канал для передачи сообщений

      3. Передает сообщения.

      4. Завершает передачу

      5. Закрывает канал.

      6. В сообщениях передает ввод с консоли

1.3.Общие сведения

Семафоры

Для синхронизации процессов, а точнее, для синхронизации доступа нескольких процессов к разделяемым ресурсам, используются семафоры. Являясь одной из форм IPC, семафоры не предназначены для обмена большими объемами данных, как в случае FIFO или очередей сообщений. Вместо этого, они выполняют функцию, полностью соответствующую своему названию — разрешать или запрещать процессу спользование того или иного разделяемого ресурса.

Для получения доступа к семафору (и для его создания, если он не сущеествует) используется системный вызов semget. После получения дескриптора объекта процесс может производить операции над семафором, подобно тому, как после получения файлового дескриптора процесс может читать и записывать данные в файл. Для этого используется системный вызов semop

int semop (int semid, struct sembuf *sops, unsigned int nsops)

В качестве аргумента semid должен выступать идентификатор множества семафоров, предварительно полученный при помощи системного вызова semget.

Аргумент sops (массив структур) определяет, над какими семафорами будут выполняться операции и какие именно. Структура, описывающая операцию над одним семафором, определяется следующим образом:

struct sembuf {

  short sem_num; /* Номер семафора */

  short sem_op; /* Операция над семафором */

  short sem_flg; /* Флаги операции */

};

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

Выполняемая операция определяется следующим образом:

Положительное значение поля sem_op предписывает увеличить значение семафора на величину sem_op.

Отрицательное значение поля sem_op предписывает уменьшить значение семафора на абсолютную величину sem_op. Операция не может быть успешно выполнена, если в результате получится отрицательное число.

Нулевое значение поля sem_op предписывает сравнить значение семафора с нулем. Операция не может быть успешно выполнена, если значение семафора отлично от нуля.

Разделяемая память

Интенсивный обмен данными между процессами с использованием рассмотренных механизмов межпроцессного взаимодействия (каналы, FIFO, очереди сообщений) может вызвать падение производительности системы. Это, в первую очередь, связано с тем, что данные, передаваемые с помощью этих объектов, копируются из буфера передающего процесса в буфер ядра и затем в буфер принимающего процесса. Механизм разделяемой памяти позволяет избавиться от накладных расходов передачи данных через ядро, предоставляя двум или более процессам возможность непосредственного получения доступа к одной области памяти для обмена данными.

Примерный сценарий работы с разделяемой памятью выглядит следующим образом:

1. Сервер получает доступ к разделяемой памяти, используя семафор.

2. Сервер производит запись данных в разделяемую память.

После завершения записи сервер освобождает разделяемую память с помощью семафора.

4. Клиент получает доступ к разделяемой памяти, запирая ресурс с помощью семафора.

5. Клиент производит чтение данных из разделяемой памяти и освобождает ее, используя семафор.

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

int shmget ( key_t key, int size, int shmflg );

Первый аргумент для shmget() - это значение ключа (в нашем случае возвращен посредством вызова ftok()-а). Это значение ключа затем сравнивается с существующими значениями, которые находятся внутри ядра для других разделяемых сегментов памяти.

Системный вызов shmat()

int shmat ( int shmid, char *shmaddr, int shmflg );

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

Соседние файлы в папке Лабораторная работа №4