Создание неименованного программного канала 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Создание неименованного программного канала



pipe(fdptr);

· fdptr - это указатель массива из двух целых чисел для размещения дескриптора для чтения из программного канала (с помощью read) и записи в программный канал (с помощью write)

· обычные дескрипторы файлов

· два элемента таблицы открытых файлов процесса

Создание именованных программных каналов (или получение доступа к существующим)

Обычный системный вызов open

· если канал открывается на запись, и ни один процесс не открыл его для чтения, то процесс блокируется до тех пор, пока некоторый процесс не откроет этот канал для чтения

· аналогично обрабатывается открытие для чтения

· имеется флаг NO_DELAY

Запись и чтение: read и write

· при записи данные помещаются в начало канала

· при чтении выбираются из конца канала

· возможны откладывания процессов

Окончание работы процесса: close - при выполнении последнего закрытия канала по записи все процессы, ожидающие чтения из программного канала, активизируются с возвратом кода ошибки из системного вызова

 

Семафоры

Семафоры – это целое число, которое может принимать два значения (0 – выкл., 1 – вкл.) или более значений. Т.е. позволяющие двум или более процессам получать информацию типа вкл./выкл. и др.

Например один процесс передает данные процессу2 и процесс1 уже передал, а процесс2 еще не успел получить, в это время процесс1 начал передавать уже другие данные, в результате процесс2 получит неверные или неполные данные. Для устранения этого недостатка используют семафор (один или несколько). Т.е. семафор посылает 0-выкл. или 1-вкл., т.е. позволяет или запрещает выполнение нового действия какого-либо процесса, иными словами передает разрешение или запрет права на чтение/запись.

Семафор может принимать и другие значения (не 0 или 1) и их может быть больше двух.

Семафор — это объект, имеющий два устойчивых состояния (рабочее и нерабочее) и используемый для синхронизации исполнения процессов. Семафор в ОС UNIX: значение семафора; идентификатор процесса, который хронологически последним работал с семафором; число процессов, ожидающих увеличения значения семафора; число процессов, ожидающих нулевого значения семафора. semop используется для манипулирования значениями семафоров. oldval = semop(id, oplist, count); где id - дескриптор группы семафоров, oplist - массив описателей операций над семафорами группы, count - размер этого массива. Oplist включает: номер семафора в указанном наборе, операцию, флаги. Переключение семафора зависит от значения поля «операция». Если оно положительно, то значение семафора увеличивается и все процессы, к.ожидали этого увеличения активизируются. Если равно нулю и при этом значение семафора равно нулю то выбирается другой элемент из списка oplist, если семафор не равен нулю, то число процессов ожидающих нулевого значения семафора увелич.на 1. Если значение поля «операция» отрицательно и по модулю равно значению семафора, то это отрицательное значение прибавляется к значению семафора; если значение семафора стало нулевым, то ядро активизирует все процессы, ожидающие нулевого значения этого семафора; а если значение семафора меньше абсолютной величины поля операции, то число процессов, ожидающих увеличения значения семафора увеличивается на единицу, текущий процесс откладывается

 

Сообщения

Сообщения – сложный механизм межпроцессного взаимодействия требующее реализации в ядре, это структура включающая в себя: ID сообщения (имя или тег сообщения) – число, адрес (ID процесса, либо ID очереди), отправитель, данные. Используются в Windows, UNIX и MacOS. Существует очередь (стек) сообщений.

Стандартное сообщение для передачи участка памяти другому процессу. Работает однонаправленно, принимающий процесс должен расценивать полученные данные как read only. Посылать это сообщение необходимо только с помощью SendMessage, которая (напомню) в отличие от PostMessage ждет завершения операции. Таким образом, посылающий поток "подвисает" на время передачи данных. Вы сами должны решить, насколько это приемлемо для вас. Это не имеет значения для небольших кусков данных, но для больших объемов данных или для real-time приложений этот способ вряд ли подходит.

Четыре системных вызова:

· msgget для образования новой очереди сообщений или получения дескриптора существующей очереди

· msgsnd для посылки сообщения (его постановки в очередь сообщений)

· msgrcv для приема сообщения (выборки сообщения из очереди)

· msgctl для выполнения управляющих действий

msgqid = msgget(key, flag);

