Передача сообщений с помощью LPC (локальный вызов процедур)

Возможно два подхода реализации сервисов по запросу от приложений.

1) Совместное использование сегментов dll (динамических библиотек).

2) Защита памяти подсистем.

1 – dll однократно прописываетв в АП. Остальные обращаются к ней -> нет тиражирования, нет связывания -> экономия места.

2 - Нужен если: потоки принадлежат одному процессу, для передачи сообщений используются простейшие способы синхронизации, если разные процессы, то возможно копирование информации в собственное АП потока; использование разделяемой памяти; LPC – механизм передачи. Приложение вызывает функции API-dll, после этого производится обращение по точке входа – stub, (осуществляется упаковка сообщений), дальше передается в защищенный локальный сервер LPC или удаленный сервер посредством RPC, тогда сообщение попадает пред сервером в его точку входа stub для преобразования его к виду, понятному для сервера.

LPC предлагает 3 способа передачи сообщения:

1) Посылка сообщения в объект – порт, связанный с серверным процессом.

2) Посылка в порт сервера указателя на сообщение, и передача сообщения через общую разделяемую память.

3) Передача сообщения через особую область памяти в рамках разделяемой, причем определенному потоку.

 

Для любого из 3-х способов необходимо установить соединение (канал связи для передачи сообщений).

 

Объект – порт - 2 типа: порт соединения, порт связи. Порт соединения – прием запроса клиента на установление канала связи с сервером.

Клиент процесс
Порт связи
Сервер процесс
Порт связи
Порт соединения
Видимо ФС
Порт связи - внутренний

1) Для соединения с сервером процесс открывает описатель объекта порта, посылает запрос на соединение. 2) Сервер (потока) открывает 2 безымянных объекта порта. (один описатель сохраняется у сервера, другой обращается к клиенту). 3) Клиент использует свой описатель для посылки сообщений серверу и ожидает ответ от него. 4) Сервер использует свой описатель для поддержки аналогичных взаимодействий.

 

Описатели объектов портов не наследуются. Атрибуты: тело объекта порта очередь сообщений, описатель секций.

Способы передачи сообщений LPC:

Установка канала связи клиент указывает один из возможных способов:

1. Передача в очередь сообщений объекта порта, используется для сообщений малого размера.

2. Передача через совместно используемую память (для больших сообщений)

3. Быстрый LPC.

4.

Копирование в порт: LPC помещает сообщение в один из блоков объекта порта, контекст ядра переключается с клиентского процесса на процесс – сервер. Поток сервера копирует сообщение в АП сервера и обрабатывает его. Результат отправляется в порт связи клиента.

Объект порта хранится в системной памяти. При создании процесса механизм LPC резервирует память из резидентного пула. Ограничение на передаваемые сообщения: блок 256 байт.

 

Передача через совместно используемую память:

Применяется при условии, что длина сообщения превышает 256 байт (иначе можем разместить сообщение в порте).

Клиент создает объект – секцию (область памяти называется секцией). Как реакция средства LPC реагируют на клиентский запрос и обеспечивают двойное отображение секции на пространство клиента и пространство сервера, причем делает это с использованием аппаратных возможностей процессора (т.е. процессор должен делать двойное отображение – посылать одинаковый адрес клиенту и серверу). Сначала клиент посылает реальное сообщение в секцию, а затем указатель на сообщение (область памяти, где оно расположено) пересылается серверу. После этого ядро переключает контекст клиента на контекст сервера. После переключения контекстов сервер может выполнить обработку. Затем результат передается клиенту с переключением контекста (делается там же через объект-секцию).