- •Державний комітет зв’язку та інформатизації України
- •Современные проблемы информационных сетей
- •Инструменты и ресурсы
- •Формат пакета ping.
- •Программа tracert в Windows.
- •Порядок вызова
- •Программа tcpdump (снифер) сетевой анализатор для поиска неисправностией в сети и отладки сетевых приложений.
- •Использование tcpdump
- •Выходная информация, формируемая tcpdump
- •Программа netstat
- •4. Интерфейсы
- •Маршрутная таблица
- •Статистика протоколов
- •Процессы
- •Типы процессов
- •Прикладные процессы
- •Атрибуты процессов
- •Реальный (rgid) и эффективный (egid) идентификаторы группы
- •Жизненный путь процесса
- •Сигналы
- •Взаимодействие между процессами
- •Организация каналов
- •Взаимодействие между процессами
- •Размер канала
- •Функции к разделу fifo
- •Пример приложения клиент-сервер, использующего fifo для обмена данными. Клиент посылает серверу сообщенияHello, а сервер выводит это сообщение на терминал.
- •Права доступа к объекту
- •Идентификаторы и имена в ipc
- •Tcp как потоковый протокол
- •Чтение длины записи
- •Функции разрешения имён
- •Преобразование имён хостов
- •Аккуратное размыкание соединение
- •Вызов shutdown
- •Алгоритм Найгла
- •Программная реализация архитектуры клиент – сервер
- •1.2 Разработка программ в архитектуре “клиент-сервер”
- •Заполнение адресной структуры и получение сокета
- •Привязка известного порта и вывод listen
- •Принятие соединения.
- •Обмен данными
- •Программный интерфейс сокетов
- •Сокеты во FreeBsd
- •Типы соединения
- •Адресация
- •Адресация Internet
- •Interface сокетов
- •Создание сокета
- •Програмныйинтерфейс сокетов
- •Поддержка различных типов сокетов в доменах
- •Пример использования сокетов
- •Sdl-описание протокола сеансового уровня эталонной модели взаимосвязи открытых систем
- •Основные понятия
- •Описание служб
- •Описание протоколов
- •Службы ядра сеансового уровня
- •Блок данных протокола
- •Ясо-описание протокола сеансового уровня
- •Разбиение блока сеансового протокола
- •Описание блока блк-дир
- •Описание блока блк-исп
- •Описание процессов дир и рдт
- •Описание процесса исп
Взаимодействие между процессами
С одной стороны процессы изолированы друг от друга, находясь в разных адресных пространствах. С другой стороны, они должны взаимодействовать:
Передавать данные
Совместно использовать данные
Извещать друг друга о наступлении какого-либо события
Механизмы взаимодействия сводятся к использованию:
Сигналов
Каналов,
например, Catmyfilewcоба процесса создаютсяshell
Стандартный вывод программы cat(1), которая выводит содержимое файлаmyfile, передается на стандартный ввод программыwc(1), которая подсчитывает количество строк, строк и символов. В результате получим
12 45 260
строк слов символов
Каналы могут использоваться для взаимодействия только родственных процессов.
Использовался программный канал, который обеспечил однонаправленнуюпередачу данных между двумя процессами.
FIFO – очень похож на каналы, но это именованный канал , как файл, например, программа“сервер”.
$mknodnamep– созданиеFIFOиз командной строки.
где pпрограмммаlsпокажет в первой позиции.
После создания FIFOможет быть открыт на запись и чтение, причем и то и другое может происходитьв разных процессах.
Организация каналов
Для создания канала используются системный вызов pipe(2);
int pipe(int*fildes); или int pipe(int filedes[2]);
fildes– переменная, может бытьfiledes.
Системный вызов pipe(2) возвращает два файловых дескриптора:fildes[0] для записи в канал,fildes[1] – для чтения из канала. Если один процесс записывает данные вfildes[0], то другой процесс может получить эти данные изfildes[1]. Сложность в том, как второй процесс сможет получить сам файловый дескрипторfildes[1].В случае неудачи возвращение – 1.
При создании процесса дочерний процесс наследует все назначенные файловые дескрипторы родительского процесса. Доступ к дескрипторам fildesканала может получить сам процесс, вызвавшийpipe(2) и его дочерние процессы. После создания канала с ним можно работать с помощью системных вызововreadwrite.
Рис. Создане канала между задачами cat(1) иwc(1)
Если в канал записать три сообщения, то считываться они будут в том же порядке
Каналы создаются заново и после обращения к ним процесса уничтожаются.
Буферизация данных в канале стандартно осуществляется путем выделения дискового пространства в структуре файловой системы. Таким образом, запись и чтение связаны с дисковым вводом/ выводом, что сказывается на его производительности. Современные ОС (серверные) обеспечивают работу каналов через специальную файловую систему HPPS(HighPerformancePipeSystem). С ее помощью данные буферизуются в ОЗУ, что ускоряет запись/ чтение.
Взаимодействие между процессами
В ОС UNIXпроцессы выполняются в собственном адресном пространстве и изолированы друг от друга. Это исключает ( сводит к минимуму) возможные влияния процессов друг на друга, что является необходимым в многозадачных ОС. Т.к. в то же время процессы должны взаимодействовать , то для реализации взаимодействия требуются:
Обеспечение средств взаимодействия
Исключить нежелательные влияния между ними
Взаимодействие между процессами необходимо для решения следующих задач:
Передача данных. Один процесс передает данные другому процессу, при этом объем передаваемых данных должен варьироваться от десятков байтов до нескольких Мбайтов.
Совместное использование данных.Вместо копирования данных от одного процесса к другому, они могут совместно использовать одну копию, причем изменения, сделанные одним процессом будут заметны для другого. Количество взаимодействующих процессов может больше двух. При совместном использовании ресурсов процессам может понадобиться протокол взаимодействия для сохранения целостности данных и исключения конфликтов между ними при доступе к данным.
Извещения.Процесс может известить другой процесс или группу процессов о наступлении события. Это может понадобиться для синхронизации выполнения нескольких процессов (сигналы, похожие на прерывания).
Задача взаимодействия между процессами решается силами ОС. В UNIXэто следующие средства:
Сигналы
Каналы
FIFO – именованные каналы
Сообщения (очереди сообщений)
Семафоры
Разделяемая память
Сокеты
Сигналы могут уведомлять об ошибках, для синхронизации процессов, для передачи простейших команд от одного процесса к другому, например, для сервераDNSnamed(1M) таким образом используется сигналSIGHUP, являющийся сигналом обновления базы данных.Сигналыочень ресурсоемки. Отправка сигнала требует системного вызова, а доставка – прерывания процесса-получателя и операций со стеком ( работа с подпрограммой). Сигналы малоинформативны и их число ограничено.
Каналы.На примере команды в командной строкеshellрассмотрим синтаксис организации программных каналов:
catmyfilewc
Стандартный вывод команды cat(1), которая выводит содержимое файлаmyfile, передается на стандартный ввод программыwc(1), которая подсчитывает количество строк,слов и символов. В результате получается:
12 45 260 –
количество строк, слов, символов в myfile
Таким образом, два процесса обменялись данными. При этом использовался программный канал, обеспечивающий однонаправленную передачу данных между двумя задачами.
Для создания канала используется системный вызов pipe(2):
int pipe( int * fildes), иначе int pipe(int filedes[2]);
который возвращает два файловых дискриптора – fildes[0] для записи в канал и fildes[1] для чтения из канала( если неудача, вызов pipe вернет – 1). Теперь один процесс записывает данные в fildes[0], другой может получить эти данные изfildes[1]. Как получает файловый дескрипторfildes[1] другой процесс? При создании процесса наследующие атрибуты дочерний процесс наследует и разделяет все назначенные файловые дескрипторы процесса родительского. Доступ к дескрипторамfiledesканала может получить сам процесс, вызвавшийpipe(2), и его дочерние процессы. Серьезный недостаток каналов в том, что они могут быть использованы для передачи данных только между родственными процессами и не могут быть использованы для передачи данных между независимыми процессами. В приведенном примере оба процессаcat(1) иwc(1) создаютсяshellи поэтому являются родственными.
Недостатком каналов является то, что они могут использоваться только для родственных процессов и не могут быть использованы для настоящих серверных программ ( серверы управления сетью и спулеры печати) и не могут существовать постоянно.
3. FIFO
Название каналов FIFO ( FirstInFirstOut, 1-м-вошел, 1-м-вышел). FIFO являются однонаправленными средствами передачи данных, причем чтение данных происходит в порядке их записи. FIFO имеют имена, которые позволяют взаимодействовать независимым процессам (именованные каналы).ВBSDне используются.FIFOявляется типом файлов (ls-lпокажет в первой позицииp). Для созданияFIFOиспользуется системный вызовmknod(2):
intmknod(char*pachname,intmode,intdev),
где pathname– имя файла в Ф.С.( имяFIFO),
mod– флаги владения прав доступа и тд.( полеmode).Например, 0666 –для всех права доступа на запись и чтение.
dev– при создании файла игнорируется.
FIFOможет быть создан и из командной строкиshell:
$ mkmodenamep
После создания FIFOможет быть открыт на запись и чтение, причем запись и чтение могут происходить в разных независимых процессах.
Каналы FIFOи обычные каналы работают по следующим правилам:
При чтении меньшего числа байтов, чем находятся в канале или FIFO, возвращается требуемое число байтов, остаток сохраняется для последующих чтений.
При чтении большего числа байтов, чем есть, возвращается доступное число байтов, а процесс, читающий из канала, должен обработать ситуацию, если прочитано меньше, чем заказано.
Если канал пуст и ни один процесс не открыл его на запись, при чтении из канала будет получено 0 байтов. Если канал открывали для записи, но не записали, то вызов read(2) будет заблокирован до появления данных, если в канале не установлен флаг отсутствия блокировки O_NDELAY.
Запись числа байтов, меньшего емкости канала или FIFO, гарантировано атомарно. Это означает, что в случае записи в канал одновременно несколькими процессами, порции данных не перемешиваются.
При записи большего числа байтов, чем это позволяет канал или FIFO, вызов write(2) блокируется до освобождения места. Атомарность при этом не гарантируется. Если процесс пытается записать данные в канал, не открытый ни одним процессом на чтение, процессу гарантируется сигнал SIGPIPE, а вызов write(2) возвращает 0 с установкой ошибки (errno=EPIPE), если процесс не установил обработки сигнала SIGPIPE, производится обработка по умолчанию – процесс завершается.