0:06
Здравствуйте! В данной лекции рассмотрим
такой механизм взаимодействия процессов,
как сокеты и каналы.
Сокеты — это программный интерфейс для обеспечения
обмена данными между процессами.
Сокет — абстрактный объект,
представляющий конечную точку соединения.
Они представляют собой интерфейс
между прикладными программами и сетевыми уровнями.
Термин "сокет" обозначает одновременно
библиотеку сетевых интерфейсов
и конечное устройство канала связи,
через которое процесс может передавать
или получать данные.
Эта точка связи представлена переменным
целым значением, аналогичным дескриптору файла.
Сокет-интерфейс представляет собой совокупность
примитивов, позволяющих управлять
обменом данными между процессами,
независимо от того, протекают эти процессы
на одной машине или нет.
Сокет-библиотека маскирует интерфейс
и механизмы транспортного уровня:
один сокет-вызов преобразуется
в несколько транспортных запросов.
Сокеты позволяют осуществить доступ к сети как к файлу.
При создании сокета указывается,
в какой области происходит работа:
UNIX-сокет, TCP/IP-сокет или другие.
Каждой области соответствует свой тип протокола.
Кроме того, задается тип, определяющий
свойства коммуникации.
Дейтаграммный — сообщения посылаются в форме дейтаграмм.
Связанный с ним протокол связи не является
таким надежным (нарушается последовательность,
возможны потери данных)
в режиме без установления логического соединения.
Например, UDP-протокол.
STREAM-сокет посылает потоки байтов,
понятие "сообщения" не вводится.
Используемый протокол связи надежен,
с установлением виртуального соединения,
как TCP области.
AF_INET и SOCK_RAW обеспечивают доступ
к протоколам самого низкого уровня, таким как IP
в области AF_INET, либо реализует новые протоколы.
1:50
Сокет-интерфейс можно использовать для связи
между двумя процессами на одной машине.
В этом случае необходимо указать,
что работа производится в локальной области.
Вызовы сокетов для различных областей одинаковые,
меняются только структуры, связанные с адресами.
Данное сходство вызовов позволяет достаточно легко
переходить от локальных задач к сетевым и обратно.
Использование в режиме с установлением
виртуального соединения.
Рассмотрим механизм взаимодействия через сокеты.
Он представлен на слайде.
Клиент. Создает сокет,
присоединяется к серверу,
предоставляя адрес удаленного сокета
(адрес Internet сервера и номер сервисного порта).
Это соединение автоматически присваивает
клиенту номер порта.
Осуществляет считывание или запись на сокет.
Закрывает сокет.
Сервер. Создает сокет.
Связывает сокет-адрес
(адрес Internet и номер порта)
с сервисной программой: "binding".
Переводит себя в состояние "прослушивания"
входящих соединений.
Для каждого входящего соединения принимает соединение
(создается новый сокет с теми же характеристиками,
что и исходный), считывает и записывает на новый сокет.
Закрывает новый сокет.
При работе с сокетами необходимо учитывать,
что некоторые вызовы способные заблокировать
дальнейшее выполнение программы.
Программный канал связи (pipe),
или, как его иногда называют, конвейер,
является средством, с помощью которого можно
обмениваться данными между процессами.
Принцип работы конвейера основан
на механизме ввода-вывода,
то есть задача, передающая информацию, действует так,
как будто она записывает данные в файл,
в то время как задача, для которой предназначается
эта информация, читает ее из этого файла.
Операции записи и чтения осуществляются не записями,
как это делается в обычных файлах, а потоком байтов.
По сути, канал представляет собой поток данных
между двумя (или более) процессами.
С точки зрения организации конвейеры
представляют собой буферную память,
работающую по принципу FIFO,
то есть по принципу обычной очереди.
Однако не следует путать конвейеры
с очередями сообщений.
Последние реализуются иначе и имеют другие возможности.
Конвейер имеет определенный размер
и работает циклически.
Добавление самого первого элемента в пустую очередь
приводит к тому, что указатели на начало и на конец
принимают значение, равное 1
(в массиве появляется первый элемент).
В последующем добавление нового элемента
вызывает изменение значения второго указателя,
поскольку он отмечает расположение
именно последнего элемента очереди.
Чтение элемента приводит к необходимости
модифицировать значение указателя на ее начало.
В результате операций записи (добавления)
и чтения (удаления) элементов в массиве,
моделирующем очередь элементов,
указатели будут перемещаться
от начала массива к его концу.
При достижении указателем значения индекса
последнего элемента массива
значение указателя вновь становится единичным
(если при этом не произошло переполнение массива,
то есть количество элементов в очереди не стало
большим числа элементов в массиве).
Можно сказать, что мы как бы замыкаем массив в кольцо,
организуя круговое перемещение указателей
на начало и на конец,
которые отслеживают первый и последний элементы в очереди.
Сказанное иллюстрирует слайд.
Именно так функционирует конвейер.
Как информационная структура конвейер описывается
идентификатором, размером с двумя указателями.
Конвейеры представляют собой системный ресурс.
Чтобы начать работу с конвейером,
процесс сначала должен заказать
его у операционной системы
и получить в свое распоряжение.
Процессы, знающие идентификатор конвейера, могут
через него обмениваться данными.
Читать из конвейера может только тот процесс,
который знает идентификатор
соответствующего конвейера.
При работе с конвейером данные непосредственно
помещаются в него.
Еще раз отметим, что
из-за ограничения на размер конвейера
программисты сталкиваются
и с ограничениями на размеры
передаваемых через него сообщений.