Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Межпроцесное взаимодействие. Использование именованных каналов.



Межпроцесное взаимодействие. Использование именованных каналов.

В Windows под процессом понимается объект ядра, которому принадлежат системные ресурсы, используемые исполняемым приложением. Поэтому можно сказать, что в Windows процессом является исполняемое приложение. Выполнение каждого процесса начинается с первичного потока. Во время своего исполнения процесс может создавать другие потоки. Исполнение процесса заканчивается при завершении работы всех его потоков.

Каждый процесс в операционной системе Windows владеет следующими ресурсами:

_ виртуальным адресным пространством;

_ рабочим множеством страниц в реальной памяти;

_ маркером доступа, содержащим информацию для системы безопасности;

_ таблицей для хранения дескрипторов объектов ядра.

 

Межпроцессное взаимодействие — обмен данными между потоками одного или разных процессов. Реализуется посредством механизмов, предоставляемых ядром ОС или процессом, использующим механизмы ОС и реализующим новые возможности IPC. Может осуществляться как на одном компьютере, так и между несколькими компьютерами сети.

Из механизмов, предоставляемых ОС и используемых для IPC, можно выделить:

· механизмы обмена сообщениями;

· механизмы синхронизации;

· механизмы разделения памяти;

· механизмы удалённых вызовов (RPC).

 

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

 

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

Удалённый вызов процедур — класс технологий, позволяющих компьютерным программам вызывать функции или процедуры в другом адресном пространстве (как правило, на удалённых компьютерах).

 

Механизмы синхронизации — высокоуровневые варианты реализации синхронизации с использованием средств ОС.

В программировании именованный канал (англ. named pipe) — один из методов межпроцессного взаимодействия. Именованный канал позволяет различным процессам обмениваться данными. Традиционный канал — «безымянен», потому что существует анонимно и только во время выполнения процесса. Именованный канал — существует в системе и после завершения процесса. Он должен быть «отсоединён» или удалён, когда уже не используется. Процессы обычно подсоединяются к каналу для осуществления взаимодействия между ними.

1.2. Синхранизация потоков. Объекты синхронизации потоков. Объект CRITICAL_SECTION

Поток – это единица исполнения, отдельный счетчик команд или подлежащая планированию сущность внутри процесса.

Основные составляющие потока в исполнительной системе NT:

· Уникальный идентификатор

· Содержимое набора регистров, отражающее состояние процессора

· Два стека: один используется потоком при работе в пользовательском режиме, а другой — в режиме ядра

· Собственная область памяти, предназначенная для использования подсистемами, библиотеками периода выполнения и динамически подключаемыми библиотеками (DLL).

·

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

События

Объекты-события используются для уведомления ожидающих нитей о наступлении какого-либо события. Различают два вида событий - с ручным и автоматическим сбросом. Ручной сброс осуществляется функцией ResetEvent. События с ручным сбросом используются для уведомления сразу нескольких нитей. При использовании события с автосбросом уведомление получит и продолжит свое выполнение только одна ожидающая нить, остальные будут ожидать дальше.

Функция CreateEvent создает объект-событие, SetEvent - устанавливает событие в сигнальное состояние, ResetEvent - сбрасывает событие. Функция PulseEvent устанавливает событие, а после возобновления ожидающих это событие нитей (всех при ручном сбросе и только одной при автоматическом), сбрасывает его. Если ожидающих нитей нет, PulseEvent просто сбрасывает событие.

Пример. Синхронизация нитей с помощью событий.

#include < windows.h>

#include < stdio.h>

HANDLE hEvent1, hEvent2;

int a[5];

HANDLE hThr;

unsigned long uThrID;

void Thread( void* pParams )

{

int i, num = 0;

while (1){

WaitForSingleObject( hEvent2, INFINITE );

for (i=0; i< 5; i++) a[i] = num;

num++;

SetEvent( hEvent1 );

}

}

 

int main( void )

{

hEvent1=CreateEvent( NULL, FALSE, TRUE, NULL );

hEvent2=CreateEvent( NULL, FALSE, FALSE, NULL );

hThr=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread, NULL, 0, & uThrID);

while(1)

{

WaitForSingleObject( hEvent1, INFINITE );

printf(" %d %d %d %d %d\n", a[0], a[1], a[2], a[3], a[4]);

SetEvent( hEvent2 );

}

return 0;

}

 

Идентификация процессов

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

HANDLE GetCurrentProcess (VOID)

DWORD GetCurrentProcessId (VOID)

Функция GetCurrentProcess в действительности возвращает псевдодескриптор, который не может быть унаследован. Это значение используется в случаях, когда про­цессу требуется собственный дескриптор. Создавайте настоящий дескриптор процесса из его ID, используя в вызове функции OpenProcess значение, возвращенное функ­цией GetCurrentProcessId.

