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