«Ни один ремесленник, который стремится к вершинам своей профессии, не примет негодных инструментов; и ни один производитель, который ценит качество работы, не будет упрашивать ремесленника принять их»
42. Межпроцессное взаимодействие
Данный раздел написан на основе материала из MSDN «Platform SDK Documentations|Base Services|Interprocess Communications»
ОС Windows обеспечивает программистов механизмами, облегчающими взаимодействие приложений и совместный доступ к данным. Возможности, обеспечиваемые этими механизмами, принято называть межпроцессным взаимодействием (IPC –interprocess communications). Одни механизмы IPC позволяют нескольким специализированным процессам совместно выполнять обработку данных, а другие – распределенную обработку данных в сети.
Приложения, использующие IPC, принято разделять на клиентские и серверные. Клиент – приложение или процесс, запрашивающее сервис у другого приложения или процесса, а сервер – приложение или процесс, предоставляющее такой сервис. Многие приложения, в зависимости от ситуации, являются и клиентами и серверами. Например, текстовый процессор может выступать в роли клиента при получении некоторых данных от приложения, поддерживающего электронные таблицы, которое в свою очередь, выступает в роли клиента по отношению к приложению, предоставляющему данные для электронной таблицы.
Когда Вы решите, что Ваше приложение должно получить от IPC, Вы должны выбрать соответствующее средство (метод) IPC. Вполне возможно, что приложение будет использовать не один механизм IPC. Определить, что именно Вам нужно использовать, помогут ответы на следующие вопросы:
должно ли Ваше приложение взаимодействовать с приложениями, расположенными на одном компьютере или в сети; должно ли Ваше приложение взаимодействовать с приложениями, выполняемыми под управлением разных ОС (MS-DOS, 16-битная Windows или UNIX); должен ли пользователь Вашего приложения сам выбирать другие приложения или этот выбор (или поиск) должно сделать само приложение; должно ли приложение взаимодействовать с другими стандартным способом, таким как команды «вырезать» и «вставить» или же это взаимодействие ограничено специфическими свойствами других приложений; является ли производительность критичным показателем, так как использование всех механизмов IPC связано с определенными ресурсными затратами. является приложение консольным или это должно быть приложение с графическим интерфейсом (GUI). Для использования некоторых средств IPC требуется приложение GUI.ОС Windows поддерживает такие механизмы IPC:
буфер обмена Clipboard; COM модель; Data Copy – передача данных с помощью сообщения WM_COPYDATA Windows; DDE – динамический обмен данными; File Mapping – файлы, отображаемые в память; Mailslots – объекты ядра Windows «почтовые ящики»; Pipes – каналы; RPC – удаленный вызов процедур; объекты Windows Sockets.Использование буфера обмена Clipboard
Буфер обмена служит центральным хранилищем данных, разделяемых приложениями. Когда пользователь некоторого приложения выполняет операцию копирования или вырезания, приложение помещает выделенные данные в буфер обмена в одном или нескольких определенных приложением форматов. любое другое приложение может получить эти данные из буфера обмена, выбрав подходящий ему формат представления данных. Буфер обмена является очень малосвязанной областью обмена, в рамках которой приложения могут только согласиться с предложенным форматом данных. Приложения могут находиться на одном и том же компьютере или на разных компьютерах сети.
Резюме. Все приложения должны поддерживать буфер обмена для тех форматов данных, которые им известны, т.е. которые они понимают. Например, текстовый процессор должен уметь помещать данные в буфер обмена и извлекать их из него по крайней мере в простом текстовом формате.
Использование модели СОМ для межпроцессного взаимодействия
Технология OLE является сервисом, который предоставляет приложения простой способ вызова другого приложения для редактирования данных. Например, текстовый процессор, использующий OLE, может внедрить диаграмму из электронной таблицы.
Пользователь может запустить процессор электронных таблиц автоматически из текстового процессора, выбрав внедренную диаграмму для редактирования. В этом случае OLE обеспечивает запуск приложения электронных таблиц и представления диаграммы для редактирования. Когда пользователь заканчивает редактирование, диаграмма автоматически обновляется в текстовом процессоре. Таким образом, электронная таблица выглядит как расширение текстового процессора.
Базой OLE является модель компонентных объектов COM. Компонент приложения, который использует COM, может взаимодействовать с широким спектром других компонентов, даже если эти компоненты еще не разработаны. Компоненты взаимодействую как клиенты и объекты. DCOM расширяет модель COM так, что она может функционировать в сети компьютеров.
Резюме. Объекты COM обеспечивают доступ к своим данным посредством функций, предоставляемых так называемыми интерфейсами.
Передача данных с помощью сообщения Windows WM_COPYDATA
Копирование данных (Data Copy) позволяет одному приложению посылать данные другому с помощью сообщения WM_COPYDATA. Это метод требует взаимодействия между приложениями, участвующими в обмене. Приложение-получатель должно знать формат данных и должно быть в состоянии идентифицировать отправителя. Приложение-отправитель не имеет возможности редактировать отправленные данные.
Резюме. Механизм копирования данных может быть использован для быстрой отправки данных с помощью сообщений Windows.
Динамический обмен данными DDE
DDE представляет собой протокол, который позволяет приложениям обмениваться данными в различных форматах. Приложения могут использовать DDE для одноразовых обменов данными или для таких обменов данными, при которых приложения обновляют свои данные по мере того, как они становятся доступными.
Форматы данных, используемых DDE, такие же, как и форматы буфера обмена. Другими словами, DDE можно рассматривать как расширение механизма буфера обмена. Буфер обмена почти всегда используется для ответа на такую команду пользователя как «вставить», выбираемую из меню. DDE также в большинстве случаев инициируется командой пользователя, однако зачастую продолжает функционировать без дальнейшего взаимодействия с пользователем. Программист может также определить свой собственный формат данных для специальных целей межпроцессного взаимодействия.
Обмен данными с посредством DDE может выполняться на одном и том же компьютере или в сети.
Резюме. Механизм DDE не столь эффективен по сравнению с другими технологиями. Тем не менее это не исключает возможности использования этого механизма в условиях, когда другие способы взаимодействия приложений не применимы или требуется взаимодействовать с таким приложением, которое поддерживает только DDE.
Использование файлов, отображаемых в память
Отображение файлов в память позволяет процессу интерпретировать содержимое файла так, как будто оно является блоком памяти в его адресном пространстве. Процесс может использовать простые операции для чтения и модификации содержимого файла. Когда два или более процесса получают доступ к одному и тому же отображенному в память файлу (данным), каждый процесс получает указатель на память в своем собственном адресном пространстве и может читать или модифицировать содержимое файла. Процессы должны использовать синхронизирующие объекты, такие как семафоры, для того чтобы предотвратить разрушение данных в многозадачной среде.
Можно также использовать специальный вид отображения файлов, называемый именованной разделяемой памятью (named shared memory). Если создаваемый объект отображения файла в память во время его создания определить как системный файл подкачки, то он будет интерпретироваться как блок разделяемой памяти. Разные процессы могут получить доступ к одному и тому же блоку памяти путем открытия одного и того же объекта.
Отображение файла в память также обеспечивает поддержку атрибутов безопасности ОС, которая может помочь предохранить данные от несанкционированного доступа. Отображение файла в память может быть использовано только для взаимодействия между процессами на одном компьютере, но не в сети.
Таким образом, отображаемые в память файлы предоставляют возможность нескольким процессам получать совместный доступ к данным, однако процессы должны обеспечивать синхронизацию доступа к данным.
Объекты Mailslot ядра Windows
Почтовые ящики обеспечивают одностороннее взаимодействие процессов. Любой процесс, который создает почтовый ящик, выступает в роли сервера почтового ящика. Другой процесс, называемый клиентом почтового ящика, посылает сообщения серверу путем их записи в почтовый ящик сервера. Входящие сообщения всегда добавляются в почтовый ящик. Сообщения хранятся в почтовом ящике до тех пор, пока сервер их не прочтет. Любой процесс может выступать одновременно как в роли сервера, так и в роли клиента, вследствие чего двустороннее межпроцессное взаимодействие возможно путем создания по крайней мере двух почтовых ящиков..
Клиент почтового ящика может посылать сообщения в почтовый ящик своего компьютера, компьютера в сети или во все почтовые ящики с одним и тем же именем всем компьютерам в сети, имеющим указанное доменное имя. Сообщения, рассылаемые в такие почтовые ящики, ограничены размером в 400 байт, в то время как размер сообщений, посылаемых в один почтовый ящик, ограничивается только той величиной, которая установлена сервером при создании почтового ящика.
Резюме. Почтовые ящики предоставляют простой способ для приложений посылать и получать сравнительно короткие сообщения. Они также предоставляют простую возможность рассылать сообщения всем компьютерам домена.
Использование каналов
Имеется два типа каналов (pipes) для двустороннего межпроцессного взаимодействия: анонимные (anonymous) и именованные (named). Анонимные (неименованные) каналы позволяют родственным (related) процессам передавать информацию друг другу. Обычно такой канал используется для перенаправления стандартного ввода или вывода дочернего процесса так, что он может обмениваться данными со своим родительским процессом. Для обмена данными в двух направлениях (дуплексные операции) необходимо создавать два анонимных канала. Родительский процесс записывает данные в один канал с использованием своего дескриптора записи (write handle), в то время как дочерний процесс читает данные из этого канала с использованием своего дескриптора чтения (read handle). Аналогичным образом, дочерний процесс записывает данные в другой канал, а родительский читает эти данные. Анонимные каналы не могут быть использованы в сети или неродственными процессами.
Именованные каналы используются для передачи данных между процессами, которые не являются родственными, и между процессами на разных компьютерах. Обычно, процесс-сервер создает именованный канал с широко известным именем или таким именем, которое предназначено для связи с клиентами. Процесс-клиент, который знает это имя, может открыть именованный канал в соответствии с ограничениями, наложенными сервером. После того как оба процесса присоединились к каналу, они могут обмениваться данными.
Резюме. Неименованные каналы предоставляют эффективный способ для перенаправления стандартного ввода или вывода дочернего процесса на том же компьютере. Именованные каналы предоставляют простой программный интерфейс для передачи данных между процессами, которые находятся на одном компьютере или на разных.
Удаленный вызов процедур
RPC обеспечивает приложения механизмом удаленного вызова процедур, благодаря чему межпроцессное взаимодействие настолько же простое, как и вызов процедур. RPC может использоваться как процессами на одном компьютере, так и процессами на разных компьютерах в сети.
Реализация RPC в Windows совместима с Фондом открытого ПО (OSF – Open Software Foundation) Среды распределенных вычислений (DCE – Distributed Computing Environment). Это означает, что приложения, использующие RPC, могут взаимодействовать с приложениями, выполняющимися в других операционных системах, поддерживающими стандарт DCE. RPC автоматически поддерживает преобразования данных для разных аппаратных платформ.
Клиенты и серверы RPC тесно взаимодействуют друг с другом, сохраняя при этом высокую производительность. ОС широко использует RPC для облегчения взаимосвязи между своими различными частями.
Резюме. RPC является интерфейсом процедурного уровня с поддержкой преобразования данных и для связи с другими ОС. Используя RPC, можно создавать высокопроизводительные и тесно взаимодействующие распределенные приложения.
Объекты Windows Sockets
Сокеты Windows представляют собой независимый от протокола интерфейс. Этот интерфейс дает возможность использовать преимущества базовых протоколов. Сокет Windows Sockets 2 представляет собой дескриптор, который может быть использован и как дескриптор файла в стандартных файловых функциях ввода и вывода.
Сокеты Windows берут свое начало от сокетов, впервые предложенных Berkeley Software Distribution (BSD – программное обеспечение Калифорнийского университета). Приложение, использующее сокеты Windows, может взаимодействовать с сокетами других ОС.
«41. Предпосылки возникновения COM»
43. Тип interface в Object Pascal