2.Система межпроцессного взаимодействия IPC 2.1.Состав, общие концепции 2.2.Очередь сообщений 2.3.Разделяемая память 2.4.Массив семафоров Взаимодействие.

Презентация:



Advertisements
Похожие презентации
Система межпроцессного взаимодействия IPC. Общие концепции #include key_t ftok ( char * filename, char proj ) filename строка, cодержащая имя файла proj.
Advertisements

Система межпроцессного взаимодействия IPC.. Система межпроцессного взаимодействия IPC. Состав. Очереди сообщений Семафоры Разделяемая память.
Система межпроцессного взаимодействия IPC.. Система межпроцессного взаимодействия IPC. Состав. Очереди сообщений Семафоры Разделяемая память.
Средства System V IPC Системные вызовы и библиотеки Unix SVR4.
Средства System V IPC Системные вызовы и библиотеки Unix SVR4 Иртегов Д.В. ФФ/ФИТ НГУ Электронный лекционный курс подготовлен в рамках реализации Программы.
Реализация взаимодействия процессов. Взаимодействие процессов взаимодействие в рамках локальной ЭВМ (одной ОС) взаимодействие в рамках сети родственные.
Инструкции C++ Условная инструкция Формат: if (условие) оператор; else оператор; Пример: if (i!=0) { if (j) j++; if(k) k++; else if(p) k--; } else i--;
Взаимодействие процессов: сокеты.
3. Механизм сокетов 3.1. Общие концепции 3.2. Интерфейсные функции для работы с сокетом Создание сокета Связывание и установление соединения.
Реализация взаимодействия процессов. Взаимодействие процессов взаимодействие в рамках локальной ЭВМ (одной ОС) взаимодействие в рамках сети родственные.
Современные операционные системы UNIX UNIX Linux Linux QNX QNX.
Реализация взаимодействия процессов. Взаимодействие процессов взаимодействие в рамках локальной ЭВМ (одной ОС) взаимодействие в рамках сети родственные.
ПРОГРАММИРОВАНИЕ/ ЯЗЫКИ ПРОГРАММИРОВАНИЯ Лекция 4 Работа с бинарными файлами (весенний семестр 2012 г.) Доцент Кафедры вычислительных систем, к.т.н. Поляков.
СИСТЕМНЫЕ ВЫЗОВЫ ВВОДА И ВЫВОДА Системные вызовы и библиотеки Unix SVR4.
СОКЕТЫ. СОКЕТ Сокет – программный интерфейс для обеспечения обмена данными между процессами. Впервые socket API появилась в BSD Unix. Описан в POSIX В.
Работа с файлами FILE НГТУ ИРИТ кафедра ИСУ Ольга Пронина.
Многопоточное программирование. Виды параллелизма. Общая память Распределенная память.
Параллельное программирование с использованием технологии MPI Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Лекция 4 Томский политехнический университет.
Функции Функция – именованная последовательность описаний и операторов, выполняющая некоторое действие. Может иметь параметры и возвращать значение. Функция.
Инструкции C++ Условная инструкция Формат: if (условие) оператор; else оператор; Пример: if (i!=0) { if (j) j++; if(k) k++; else if(p) k--; } else i--;
Транксрипт:

2.Система межпроцессного взаимодействия IPC 2.1.Состав, общие концепции 2.2.Очередь сообщений 2.3.Разделяемая память 2.4.Массив семафоров Взаимодействие процессов

Система межпроцессного взаимодействия IPC. Состав Очереди сообщений Семафоры Разделяемая память

Общие концепции Для именования объекта IPC используется уникальный ключ, по которому процессу возвращается дескриптор объекта Для каждого IPC-ресурса поддерживается идентификатор его владельца и структура ipc_perm (заголовочный файл ), описывающая Права доступа к нему (только две категории прав доступа по чтению и по записи) Информацию о создателе и владельце ресурса, их группе Его ключ

Общие концепции #include key_t ftok ( char * filename, char proj ) filename строка, cодержащая имя файла proj добавочный символ Необходимые заголовочные файлы и прототип Параметры

Общие концепции get ( key, …, flags ) создание/подключение Флаги cоздания/подключения: IPC_PRIVATE (доступность только породившему процессу) IPC_CREAT (создать новый или подключиться к существующему) IPC_EXCL ( + IPC_CREAT создание только нового) … Значения переменной errno при ошибках: ENOENT (ресурса нет и не указан флаг IPC_CREAT) EEXIST (ресурс существует и флаги IPC_EXCL | IPC_CREAT) EACCESS (нет прав на подключение) …

