АкушерствоАнатомияАнестезиологияВакцинопрофилактикаВалеологияВетеринарияГигиенаЗаболеванияИммунологияКардиологияНеврологияНефрологияОнкологияОториноларингологияОфтальмологияПаразитологияПедиатрияПервая помощьПсихиатрияПульмонологияРеанимацияРевматологияСтоматологияТерапияТоксикологияТравматологияУрологияФармакологияФармацевтикаФизиотерапияФтизиатрияХирургияЭндокринологияЭпидемиология

Конвейеры (программные каналы)

Прочитайте:
  1. Височная кость (части, их строение, каналы). Сообщения барабанной полости, имеющие важное клиническое значение.
  2. Строение внутреннего уха (улитка, перепончатая, барабанная и вестибулярная лестницы). Анатомия вестибулярного анализатора (преддверие и полукружные каналы).

Конвейер (pipe — программный канал (связи), или, как его иногда называют, транспортер) является средством, с помощью которого можно производить об­мен данными между процессами. Принцип работы конвейера основан на меха­низме ввода/вывода, который используется для работы с файлами в UNIX, то есть задача, передающая информацию, действует так, как будто она записывает данные в файл, в то время как задача, для которой предназначается эта инфор­мация, читает ее из этого файла. Операции записи и чтения осуществляются не записями, как это делается в обычных файлах, а потоком байтов, как это было принято в UNIX-системах. Таким образом, функции, с помощью которых вы­полняется запись в канал и чтение из него, являются теми же самыми, что и при работе с файлами. По сути, канал представляет собой поток данных между дву­мя (или более) процессами. Это упрощает программирование и избавляет про­граммистов от использования каких-то новых механизмов. На самом деле кон-


вейеры не являются файлами на диске, а представляют собой буферную память, работающую по принципу FIFO, то есть по принципу обычной очереди. Однако не следует путать конвейеры с очередями сообщений; последние реализуются иначе и имеют другие возможности.

Конвейер имеет определенный размер1, который не может превышать 64 Кбайт, и работает циклически. Вспомните реализацию очереди на массивах, когда име­ются указатели начала и конца очереди, которые перемещаются циклически по массиву. Имеется некий массив и два указателя: один показывает на первый эле­мент (назовем его условно head), а второй — на последний (назовем его tail).

В начальный момент оба указателя равны нулю. Добавление самого первого эле­мента в пустую очередь приводит к тому, что указатели head и tail принимают значение, равное 1 (в массиве появляется первый элемент). В последующем до­бавление нового элемента вызывает изменение значения второго указателя, по­скольку он отмечает расположение именно последнего элемента очереди. Чтение (и удаление) элемента (читается и удаляется всегда первый элемент из создан­ной очереди) приводит к необходимости модифицировать значение указателя head. В результате операций записи (добавления) и чтения (удаления) элемен­тов в массиве, моделирующем очередь элементов, указатели будут перемещаться от начала массива к его концу. При достижении указателем значения индекса последнего элемента массива значение указателя вновь становится единичным (если при этом не произошло переполнение массива то есть количество элемен­тов в очереди не стало больше числа элементов в массиве). Можно сказать, что мы как бы замыкаем массив в кольцо, организуя круговое перемещение указателей head и tail, которые отслеживают первый и последний элементы в очереди. Ска­занное проиллюстрировано на рис. 6.5. Именно так и функционирует конвейер.

Как информационная структура канал описывается идентификатором, разме­ром и двумя указателями. Конвейеры представляют собой системный ресурс. Чтобы начать работу с конвейером, процесс сначала должен заказать его у опера-

' Pipe (канал или конвейер) был введен в UNIX-системах и имеет максимальный размер в 64 Кбайт, поскольку в 16-разрядных мини-ЭВМ, для которых создавалась эта система, нельзя было создать массив данных большего размера.


ционной системы и пЪлучить в свое распоряжение. Процессы, знающие иденти­фикатор конвейера, могут через него обмениваться данными.

Теперь рассмотрим основные системные запросы для работы с ними. В качестве примера возьмем вызовы из API OS/2 (в следующем разделе мы ими воспользу­емся). Традиционные вызовы для работы с каналами (конвейерами) приведены в разделе, где описывается архитектура системы UNIX (см. главу 8). Итак:

Q Функция создания конвейера:

DosCreatePipe (&ReadHandle. &Wr1teHandle. PipeSize);

где ReadHandle — описатель для чтения из конвейера, WriteHandle — описатель

для записи в конвейер, PipeSize — размер конвейера.

D Функция чтения из конвейера:

DosRead t&ReadHandle. (PVOID)SInform. sizeoftInform). &BytesRead): где ReadHandle — описатель для чтения из конвейера, Inform — переменная лю­бого типа, sizeofCInform) — размер переменной Inform, BytesRead — количество прочитанных байтов. Данная функция при обращении к пустому конвейеру будет ожидать, пока в конвейере не появится информация для чтения.

Q Функция записи в конвейер:

DosWrite (UWriteHandle. (PVOIDJ&Inform. sizeoftInform), &BytesWrite);

где WriteHandle — описатель для записи в конвейер, BytesWrite — количество

записанных байтов.

Читать из конвейера может только тот процесс, который знает идентификатор соответствующего конвейера. При работе с конвейером данные непосредственно помещаются в него. Еще раз отметим, что из-за ограничения на размер конвейе­ра программисты сталкиваются и с ограничениями на размеры передаваемых че­рез него сообщений.


Дата добавления: 2015-01-18 | Просмотры: 701 | Нарушение авторских прав



1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |



При использовании материала ссылка на сайт medlec.org обязательна! (0.003 сек.)