HANDLE OpenProcess ( DWORD fdwAccess, BOOL fInherit,

DWORD IDProcess)

Возвращаемое значение: дескриптор процесса или NULL в случае ошибки.                                                                              

Параметр fdwAccess определяет параметры доступа процесса к дескриптору. Приведем не­которые из его возможных значений.

• Флаг SYNCHRONIZE разрешает другим процессам ждать завершения этого про­цесса, используя функции ожидания

• PROCESS_ALL_ACCESS — установлены все флаги доступа.

• Флаг PROCESS_TERMINATE делает возможным завершение процесса вызовом функции TerminateProcess.

• Флаг PROCESS_QUERY_INFORMATION разрешает использовать дескриптор функ­циями GetExitCodeProcess и GetPriorityClass для получения информа­ции о процессе.

И наконец, выполняющийся процесс может определить имя своего загрузочного файла с помощью функции GetModuleFileName, используя в качестве параметра hModule указатель NULL. Вызов этой функции из динамической библиотеки возвратит имя файла DLL, а не файла.ЕХЕ, используемого библиотекой.

Создание потоков

Создается поток функцией CreateThread, которая имеет следующий прототип:

HANDLE CreateThread(

LPSECURITY_ATTRIBUTES lpThreadAttributes, // атрибутызащиты

DWORD dwStackSize, // размер стека потока в байтах

LPTHREAD_START_ROUTINE IpStartAddress, // адресфункции

LPVOID lpParameter, // адреспараметра

DWORD dwCreationFlags, // флагисозданияпотока

LPDWORD lpThreadld // идентификатор потока

Возвращаемое значение: дескриптор созданного потока и его идентификатор или null при неудаче.

Параметр lpStartAddress указывает на исполняемую потоком функцию. Эта функция должна иметь следующий прототип:

DWORDWINAPIимя_функции_потока(LPVOIDlpParameters);

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

Параметр dwCreationFiags определяет, в каком состоянии будет создан поток.

Завершение потоков

Поток завершается вызовом функции ExitThread, которая имеет следующий прототип:

VOID ExitThread(

DWORD dwExitCode // код завершения потока );

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

Один поток может завершить другой поток, вызвав функцию TerminateThread, которая имеет следующий прототип:

BOOL TerminateThread(

HANDLE hThread, // дескрипторпотока

DWORD dwExitThread // код завершения потока );

Возвращаемое значение: ненулевое значение или FALSE при неудаче. Функция TerminateThread завершает поток, но не освобождает все ресурсы, принадлежащие этому потоку. При выполнении функции TerminateThread система не посылает динамическим библиотекам, загруженным процессом, сообщение о том, что поток завершает свою работу. В результате динамическая библиотека не освобождает ресурсы, которые были захвачены для работы с этим потоком. Поэтому эта функция должна вызываться только в аварийных ситуациях при зависании потока.

Псевдодескрипторы потоков

Иногда потоку требуется знать свой дескриптор, чтобы изменить какие-то свои характеристики. Например, поток может изменить свой приоритет.

Для этих целей в Win32 API существует функция GetcurrentThread, которая имеет следующий прототип:

HANLDE GetCurrentThread(VOID);

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

 

Виртуальная память

Одним из наиболее популярных способов управления памятью в современных ОС является так называемая виртуальная память. Наличие в ОС виртуальной памяти позволяет программисту писать программу так, как будто в его распоряжении имеется однородная ОП большого объема, часто существенно превышающего объем имеющейся физической памяти. В действительности все данные, используемые программой, хранятся на диске и при необходимости частями (сегментами или страницами) отображаются в физическую память. При перемещении кодов и данных между ОП и диском подсистема ВП выполняет трансляцию виртуальных адресов, полученных в результате компиляции и компоновки программы, в физические адреса ячеек ОП.

API виртуальной памяти Win32 (функции VirtualAlloc, VirtualFree, VirtualLock, VirtualUnlock и т.д.) работает с целыми страницами. API “кучи” Win32 может работать с единицами память, определяемыми пользователем.

Функция VitualAlloc распределяет ряда страниц в виртуальном адресном пространстве, а функция VitualAllocEx распределяет ряд страниц в виртуальном адресном пространстве указанного процесса.

LPVOID VitualAlloc ( LPVOID lpvAddress, DWORD dwSize,

DWORD dwAllocationType, DWORD dwProtect).

LPVOID VitualAllocEx ( HANDLE hProcess, LPVOID lpvAddress, DWORD dwSize, DWORD dwAllocationType, DWORD dwProtect).

Функция VirtualFree освобождает ряд страниц в виртуальном адресном пространстве. А функция VirtualFreeEx освобождает ряд страниц в виртуальном адресном пространстве указанного процесса.

BOOL VirtualFree(LPVOID lpvAddress, DWORD dwSize,

DWORD dwFreeType)

BOOL VirtualFreeEx(HANDLE hProcess, LPVOID lpvAddress,

DWORD dwSize, DWORD dwFreeType)

Функция VirtualLock блокирует область виртуального адресного пространства в памяти. А функция VirtualUnLock дает возможность разблокировать указанный ряд страниц в виртуальном адресном пространстве процесса, позволяя системе выгружать эти страницы в файл подкачки по мере необходимости.

BOOL VirtualLock (LPVOID lpvAddress, DWORD dwSize),

BOOL VirtualUnlock (LPVOID lpvAddress, DWORD dwSize)

Функция VirtualProtect изменяет установки защиты доступа к области выделенных страниц в виртуальном адресном пространстве. Функция VirtualProtectEx может действовать в виртуальном адресном пространстве других процессов, тогда как VirtualProtect действует толька в рамках вызывающего процесса.

BOOL VirtualProtect(LPVOID lpvAddress, DWORD dwSize, DWORD dwNewProtect, DWORD pdwOldProtect)

BOOL VirtualProtectEx(HANDLE hProcess, LPVOID lpvAddress, DWORD dwSize, DWORD dwNewProtect, DWORD pdwOldProtect)

 

 

СОЗДАНИЕ ПОТОКА

#include < windows.h>

#include < stdio.h>

DWORD WINAPI MyThread( LPVOID lpParam )

{

 printf(" Parameter = %d\n", *(DWORD*)lpParam);

 return 0;

}

 

VOID main( VOID )

{

DWORD ThreadId, ThreadParameter = 10;

 HANDLE hThread; hThread = CreateThread(

NULL, // атрибуты безопасности по умолчанию

0, // размер стека по умолчанию 

MyThread, // указатель на процедуру создаваемого потока

& ThreadParameter, // аргумент, передаваемый функции потока

 0, // флаги создания по умолчанию

& ThreadId);      // возвращаемый идентификатор потока

 

 if (hThread == NULL) printf(" CreateThread failed." );    

 getchar(); CloseHandle( hThread );

}

 

 

Межпроцесное взаимодействие. Использование именованных каналов.

В Windows под процессом понимается объект ядра, которому принадлежат системные ресурсы, используемые исполняемым приложением. Поэтому можно сказать, что в Windows процессом является исполняемое приложение. Выполнение каждого процесса начинается с первичного потока. Во время своего исполнения процесс может создавать другие потоки. Исполнение процесса заканчивается при завершении работы всех его потоков.

Каждый процесс в операционной системе Windows владеет следующими ресурсами:

_ виртуальным адресным пространством;

_ рабочим множеством страниц в реальной памяти;

_ маркером доступа, содержащим информацию для системы безопасности;

_ таблицей для хранения дескрипторов объектов ядра.

 

Межпроцессное взаимодействие — обмен данными между потоками одного или разных процессов. Реализуется посредством механизмов, предоставляемых ядром ОС или процессом, использующим механизмы ОС и реализующим новые возможности IPC. Может осуществляться как на одном компьютере, так и между несколькими компьютерами сети.

Из механизмов, предоставляемых ОС и используемых для IPC, можно выделить:

· механизмы обмена сообщениями;

· механизмы синхронизации;

· механизмы разделения памяти;

· механизмы удалённых вызовов (RPC).

 

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

 

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

Удалённый вызов процедур — класс технологий, позволяющих компьютерным программам вызывать функции или процедуры в другом адресном пространстве (как правило, на удалённых компьютерах).

 

Механизмы синхронизации — высокоуровневые варианты реализации синхронизации с использованием средств ОС.

В программировании именованный канал (англ. named pipe) — один из методов межпроцессного взаимодействия. Именованный канал позволяет различным процессам обмениваться данными. Традиционный канал — «безымянен», потому что существует анонимно и только во время выполнения процесса. Именованный канал — существует в системе и после завершения процесса. Он должен быть «отсоединён» или удалён, когда уже не используется. Процессы обычно подсоединяются к каналу для осуществления взаимодействия между ними.

1.2. Синхранизация потоков. Объекты синхронизации потоков. Объект CRITICAL_SECTION

Поток – это единица исполнения, отдельный счетчик команд или подлежащая планированию сущность внутри процесса.

Основные составляющие потока в исполнительной системе NT:

· Уникальный идентификатор

· Содержимое набора регистров, отражающее состояние процессора

· Два стека: один используется потоком при работе в пользовательском режиме, а другой — в режиме ядра

· Собственная область памяти, предназначенная для использования подсистемами, библиотеками периода выполнения и динамически подключаемыми библиотеками (DLL).

·

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


Поделиться:



Последнее изменение этой страницы: 2019-04-09; Просмотров: 257; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.044 с.)
Главная | Случайная страница | Обратная связь