Операционные системы. Программирование в операционной среде Windows

34 3.4.3. Дублирование описателей объектов Последний механизм совместного использования объектов ядра несколькими процессами - дублирование описателей ОЯ вызовом функции DuplicateHandle. Эта функция берет запись в таблице описателей одного процесса и создает ее копию в таблице другого. BOOL DuplicateHandle( HANDLE hSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle, LPHANDLE IpTargetHandle, DWORD dwDesiredAccess, BOOL binheritHandle, DWORD dwOptions); Параметр hSourceProcessHandle - дескриптор процесса, создавшего ОЯ. Параметр hSourceHandle - описатель ОЯ. Параметр hTargetProcessnandle - дескриптор процесса, получающего копию описателя ОЯ. Параметр IpTargetHandle - указатель на копию описателя ОЯ. Параметр dwDesiredAccess определяет права доступа к ОЯ. Параметр bInheritHandle определяет возможность наследования описателя ОЯ. Допустим, некий процесс имеет полный доступ и для чтения, и для записи к ОЯ «проекция файла». Из этого процесса вызывается функция, которая должна обратиться к проекции файла и считать из нее какие-то данные. С помощью функции DuplicateHandle можно создать новый описатель существующего объекта и разрешить доступ только для чтения. Потом передать этот описатель функции, которая не сможет случайно что-то записать в проекцию файла. Передача исходного описателя ОЯ возможна также через командную строку или переменную окружения. 3.5. Синхронизация потоков с помощью объектов ядра Механизмы синхронизации в пользовательском режиме обеспечивают высокое быстродействие, но им свойствен ряд ограничений. Например, Intertocked-функции оперируют только с отдельными переменными и никогда не переводят поток в состояние ожидания. Критические секции позволяют синхронизировать потоки в рамках только одного процесса. Кроме того, при использовании критических секций легко попасть в ситуацию взаимной блокировки потоков, потому что нельзя задать предельное время ожидания входа в критическую секцию. Синхронизация потоков с помощью ОЯ предоставляет гораздо больше возможностей, чем механизмы синхронизации в пользовательском режиме. С помощью ОЯ можно синхронизировать потоки разных процессов и определить время ожидания ресурса. Единственный их недостаток — меньшее быстродействие.

RkJQdWJsaXNoZXIy MTY0OTYy