IPC: очередь сообщений 1.Общие концепции 2.Создание/доступ к очереди сообщений 3.Отправка сообщений 4.Получение сообщений 5.Управление очередью сообщений 6.Пример. Использование очереди сообщений 7.Пример. Очередь сообщений.Модель «клиент- сервер»

A BBB AAA Очередь сообщений Организация очереди сообщений по принципу FIFO Использование типов сообщений BAABABA AAAA BBB

Создание/доступ к очереди сообщений key уникальный идентификатор ресурса msgflag флаги, управляющие поведением вызова В случае успеха возвращается положительный дескриптор очереди, в случае неудачи возвращается –1. #include int msgget ( key_t key, int msgflag ) Необходимые заголовочные файлы и прототип Параметры Возвращаемое значение

Отправка сообщений msqid идентификатор очереди, полученный в результате вызова msgget() msgp указатель на буфер следующей структуры: long msgtype тип сообщения char msgtext[] данные (тело сообщения) #include int msgsnd ( int msqid, const void * msgp, size_t msgsz, int msgflg ) Необходимые заголовочные файлы и прототип Параметры

Отправка сообщений msgsz размер тела сообщения msgflg 0 процесс блокируется, если для посылки сообщения недостаточно системных ресурсов IPC_NOWAIT – работа без блокировки (возврат –1) #include int msgsnd ( int msqid, const void * msgp, size_t msgsz, int msgflg ) Необходимые заголовочные файлы и прототип Параметры

Получение сообщений msqid идентификатор очереди msgp указатель на буфер msgsz размер тела сообщения msgtyp тип сообщения, которое процесс желает получить #include int msgrcv ( int msqid, void * msgp, size_t msgsz, long msgtyp, int msgflg ) Необходимые заголовочные файлы и прототип Параметры

Получение сообщений msgflg побитовое сложение флагов IPC_NOWAIT если сообщения в очереди нет, то возврат –1 MSG_NOERROR разрешение получать сообщение, даже если его длина превышает емкость буфера #include int msgrcv ( int msqid, void * msgp, size_t msgsz, long msgtyp, int msgflg ) В случае успеха возвращает количество прочитанных байтов в теле сообщения. Необходимые заголовочные файлы и прототип Параметры Возвращаемое значение

Управление очередью сообщений msgid идентификатор ресурса cmd команда IPC_STAT скопировать структуру, описывающую управляющие параметры очереди по адресу, указанному в параметре buf IPC_SET заменить структуру, описывающую управляющие параметры очереди, на структуру, находящуюся по адресу, указанному в параметре buf IPC_RMID удалить очередь #include int msgctl ( int msqid, int cmd, struct msgid_ds * buf ) Необходимые заголовочные файлы и прототип Параметры

Управление очередью сообщений buf структура, описывающая параметры очереди. #include int msgctl (int msqid, int cmd, struct msgid_ds *buf) В случае успеха возвращается 0. Тип msgid_ds описан в заголовочном файле, и представляет собой структуру, в полях которой хранятся права доступа к очереди, статистика обращений к очереди, ее размер и т.п. Необходимые заголовочные файлы и прототип Параметры Возвращаемое значение

Пример. Использование очереди сообщений