Сообщения хранятся в виде связного списка

Декскриптор очереди сообщений - индекс в массиве заголовков очередей сообщений

Условия успешной постановки сообщения в очередь:

· процесс должен иметь право на запись в очередь

· длина сообщения не должна превосходить верхний предел

· общая длина сообщений не должна превосходить установленного предела

· тип сообщения должен быть положительным целым числом

Процесс продолжает свое выполнение

Ядро активизирует (пробуждает) все процессы, ожидающие поступления сообщений из очереди.

 

Гнезда

Синхронизация процессов и взаимоблокировки.

Гнездо = «розетка» + «вилка»

Чтобы два компьютера подготовили соединение, нужно:

  1. Функция создающая гнездо socket()
  2. Функция присваения ему имени bind()
  3. Функции использования Listen(), accept(), connect()

A) socket(тип сокета и протокол). Существует два типа гнезд – интернет гнезда и UNIX. Они отличаются разным наименованием сокета. В UNIX лучше использовать UNIX сокеты т.к. они лучше интегрируются с файловой системой.

Подтипы: с надежной и ненадежной передачей информации (TCP и UDP), с посимвоьной и блочной передачей информации. Протокол – TCP или UDP.

Б) bind() – присваивает символьное имя гнезду. Bind(дескриптор сокета, структура описывающая сокет, ее длина), т.к. два типа сокета (www.google.com, /tmp/socket1), а функция одна.

В) listen() – настраивает сокет на прием. ОС начинает слушать порт.

Г) accept – позволяет принять запрос от клиента

Д) connect() – позволяет клиенту подключиться к порту сервера

Е) recv(), recfrom() – прием сообщения. Sendto() и send() – посыл.

Ж) shutdown() – закрывает порт и гнездо.

 

Сервер: socket()àbind()à(*)listen()àaccept()àrecv() и send()àshutdown() либо (*)àclose()

Клиент: socket()à(*)connect()àsend() и recv()àshutdown() или (*)àclose()

Вообще гнезда (и взаимодействие программ при помощи гнезд) играют очень важную роль во всех Unix-системах, включая и Linux: они являются ключевым понятием TCP/IP и соответственно на них целиком строится Internet. Однако c точки зрения файловой системы гнезда практически неотличимы от именованных каналов: это просто метки, позволяющие связать несколько программ. После того как связь установлена, общение программ происходит без участия файла гнезда: данные передаются ядром ОС непосредственно от одной программы к другой.

Поддерживаемый ядром механизм, скрывающий особенности сетевой среды и позволяющий единообразно взаимодействовать процессам

· выполняющимся на одном компьютере

· в пределах одной локальной сети

· разнесенным на разные компьютеры территориально распределенной сети

Первое решение:

· UNIX BSD 4.1 в 1982 г.

Три составляющих:

· компонент уровня программных гнезд (независящий от сетевого протокола и среды передачи данных)

· компонентом протокольного уровня (независящий от среды передачи данных)

компонентом уровня управления сетевым устройством

Программные гнезда с общими коммуникационными свойствами, такими как способ именования и протокольный формат адреса, группируются в домены: "домен системы UNIX" (адрес файла) для процессов, которые взаимодействуют через программные гнезда в пределах одного компьютера; "домен Internet" (адрес порта) для процессов, которые взаимодействуют в сети в соответствии с семейством протоколов TCP/IP. Два типа программных гнезд с виртуальным соединением (stream sockets) и дейтаграммные гнезда (datagram sockets). Виртуальные соединения: передача данных от клиента к серверу в виде непрерывного потока байтов с гарантией доставки; до начала передачи данных должно быть установлено соединение. Дейтаграммные программные гнезда: не гарантируют абсолютной надежной, последовательной доставки сообщений и отсутствия дубликатов дейтаграмм; не требуется предварительное установление соединений. Создание нового программного гнезда: sd = socket(domain, type, protocol); где domain - домен гнезда; type - тип (с виртуальным соединением или дейтаграммное); protocol - желаемый сетевой протокол; sd - дескриптор программного гнезда. Закрытие (уничтожение) гнезда close(sd).

 



Поделиться:


Последнее изменение этой страницы: 2016-12-30; просмотров: 395; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.218.127.141 (0.069 с.)