Авг 07

Обмен данными между процессами

Потоки одного процесса не имеют доступа к адресному пространству другого процесса. Однако существуют специализированные механизмы для передачи данных между процессами. Вообще обмен данными между процессами (Interprocess Communication, IPC) в свое время начинался в виде процедуры перемещения перфокарт из выходного отверстия одного вычислительного устройства в устройство чтения другого вычислительного устройства. Позже, с развитием операционных систем, обмен данными между процессами проделал определенный путь в сторону высоких технологий. Наиболее впечатляющим примером обмена информацией является создание Всемирной паутины (World Wide Web). Приведем краткий список механизмов IPC, встроенных в Windows:
Буфер обмена (clipboard) — одна из самых примитивных и хорошо известных форм IPC. Основная его задача состоит в поддержке обмена данными между программами по желанию и под контролем пользователя.
Библиотеки динамической компоновки. Когда в рамках DLL объявляется переменная, то ее можно сделать разделяемой (shared). Все процессы из DLL, обращающиеся к такой переменной, будут использовать одно и то же место в физической памяти.
Сообщение WM_COPYDATA, которое применяется для передачи участка памяти другому процессу.
Разделяемая память (shared memory) реализуется при помощи объектов ядра «проекция файла», которые осуществляют отображение файлов на оперативную память.
Протокол динамического обмена данными (Dynamic Data Exchange, DDE), который определяет все основные функции для обмена данными между приложениями. DDE широко использовался до тех пор, пока Microsoft не приняла решение использовать OLE, которую затем переименовали в ActiveX, в качестве основной технологии взаимодействия программ.
Удаленный вызов процедур (Remote Procedure Call, RPC), строго говоря, не является механизмом IPC. Это скорее, технологическая оболочка, расширяющая возможности традиционных механизмов IPC. Благодаря RPC сеть становится совершенно прозрачной как для сервера, так и для клиента.
ActiveX является универсальной технологией, и одним из ее применений является обмен данными между процессами. Специально для этой цели Microsoft определила стандартный интерфейс IDataObject А для обмена данными по сети используется Distibuted Component Object Model (DCOM), которую можно рассматривать как объединение ActiveX и RPC.
Каналы (pipes) — мощная технология обмена данными. В общем случае канал можно представить в виде трубы, соединяющей два процесса, через которую идет непрерывный поток данных. Каналы делятся на анонимные (anonymous pipes) и именованные (named pipes). Анонимные каналы используются довольно редко. Именованные каналы, которые поддерживаются только в системах WinNT/2000, передают произвольные данные и могут работать через сеть. В последнее время вместо именованных каналов все чаще используют сокеты.
Сокеты (sockets) — очень важная технология, так как именно она отвечает за обмен данными в сети Интернет. Сокеты также часто используются в крупных локальных сетях. Сокеты можно рассматривать как «разъемы», представляющие собой абстракцию конечных точек коммуникационной линии, которая соединяет два приложения. Windows содержит достаточно мощный API для работы с сокетами.
Почтовые слоты (mailslots) — это механизм однонаправленного IPC. Если приложению известно имя слота, то оно может помещать туда сообщения, а приложение, которое является владельцем этого слота, может их оттуда извлекать и обрабатывать. Основное преимущество этого способа заключается в возможности передавать сообщения по локальной сети сразу нескольким компьютерам за одну операцию, если, конечно, несколько приемников имеют почтовые слоты с одним и тем же именем.
Microsoft Message Queue (MSMQ) — обеспечивает посылку сообщений между приложениями с помощью очереди сообщений. В отличие от других форм IPC, эта технология позволяет посылать сообщения процессу, который в данное время недоступен, например, если приложение не запущено, сервер вышел из строя или сетевой канал связи перегружен. Механизм MSMQ ставит сообщение в очередь до тех пор, пока не появится возможность переслать его адресату.
В данной книге будут рассмотрены только два механизма обмена данными между процессами: обмен с помощью разделяемой памяти (или объекта ядра «проекция файла») и обмен при помощи сообщения WM_COPYDATA.
Но сначала — несколько слов об архитектуре памяти Win32.