Слайды и текст доклада
Pic.1
Операционные системы Межпроцессное взаимодействие
Pic.2
Виды межпроцессного взаимодействия (IPC) Предотвращение критических ситуаций Синхронизация процессов Передача информации от одного процесса другому
Pic.3
Межпроцессное взаимодействие Предотвращение критических ситуаций и средства синхронизации процессов
Pic.4
Возникновение гонок (состязаний) Два процесса хотят получить доступ к общей памяти в одно и тоже время.
Pic.5
Возникновение гонок (состязаний) Если процессу требуется вывести на печать файл, он помещает имя файла в специальный каталог спулера. Другой процесс, “демон печати”, периодически проверяет наличие …
Pic.6
Возникновение гонок (состязаний) Возможна следующая ситуация: Процесс A считывает значение (7) переменной in и сохраняет его в локальной переменной next_free_slot. После этого происходит прерывание …
Pic.7
Критические секции Важным понятием синхронизации потоков для решения проблемы состязаний является понятие «критической секции» программы. Критическая секция – это часть программы, результат …
Pic.8
Критические секции Во всех потоках, работающих с критическими данными, должна быть определена критическая секция. В разных потоках критическая секция состоит в общем случае из разных …
Pic.9
Условия исключения гонок Два процесса не должны одновременно находиться в критической секции В программе не должно быть предположений о скорости или количестве процессоров Процесс вне критической …
Pic.10
Взаимное исключение с использованием критических секций
Pic.11
Семафоры Дийкстра (Dijkstra) предложил использовать переменные, которые могут принимать целые неотрицательные значения. Такие переменные, используемые для синхронизации вычислительных процессов, …
Pic.12
Иллюстрация работы семафора
Pic.13
Задача о читателях и писателях Рассмотрим использование семафоров на классическом примере взаимодействия двух выполняющихся в режиме мультипрограммирования потоков, один из которых пишет данные в …
Pic.14
Задача о читателях и писателях
Pic.15
Задача о читателях и писателях Таким образом, семафоры позволяют эффективно решать задачу синхронизации Доступа к ресурсным пулам, таким, например, как набор идентичных в функциональном назначении …
Pic.16
Мьютексы Иногда используется упрощенная версия семафора – мьютекс (mutex, mutual exclusion – взаимное исключение). Иногда называют еще двоичным семафором. Мьютекс – переменная, которая может …
Pic.17
Использование мьютекса
Pic.18
Атомарные операции В достаточно частых случаях необходимо обеспечить конкурентный доступ к какой-либо целочисленной переменной, являющейся счетчиком. Тогда бывает достаточно просто обеспечить …
Pic.19
Атомарные операции в Windows 2000-2003 ОС Windows предоставляет функции для увеличения (InterlockedIncrement, InterlockedIncrement64) или уменьшения (InterlockedDecrement, InterlockedDecrement64) …
Pic.20
Атомарные операции в Windows 2000-2003 Пример использования атомарной операции: static DWORD array [100]; … for (int i = 0; i < 100; i++) InterlockedIncrement(array+i);
Pic.21
Мониторы Для упрощения написания программ в 1974 г. Хоар (Hoare) и Бринч (Brinch Hansen) предложили примитив синхронизации более высокого уровня – монитор. Монитор – примитив синхронизации более …
Pic.22
Решение задачи читателей и писателей с помощью монитора
Pic.23
Критические секции В составе API ОС Windows имеются специальные и эффективные функции для организации входа в критическую секцию и выхода из нее потоков одного процесса в режиме пользователя. Они …
Pic.24
Критические секции Примерная схема программы может выглядеть следующим образом. CRITICAL_SECTION cs; DWORD WINAPI SecondThread() { InitializeCriticalSection(&cs); EnterCriticalSection(&cs); …
Pic.25
Критические секции Функции EnterCriticalSection и LeaveCriticalSection реализованы на основе атомарных Interlocked-функций. Существенным является то, что в случае невозможности входа в критический …
Pic.26
Межпроцессное взаимодействие Синхронизация потоков с использованием объектов ядра Windows 2000
Pic.27
Синхронизация потоков Простейшей формой связи потоков является синхронизация (synchronization). Синхронизация означает способность потока добровольно приостанавливать свое исполнение и ожидать, пока …
Pic.28
Синхронизационные объекты и их состояния процессы потоки задания файлы консольный ввод
Pic.29
Объекты синхронизации и их состояния Средства ожидания и сообщения реализованы в ядре Windows как часть объектной архитектуры. Синхронизационные объекты (synchronization objects) – это объекты ядра, …
Pic.31
Функции ожидания DWORD WaitForSingleObject( HANDLE hObject, DWORD dwMilliseconds );
Pic.32
Функции ожидания Wait-функции позволяют потоку в любой момент приостановиться и ждать освобождения какого-либо объекта ядра. Когда поток вызывает эту функцию, первый параметр, hObject, идентифицирует …
Pic.33
Объекты синхронизации События Ожидающий таймер Семафор Мьютекс
Pic.34
События События – самая примитивная разновидность объектов ядра. События содержат счетчик числа пользователей (как и все объекты ядра) и две булевы переменные: одна сообщает тип данного …
Pic.35
Иллюстрация работы “события”
Pic.36
Создание события HANDLE CreateEvent( LPSECURITY_ATTRIBUTES psa, BOOL fManualReset, BOOL fInitialState, LPCTSTR pszName); HANDLE OpenEvent( DWORD fdwAccess, BOOL fInhent, LPCTSTR pszName);
Pic.37
Создание события Объект ядра “событие" создается функцией CreateEvent. Параметр fManualReset (булева переменная) сообщает системе, хотите Вы создать событие со сбросом вручную (TRUE) или с …
Pic.38
Управление событием Перевод события в свободное состояние: BOOL SetEvent (HANDLE hEvenеt); Перевод события в занятое состояние: BOOL ResetEvent (HANDLE hEvent); Освобождение события и перевод его …
Pic.39
Особенности PulseEvent Функция PulseEvent устанавливает событие и тут же переводит его обратно в сброшенное состояние. Ее вызов равнозначен последовательному вызову SetEvent и ResetEvent. Если …
Pic.40
Ожидающие таймеры Ожидающие таймеры (waitable timers) – это объекты ядра, которые самостоятельно переходят в свободное состояние в определенное время или через регулярные промежутки времени.
Pic.41
Создание ожидающего таймера HANDLE CreateWaitableTimer( LPSECURITY_ATTRIBUTES psa, BOOL fManualReset, LPCTSTR pszName); HANDLE OpenWaitableTimer( DWORD dwDesiredAccess, BOOL bInheritHandle, LPCTSTR …
Pic.42
Управление ожидающим таймером BOOL SetWaitableTimer( HANDLE hTimer, const LARGE_INTEGER *pDueTime, LONG lPeriod, LPTIMERAPCROUTINE pfnCompletionRoutine, LPVOID pvArgToCompletionRoutine, BOOI …
Pic.43
Управление ожидаемым таймером Эта функция принимает несколько параметров, в которых легко запутаться. Очевидно, что hTimer определяет нужный таймер. Следующие два параметра (pDuеТimе и lPeriod) …
Pic.44
Создание семафора HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTE psa, LONG lInitialCount, LONG lMaximumCount, LPCTRTR pszName); HANDLE OpenSemaphore( DWORD fdwAccess, BOOL bInheritHandle, LPCTSTR …
Pic.45
Управление семафором Поток получает доступ к ресурсу, вызывая одну из Wait-функций и передавая ей описатель семафора, который охраняет этот ресурс Wait-функция проверяет у семафора счетчик текущего …
Pic.46
Управление семафором Если Wait-функция определяет, что счетчик текущего числа ресурсов равен 0 (семафор занят), система переводит вызывающий поток в состояние ожидания Когда другой поток увеличит …
Pic.47
Создание мьютекса HANDLE CreateMutex( LPSECURITY_ATTRIBUTES psa, BOOL fInitialOwner, LPCTSTR pszName); HANDLE OpenMutex( DWORD fdwAccess, BOOL fInheritHandle, LPCTSTR pszName); Параметр fInitialOwner …
Pic.48
Управление мьютексом Поток получает доступ к разделяемому ресурсу, вызывая одну из Wait-функций и передавая ей описатель мьютекса, который охраняет этот ресурс. Wait-функция проверяет у мьютекса …
Pic.49
Межпроцессное взаимодействие Передача информации
Pic.50
Взаимодействие между процессами (IPC) DDE (Dynamic Data Exchange), OLE, atom (атомы) pipes (анонимные каналы), named pipes (именованные каналы) почтовые ящики (mailslots) RPC сокеты файлы, …
Pic.51
Взаимодействие между процессами (IPC)
Pic.52
Атомы Атомы - это очень простой и доступный путь IPC. Идея состоит в том, что процесс может поместить строку в таблицу атомов и эта строка будет видна другим процессам. Когда процесс помещает строку …
Pic.53
Атомы GlobalAddAtom GlobalGetAtomName GlobalFindAtom GlobalDeleteAtom
Pic.54
Сообщение WM_COPYDATA Отправитель: COPYDATASTRUCT cds; cds. cbData = (DWORD) nSize; cds. lpData = (PVOID) pBuffer; SendMessage (hWndTarget, WM_COPYDATA, (WPARAM) hWnd, (LPARAM) &cds); Получатель: …
Pic.55
Сообщение WM_COPYDATA Сообщение WM_COPYDATA позволяет приложениям копировать данные между их адресными пространствами. При этом приложения не обязательно должны быть 32-разрядными — для 16-разрядных …
Pic.56
Анонимные каналы Анонимные каналы не имеют имен. Не пригодны для обмена через сеть. Главная цель – служить каналом между родительским и дочерним процессом или между дочерними процессами. …
Pic.58
Использование анонимных каналов Главная цель – служить каналом между родительским и дочерним процессом или между дочерними процессами. Родительский пpоцесс может быть консольным или GUI-пpиложение, …
Pic.59
Создание анонимных каналов BOOL CreatePipe( LPHANDLE hReadPipe, LPHANDLE hWritePipe, LPSECURITY_ATTRIBUTES lpPipeAttributes, DWORD nSize ); ReadFile – чтение из канала WriteFile – запись в канал
Pic.60
Создание анонимных каналов pReadHandle - это указатель на переменную типа dword, которая получит дескриптов конца чтения канала. pWriteHandle - это указатель на переменную типа dword, которая …
Pic.61
Передача дескрипторов Установить паpаметp bInheritable стpуктуpы SECURITY_ATTRIBUTES в TRUE, чтобы дескрипторы могли наследоваться. Вызов функции CreateProcess с параметром blnheritHandles = TRUE …
Pic.62
Дубликаты дескрипторов BOOL DuplicateHandle( HANDLE hSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle, LPHANDLE lpTargetHandle, DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD …
Pic.63
Дубликаты дескрипторов Первый и третий параметры функции DuplicateHandle представляют собой описатели объектов ядра, специфичные для вызывающего процесса Кроме того, эти параметры должны …
Pic.64
Пример использования анонимного канала Создаем анонимный канал с помощью CreatePipe. Теперь мы должны подготовить параметры, которые передадим CreateProcess (мы используем эту функцию для загрузки …
Pic.65
NPFS (Named Pipe File System) Named Pipe File System является виртуальной файловой системой, которая управляет каналами named pipes. Каналы named pipes относятся к классу файловых объектов (API …
Pic.66
Работа с именованными каналами Серверный процесс создает канал на локальном компьютере с помощью функции программного интерфейса Win32 "CreateNamedPipe". Серверный процесс активизирует …
Pic.67
Создание именованного канала HANDLE CreateNamedPipe ( LPCTSTR lpName, DWORD dwOpenMode, DWORD dwPipeMode, DWORD nMaxInstances, DWORD nOutBufferSize, DWORD nInBufferSize, DWORD nDefaultTimeOut, …
Pic.68
Параметры создания канала lpName – имя именованного канала; dwOpenMode – определяет направление передачи, возможные варианты - PIPE_ACCESS_DUPLEX, PIPE_ACCESS_INBOUND, PIPE_ACCESS_OUTBOUND ; …
Pic.69
Подключение к именованному каналу BOOL ConnectNamedPipe ( HANDLE hNamedPipe, LPOVERLAPPED lpOverlapped ); BOOL DisconnectNamedPipe ( HANDLE hNamedPipe );
Pic.70
Подключение к именованному каналу После того как канал создан, сервер подключается к нему с помощью функции ConnectNamedPipe () и начинает ожидать подключения клиента. Необходимо отметить, что …
Pic.71
Обмен данными по именованному каналу BOOL ReadFile/WriteFile ( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped );
Pic.72
Работа с каналом и ее завершение После установления виртуального соединение серверный процесс и клиентский процесс могут обмениваться информацией при помощи пар функций "ReadFile" и …
Pic.73
Пример клиент-серверного приложения (сервер) HANDLE hPipe = CreateNamedPipe("\\. \pipe\PipeSrv",PIPE_ACCESS_DUPLEX | WRITE_DAC, PIPE_TYPE_BYTE,1,100,100,100,NULL); if …
Pic.74
Пример клиент-серверного приложения (клиент) Работа с именованным каналом на клиентской стороне еще проще чем на серверной. Для чтения и записи информации используются уже знакомые нам функции …
Pic.75
Пример клиент-серверного приложения (клиент) … char szName [] = “\ServerName\pipe\PipеSrv”; HANDLE hFile = CreateFile(szName,GENERIC_READ | GENERIC_WRITE, 0,NULL,OPEN_EXISTING,0,NULL); if …
Pic.76
Почтовые ящики (MailSlots) Mailslot является одним из механизмов, предназначенных для осуществления обмена данными между процессами (IPC). При этом процессы могут быть запущены как на одной ПЭВМ …
Pic.77
Почтовые ящики (MailSlots) Mailslot представляет собой псевдофайл, хранящийся в памяти. Для доступа к данным, содержащимся в этом псевдофайле, используются стандартные файловые функции Win32. Объект …
Pic.78
Формат имени сервера При создании объекта Mailslot сервером, имя объекта должно иметь следующий формат: \. \mailslot\[path]name Имя объекта Mailslot должно содержать две наклонные черты влево, …
Pic.79
Форматы имени клиента Для того чтобы записать сообщение в Mailslot, клиент обращается к нему по имени. При этом если клиент и сервер запушены на одной ПЭВМ, то формат имени, используемый клиентом, …
Pic.80
Клиенты, сервера и имена MailSlot cервер – является процессом, который создает и, обладает MailSlot. Когда сервер создает MailSlot, он получает указатель. Этот указатель должен использоваться, когда …
Pic.81
Создание почтового ящика на сервере HANDLE CreateMailslot ( // имя ящика LPCTSTR lpName, // максимальный размер сообщения DWORD nMaxMessageSize, // интервал-тайм аута чтения DWORD lReadTimeout, // …
Pic.82
Формат имения ящика Для открытия ящика, созданного на другом компьютере в сети, необходимо указать имя в формате \ИмяКомпьютера\mailslot\[Путь] ИмяЯщика Можно открыть доменный ящик для передачи …
Pic.83
Пример создания сервера HANDLE hSlot = NULL; hSlot = CreateMailslot ("\\computername\mailslot\messngr", 0, MAILSLOT_WAIT_FOREVER, NULL); if (hSlot != INVALID_HANDLE_VALUE) { char …
Pic.84
Создание клиента почтового ящика HANDLE hSlot = CreateFile(("\\computername\mailslot\messngr", GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if …
Pic.85
Использование mailslot В MSDN написано, что если клиент открывает слот прежде чем слот был создан сервером, то он получит INVALID_HANDLE_VALUE
Pic.86
Использование mailslot Использование мэйлслотов особенно удобно в системах такого pода, pаботающих в пpеделах локальной сети. Пpогpамма-сеpвеp создает на своем компьютере мэйлслот с именем, известным …
Pic.87
Получение информации о почтовом ящике BOOL GetMailslotInfo ( HANDLE hMailslot, // указатель на слот LPDWORD lpMaxMessageSize, // максимальный размер LPDWORD lpNextSize, // размер следующего LPDWORD …
Pic.88
Изменение настроек почтового ящика BOOL SetMailslotInfo( HANDLE hMailslot, DWORD lReadTimeout );
Pic.89
Динамически компонуемые библиотеки (DLL) Если два приложения используют одну библиотеку, то они разделяют все глобальные переменные этой библиотеки. В действительности, глобальные переменные, как и …
Pic.90
Раздел с общими данными в DLL #pragma data_seg(". shared") //Общие данные #pragma data_seg() UsersDll. def: LIBRARY "UsersDll" SECTIONS . shared READ WRITE SHARED
Pic.91
Удаленный вызов процедур (RPC - Remote Procedure Call) RPC (Remote Procedure Call) – это API, позволяющий приложению удаленно вызывать функции в других процессах как на своем, так и на удаленном …
Pic.92
Сокеты (программные гнезда)
Pic.93
Сокеты (программные гнезда) Взаимодействие процессов на основе программных гнезд основано на модели "клиент-сервер". Процесс-сервер "слушает (listens)" свое программное гнездо, …
Скачать презентацию
Если вам понравился сайт и размещенные на нем материалы, пожалуйста, не забывайте поделиться этой страничкой в социальных сетях и с друзьями! Спасибо!