Читать книгу 📗 "Операционная система UNIX - Робачевский Андрей Михайлович"
clnt_addr.sun_family = AF_UNIX; strcpy(clnt_addr.sun_path, "/tmp/clnt.XXXX"); mktemp(clnt_addr.sun_path); caddrlen = sizeof(clnt addr.sun_family) + strlen(clnt_addr.sun_path); if (bind(sockfd, (struct sockaddr*)&clnt_addr, caddrlen) < 0) { printf("Ошибка связывания сокетаn"); exit(1); } /* Итак, отправляем сакраментальное приветствие */ msglen = strlen(msg); if (sendto(sockfd, msg, msglen, 0, (struct sockaddr*)&serv addr, saddrlen) != msglen) { printf("Ошибка передачи сообщенияn"); exit(1); } /* Прочитаем эхо*/ if ((n = recvfrom(sockfd, buf, MAXBUF, 0, NULL, 0)) < 0) { printf("Ошибка получения сообщенияn"); exit(1); } /* И выведем его на экран */ printf("Эхо: %sn", buf); /* Уберем за собой */ close(sockfd); unlink(clnt_addr.sun_path); exit(0);}Сравнение различных систем межпроцессного взаимодействия
Заканчивая разговор о межпроцессном взаимодействии в UNIX, приведем сводную сравнительную таблицу рассмотренных систем.
| Каналы | FIFO | Сообщения | Разделяемая память | Сокеты (домен UNIX) | |
|---|---|---|---|---|---|
| Пространство имен | — | Имя файла | Ключ | Ключ | Имя файла |
| Объект | Системный канал | Именованный канал | Очередь сообщений | Разделяемая область памяти | Коммуникационный узел |
| Создание объекта | pipe() | mknod() | msgget() | shmget() | socket() |
| Связывание | pipe() | open() | msgget() | shmat() | bind() connect() |
| Передача данных | read() write() | read() write() | msgrcv() msgsnd() | Непосредственный доступ memcpy() | read() write() recv() send() recvfrom() sendto() |
| Уничтожение | close() | close() unlink() | msgctl() | shmdt() | close() unlink() |
Если говорить о производительности IPC, то наиболее быстрым способом передачи данных между неродственными процессами является разделяемая память. Разделяемая память является частью адресного пространства для каждого из взаимодействующих процессов, поэтому чтение и запись в эту область неотличимы, например, от чтения и записи в область собственных данных процесса. Однако при использовании разделяемой памяти необходимо обеспечить синхронизацию процессов. При использовании семафоров, необходимо иметь в виду следующие обстоятельства:
□ Применение семафоров может увеличить число процессов в очереди на выполнение, поскольку несколько процессов, ожидающих разрешающего сигнала семафора, будут одновременно разбужены и переведены в очередь на выполнение.
□ Применение семафоров увеличивает число переключений контекста, что, в свою очередь, увеличивает нагрузку на систему.
□ В то же время, использование семафоров является наиболее стандартным (POSIX.1b), хотя и неэффективным способом обеспечения синхронизации.
Очереди сообщений предназначены для обмена короткими (обычно менее 1 Кбайт) структурами данных. Если объем данных превышает эту величину, использование сообщений может значительно увеличить число системных вызовов и уменьшить производительность операционной системы.
Интенсивность межпроцессного взаимодействия в системе можно определить с помощью команды sar -m. Вывод команды показывает число использования объектов IPC в секунду:
17:47:53 msg/s sema/s17:47:58 0.20 20.0017:48:03 0.60 12.2017:48:08 2.20 10.4017:48:13 0.80 25.1017:48:18 0.00 15.60Average 0.76 16.66Заключение
В этой главе начато обсуждение внутренней архитектуры ядра UNIX, которое будет продолжено в следующих главах. Поскольку процессы являются движущей силой операционной системы, мы начали обсуждение именно с этого вопроса. Действительно, не считая нескольких системных процессов, являющихся частью ядра и выполняющих узкосистемные функции, основная работа операционной системы происходит по запросам и в контексте прикладных процессов.
В главе обсуждается, каким образом прикладной процесс взаимодействует с ядром операционной системы, как происходит справедливое распределение системных ресурсов между задачами, и тем самым обеспечивается многозадачность UNIX. Также рассматриваются принципы организации виртуальной памяти, когда каждый процесс имеет независимое адресное пространство, размер которого в ряде случаев значительно превышает объем оперативной памяти компьютера. Наконец, здесь представлены структуры данных ядра, связанные с управлением процессами и памятью.