Использование очереди сообщений int main ( int argc, char ** argv ) { key_t key; int msgid; char str [ 256 ] ; key = ftok ( "/usr/mash", s ) ; msgid = msgget ( key, 0666 | IPC_CREAT | IPC_EXCL ) ; for ( ; ; ) { gets ( str ) ; strcpy ( Message. Data, str ) ;... #include struct { long mtype ; char Data [ 256 ] ; } Message ; Основной процесс

... switch ( str [ 0 ] ) { case a : case A : Message. mtype = 1 ; msgsnd ( msgid, ( struct msgbuf * ) ( & Message ), strlen ( str ) + 1, 0 ) ; break ; case b : case B : Message. mtype = 2 ; msgsnd(msgid, ( struct msgbuf * ) ( & Message ), strlen ( str ) + 1, 0 ) ; break ; case q : case Q : Message. mtype = 1 ; msgsnd ( msgid, ( struct msgbuf * ) ( & Message ), strlen ( str ) + 1, 0 ) ; Message. mtype = 2 ; msgsnd ( msgid, ( struct msgbuf * ) ( & Message ), strlen ( str ) + 1, 0 ) ; sleep ( 10 ) ; msgctl ( msgid, IPC_RMID, NULL ) ; exit ( 0 ) ; default : break ; } Использование очереди сообщений Основной процесс

int main ( int argc, char ** argv ) { key_t key ; int msgid ; key = ftok ( "/usr/mash", s ) ; msgid = msgget ( key, 0666 ) ; for ( ; ; ) { msgrcv ( msgid, ( struct msgbuf * ) ( & Message ), 256, 1, 0 ) ; printf ( "%s", Message. Data ) ; if ( Message. Data [ 0 ] == q || Message. Data [ 0 ] == Q ) break ; } exit () ; } #include struct { long mtype ; char Data [ 256 ] ; } Message ; Использование очереди сообщений Процесс-приемник А

Пример. Очередь сообщений. Модель «клиент-сервер»

Модель «клиент-сервер» int main ( int argc, char ** argv ) {struct { long mestype ; char mes [ 100 ] ; } messageto ; struct { long mestype ; long mes ; } messagefrom ; key_t key ; int mesid ; #include Сервер key = ftok ( "example", r ) ; mesid = msgget ( key, 0666 | IPC_CREAT | IPC_EXCL ) ; while ( 1 ) { msgrcv ( mesid, & messagefrom, sizeof ( messagefrom ) – sizeof ( long ), 1, 0 ) ; messageto. mestype = messagefrom. mes ; strcpy ( messageto. mes, Message for client ) ; msgsnd ( mesid, & messageto, sizeof (messageto ) – sizeof ( long ), 0 ) ; } return 0 ; }

Модель «клиент-сервер» int main ( int argc, char ** argv ) { struct { long mestype; long mes; } messageto; struct { long mestype; char mes[100]; } messagefrom; key_t key; int mesid; #include Клиент long pid = getpid () ; key = ftok ( "example", r ) ; mesid = msgget ( key, 0666 ) ; messageto. mestype = 1 ; messageto. mes = pid ; msgsnd (mesid, & messageto, sizeof (messageto) – sizeof ( long ), 0 ) ; msgrcv ( mesid, & messagefrom, sizeof ( messagefrom ) – sizeof ( long ), pid, 0 ) ; printf ( "%s", messagefrom. mes ) ; return 0 ; }

IPC: разделяемая память 1.Создание общей памяти 2.Доступ к общей памяти 3.Открепление разделяемой памяти 4.Управление разделяемой памятью 5.Пример. Работа с общей памятью в рамках одного процесса

#include int shmget ( key_t key, int size, int shmflg ) Создание общей памяти key ключ для доступа к разделяемой памяти size размер области памяти shmflg флаги управляющие поведением вызова В случае успешного завершения вызов возвращает положительное число дескриптор области памяти, в случае неудачи –1. Необходимые заголовочные файлы и прототип Параметры Возвращаемое значение

#include char * shmat ( int shmid, char * shmaddr, int shmflg ) Доступ к разделяемой памяти shmid дескриптор области памяти shmaddr «адрес подключения» - адрес, начиная с которого необходимо подсоединить разделяемую память (>0 или =0) shmflg флаги, например, SHM_RDONLY подсоединяемая область будет использоваться только для чтения Возвращает адрес, начиная с которого будет отображаться при- соединяемая разделяемая память. При неудаче возвращается –1. Необходимые заголовочные файлы и прототип Параметры Возвращаемое значение

#include int shmdt ( char * shmaddr ) Открепление разделяемой памяти shmaddr адрес прикрепленной к процессу памяти, который был получен при вызове shmat() В случае успешного выполнения функция возвращает 0, в случае неудачи –1. Необходимые заголовочные файлы и прототип Параметры Возвращаемое значение

#include int shmctl ( int shmid, int cmd, struct shmid_ds * buf ) Управление разделяемой памятью shmid дескриптор области памяти cmd: IPC_STAT скопировать структуру, описывающую управляющие параметры области памяти IPC_SET заменить структуру, описывающую управляющие параметры области памяти, на структуру, находящуюся по адресу, указанному в параметре buf. IPC_RMID удалить SHM_LOCK, SHM_UNLOCK блокировать или разблокировать область памяти. buf структура, описывающая управляющие параметры области памяти. Необходимые заголовочные файлы и прототип Параметры

int main ( int argc, char ** argv ) { key_t key; char * shmaddr ; key = ftok ( /tmp/ter, S ) ; shmid = shmget ( key, 100, 0666 | IPC_CREAT | IPC_EXCL ) ; shmaddr = shmat ( shmid, NULL, 0 ) ; putm ( shmaddr ) ; shmctl ( shmid, IPC_RMID, NULL ) ; exit () ; } Пример. Работа с общей памятью в рамках одного процесса

IPC: массив семафоров 1.Создание/доступ к семафору 2.Операции над семафором 3.Управление массивом семафоров 4.Пример. Использование разделяемой памяти и семафоров

#include int semget ( key_t key, int nsems, int semflag ) Создание/доступ к семафору key уникальный идентификатор ресурса nsems количество семафоров semflag флаги Возвращает целочисленный идентификатор созданного разделяемого ресурса, либо -1, если ресурс не удалось создать. Необходимые заголовочные файлы и прототип Параметры Возвращаемое значение

#include int semop ( int semid, struct sembuf *cmd_buf, size_t nops ) Операции над семафором semid идентификатор ресурса cmd_buf массив из элементов типа sembuf nops количество элементов в массиве cmd_buf Необходимые заголовочные файлы и прототип Параметры

Операции над семафором struct sembuf {short sem_num ; /* номер семафора */ short sem_op ; /* операция */ short sem_flg ; /* флаги операции */ } Значение семафора с номером num равно val. Если sem_op 0 то если val+sem_op < 0 то пока !(val+sem_op 0) [процесс блокирован] val=val+sem_op Если sem_op = 0 то если val 0 то пока (val 0) [процесс блокирован] [возврат из вызова]

#include int semctl (int semid, int num, int cmd, union semun arg) Управление массивом семафоров semid дескриптор массива семафоров num номер семафора в массиве cmd операция IPC_SET изменить значение, параметры семафора IPC_RMID удалить массив семафоров и др. arg управляющие параметры Возвращает значение, соответствующее выполнявшейся операции (по умолчанию 0), в случае неудачи –1 Необходимые заголовочные файлы и прототип Параметры Возвращаемое значение

#include int semctl (int semid, int num, int cmd, union semun arg) Управление массивом семафоров union semun { int val ; /* значение одного семафора */ struct semid_ds * buf ; /* параметры массива семафоров в целом (количество, права доступа, статистика доступа)*/ unsigned short * array ;/* массив значений семафоров */ } Необходимые заголовочные файлы и прототип

Пример. Использование разделяемой памяти и семафоров

Использование разделяемой памяти и семафоров int main ( int argc, char ** argv ) { key_t key; int semid, shmid ; struct sembuf sops ; char * shmaddr ; char str [ NMAX ] ; key = ftok ( /usr/ter/exmpl, S ) ; semid = semget ( key, 1, 0666 | IPC_CREAT | IPC_EXCL ) ; shmid = shmget ( key, NMAX, 0666 | IPC_CREAT | IPC_EXCL ) ; shmaddr = shmat(shmid, NULL, 0 ) ; #include #define NMAX ый процесс

… semctl ( semid, 0, SETVAL, (int) 0) ; sops. sem_num = 0 ; sops. sem_flg = 0 ; do { printf( Введите строку: ) ; if ( fgets ( str, NMAX, stdin ) == NULL ) strcpy ( str, Q ) ; strcpy ( shmaddr, str ) ; sops. sem_op = 3 ; semop ( semid, & sops, 1 ) ; sops. sem_op = 0 ; semop ( semid, & sops, 1 ) ; } while ( str [ 0 ] != Q ) ; shmdt ( shmaddr ) ; shmctl ( shmid, IPC_RMID, NULL); semctl ( semid, 0, IPC_RMID, (int) 0) ; return 0 ; } Использование разделяемой памяти и семафоров 1-ый процесс

int main ( int argc, char ** argv ) { key_t key ; int semid, shmid ; struct sembuf sops ; char * shmaddr ; char str [ NMAX ] ; key = ftok ( /usr/ter/exmpl, S ) ; semid = semget ( key, 1, 0666 ) ; shmid = shmget ( key, NMAX, 0666 ) ; shmaddr = shmat ( shmid, NULL, 0 ) ; sops.sem_num = 0 ; #include #define NMAX 256 Использование разделяемой памяти и семафоров 2-ой процесс

sops.sem_flg = 0; do{ printf ( Waiting… \n ) ; sops. sem_op = –2 ; semop ( semid, & sops, 1 ) ; strcpy ( str, shmaddr ) ; if ( str [ 0 ] == Q ) shmdt ( shmaddr ) ; sops. sem_op = –1 ; semop ( semid, & sops, 1 ) ; printf ( Read from shared memory: %s\n, str ) ; } while ( str [ 0 ] != Q ) ; return 0 ; } Использование разделяемой памяти и семафоров 2-ой процесс