🗊Презентация Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+

Нажмите для полного просмотра!
Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №1Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №2Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №3Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №4Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №5Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №6Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №7Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №8Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №9Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №10Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №11Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №12Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №13Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №14Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №15Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №16Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №17Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №18Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №19Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №20Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №21Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №22Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №23Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №24Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №25Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №26Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №27Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №28Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №29Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №30Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №31Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №32Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №33Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №34Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №35Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №36Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №37Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №38Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №39Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №40Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №41Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №42Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №43Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №44Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №45Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №46Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №47Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №48Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №49Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №50Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №51Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №52Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №53Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №54Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №55Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №56Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №57Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №58Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №59Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №60Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №61Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №62Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №63Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №64Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №65Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №66Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №67Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №68Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №69Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №70Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+, слайд №71

Содержание

Вы можете ознакомиться и скачать презентацию на тему Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000+. Доклад-сообщение содержит 71 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





Операционные системы
Межпроцессное взаимодействие
Описание слайда:
Операционные системы Межпроцессное взаимодействие

Слайд 2





Межпроцессное взаимодействие
Синхронизация потоков с использованием объектов ядра Windows 2000+
Описание слайда:
Межпроцессное взаимодействие Синхронизация потоков с использованием объектов ядра Windows 2000+

Слайд 3





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

Слайд 4





Объекты синхронизации и их состояния
Объекты синхронизации (synchronization objects) – это объекты ядра, при помощи которых поток синхронизирует свое выполнение.
В любой момент времени синхронизационный объект находится в одном из двух состояний: свободен (signaled state) или занят. 
Правила, по которым объект переходит в свободное или занятое состояние, зависят от типа этого объекта.
Описание слайда:
Объекты синхронизации и их состояния Объекты синхронизации (synchronization objects) – это объекты ядра, при помощи которых поток синхронизирует свое выполнение. В любой момент времени синхронизационный объект находится в одном из двух состояний: свободен (signaled state) или занят. Правила, по которым объект переходит в свободное или занятое состояние, зависят от типа этого объекта.

Слайд 5





Объекты синхронизации MS Windows 2000+ и их состояния
процессы 
потоки 
задания 
файлы 
консольный ввод
Описание слайда:
Объекты синхронизации MS Windows 2000+ и их состояния процессы потоки задания файлы консольный ввод

Слайд 6





Примеры функционирования объектов синхронизации
Объект-поток находится в состоянии «занят» все время существования, но устанавливается системой в состояние «свободен», когда его выполнение завершается. 
Аналогично, ядро устанавливает процесс в состояние «свободен», когда завершился его последний поток. 
В противоположность этому, объект – таймер «срабатывает» через заданное время (по истечении этого времени ядро устанавливает объект – таймер в состояние «свободен»).
Описание слайда:
Примеры функционирования объектов синхронизации Объект-поток находится в состоянии «занят» все время существования, но устанавливается системой в состояние «свободен», когда его выполнение завершается. Аналогично, ядро устанавливает процесс в состояние «свободен», когда завершился его последний поток. В противоположность этому, объект – таймер «срабатывает» через заданное время (по истечении этого времени ядро устанавливает объект – таймер в состояние «свободен»).

Слайд 7





Спящие потоки
Описание слайда:
Спящие потоки

Слайд 8





Функции ожидания
DWORD WaitForSingleObject( 
	HANDLE hObject, 
	DWORD dwMilliseconds
);
Описание слайда:
Функции ожидания DWORD WaitForSingleObject( HANDLE hObject, DWORD dwMilliseconds );

Слайд 9





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

Слайд 10





Функция множественного ожидания
Функция WaitForMultipleObjects позволяет ждать освобождения сразу нескольких объектов или какого-то одного из списка объектов.
Параметр dwCount определяет количество интересующих Вас объектов ядра Его значение должно быть в пределах от 1 до MAXIMUM_WAIT_OBJECTS (в заголовочных файлах Windows оно определено как 64). 
Параметр phObject – это указатель на массив дескрипторов объектов синхронизации. 
Параметр fWaitAll – флаг, который указывает режим ожидания всех заданных объектов ядра (TRUE), либо режим ожидания освобождения любого первого из них (FALSE).
Описание слайда:
Функция множественного ожидания Функция WaitForMultipleObjects позволяет ждать освобождения сразу нескольких объектов или какого-то одного из списка объектов. Параметр dwCount определяет количество интересующих Вас объектов ядра Его значение должно быть в пределах от 1 до MAXIMUM_WAIT_OBJECTS (в заголовочных файлах Windows оно определено как 64). Параметр phObject – это указатель на массив дескрипторов объектов синхронизации. Параметр fWaitAll – флаг, который указывает режим ожидания всех заданных объектов ядра (TRUE), либо режим ожидания освобождения любого первого из них (FALSE).

Слайд 11





Специализированные объекты синхронизации
Событие
Таймер ожидания
Семафор
Мьютекс
Описание слайда:
Специализированные объекты синхронизации Событие Таймер ожидания Семафор Мьютекс

Слайд 12





События
Событие – самая примитивная разновидность объектов синхронизации, которая просто уведомляют об окончании какой-либо операции. 
События содержат счетчик числа пользователей (как и все объекты ядра) и две булевы переменные: одна сообщает тип данного объекта-события, другая – его состояние (свободен или занят).
Объекты-события бывают двух типов: со сбросом вручную (manual-reset events) и с автосбросом (auto-reset events).
События с «ручным» сбросом нужно применять, если событие ждут несколько потоков. Только этот тип события позволяет выполнить синхронизацию нескольких потоков от одного события.
Описание слайда:
События Событие – самая примитивная разновидность объектов синхронизации, которая просто уведомляют об окончании какой-либо операции. События содержат счетчик числа пользователей (как и все объекты ядра) и две булевы переменные: одна сообщает тип данного объекта-события, другая – его состояние (свободен или занят). Объекты-события бывают двух типов: со сбросом вручную (manual-reset events) и с автосбросом (auto-reset events). События с «ручным» сбросом нужно применять, если событие ждут несколько потоков. Только этот тип события позволяет выполнить синхронизацию нескольких потоков от одного события.

Слайд 13





Сравнение работы события с ручным сбросом и автосбросом
Описание слайда:
Сравнение работы события с ручным сбросом и автосбросом

Слайд 14





Применение «событий»
Объекты-события обычно используют в том случае, когда какой-то поток выполняет инициализацию, а затем сигнализирует другому потоку, что тот может продолжить работу. 
Инициализирующий поток переводит объект «событие» в занятое состояние и приступает к своим операциям. 
Закончив, он сбрасывает событие в свободное состояние. 
Тогда другой поток, который ждал перехода события в свободное состояние, пробуждается и вновь становится планируемым.
Описание слайда:
Применение «событий» Объекты-события обычно используют в том случае, когда какой-то поток выполняет инициализацию, а затем сигнализирует другому потоку, что тот может продолжить работу. Инициализирующий поток переводит объект «событие» в занятое состояние и приступает к своим операциям. Закончив, он сбрасывает событие в свободное состояние. Тогда другой поток, который ждал перехода события в свободное состояние, пробуждается и вновь становится планируемым.

Слайд 15





Создание объекта типа «событие»
HANDLE CreateEvent (
	LPSECURITY_ATTRIBUTES lpEventAttributes, // атрибуты 					  	        // защиты 
	BOOL bManualReset, // тип сброса
	BOOL bInitialState,	    // начальное состояние 
	LPCTSTR lpName 	    // имя объекта 
);
Параметр bManualReset сообщает системе, хотите Вы создать событие со сбросом вручную (TRUE) или с автосбросом (FALSE). 
Параметр bInitialState определяет начальное состояние события – свободное (TRUE) или занятое (FALSE).
Описание слайда:
Создание объекта типа «событие» HANDLE CreateEvent ( LPSECURITY_ATTRIBUTES lpEventAttributes, // атрибуты // защиты BOOL bManualReset, // тип сброса BOOL bInitialState, // начальное состояние LPCTSTR lpName // имя объекта ); Параметр bManualReset сообщает системе, хотите Вы создать событие со сбросом вручную (TRUE) или с автосбросом (FALSE). Параметр bInitialState определяет начальное состояние события – свободное (TRUE) или занятое (FALSE).

Слайд 16





Совместное использование объекта «события» процессами
Если объект «событие» успешно создан, то CreateEvent () возвращает дескриптор объекта специфичный для конкретного процесса. 
Потоки из других процессов могут получить доступ к этому объекту: 
наследованием описателя с применением функции DuplicateHandle () (универсальный способ);
вызовом OpenEvent () c передачей в параметре lpName имени, совпадающего с указанным в аналогичном параметре функции CreateEvent ().
Описание слайда:
Совместное использование объекта «события» процессами Если объект «событие» успешно создан, то CreateEvent () возвращает дескриптор объекта специфичный для конкретного процесса. Потоки из других процессов могут получить доступ к этому объекту: наследованием описателя с применением функции DuplicateHandle () (универсальный способ); вызовом OpenEvent () c передачей в параметре lpName имени, совпадающего с указанным в аналогичном параметре функции CreateEvent ().

Слайд 17





Открытие объекта типа «событие»
HANDLE OpenEvent( 
	DWORD dwDesiredAccess, // режим доступа
	BOOL bInheritHandle, // флаг наследования
	LPCTSTR lpName // имя обьекта 
); 
Функция OpenEvent () возвращает дескриптор существующего именованного объекта события.
Вызывающий процесс может использовать возвращаемый данной функцией дескриптор в качестве аргумента любой функции, использующей дескриптор объекта события, при условии соблюдения ограничений, налагаемых значением аргумента dwDesiredAccess.
Описание слайда:
Открытие объекта типа «событие» HANDLE OpenEvent( DWORD dwDesiredAccess, // режим доступа BOOL bInheritHandle, // флаг наследования LPCTSTR lpName // имя обьекта ); Функция OpenEvent () возвращает дескриптор существующего именованного объекта события. Вызывающий процесс может использовать возвращаемый данной функцией дескриптор в качестве аргумента любой функции, использующей дескриптор объекта события, при условии соблюдения ограничений, налагаемых значением аргумента dwDesiredAccess.

Слайд 18





Режимы доступа к «событиям»
EVENT_ALL_ACCESS – полный доступ (разрешены все возможные виды доступа)
EVENT_MODIFY_STATE – обеспечивает возможность использования дескриптора объекта события в функциях SetEvent () и ResetEvent (), изменяющих состояние объекта события
SYNCHRONIZE – позволяет использовать дескриптор объекта события в любой из функций ожидания
Описание слайда:
Режимы доступа к «событиям» EVENT_ALL_ACCESS – полный доступ (разрешены все возможные виды доступа) EVENT_MODIFY_STATE – обеспечивает возможность использования дескриптора объекта события в функциях SetEvent () и ResetEvent (), изменяющих состояние объекта события SYNCHRONIZE – позволяет использовать дескриптор объекта события в любой из функций ожидания

Слайд 19





Управление «событиями»
Перевод события в свободное состояние: 
	BOOL SetEvent (HANDLE hEvent); 
Перевод события в занятое состояние: 
	BOOL ResetEvent (HANDLE hEvent); 
Освобождение события и перевод его обратно в занятое состояние: 
	BOOL PulseEvent (HANDLE hEvent);
Описание слайда:
Управление «событиями» Перевод события в свободное состояние: BOOL SetEvent (HANDLE hEvent); Перевод события в занятое состояние: BOOL ResetEvent (HANDLE hEvent); Освобождение события и перевод его обратно в занятое состояние: BOOL PulseEvent (HANDLE hEvent);

Слайд 20





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

Слайд 21





Пример использования «события» для синхронизации потоков
Описание слайда:
Пример использования «события» для синхронизации потоков

Слайд 22





Таймеры ожидания
Таймеры ожидания (waitable timers) –  это объекты ядра, которые самостоятельно переходят в свободное состояние в определенное время или через регулярные промежутки времени.
Объекты «таймеры ожидания» всегда создаются в занятом состоянии («0»).
Описание слайда:
Таймеры ожидания Таймеры ожидания (waitable timers) – это объекты ядра, которые самостоятельно переходят в свободное состояние в определенное время или через регулярные промежутки времени. Объекты «таймеры ожидания» всегда создаются в занятом состоянии («0»).

Слайд 23





Создание и открытие таймера ожидания
HANDLE CreateWaitableTimer ( 
	LPSECURITY_ATTRIBUTES lpMutexAttributes, 
				// атрибуты защиты 
	BOOL bManualReset,// тип сброса таймера,TRUE – ручной
	LPCTSTR lpName	// имя объекта
); 
HANDLE OpenWaitableTimer ( 
	DWORD fdwAccess, // режим доступа
	BOOL fInherit,            // флаг наследования 
	LPCTSTR lpName      // имя объекта 
);
Описание слайда:
Создание и открытие таймера ожидания HANDLE CreateWaitableTimer ( LPSECURITY_ATTRIBUTES lpMutexAttributes, // атрибуты защиты BOOL bManualReset,// тип сброса таймера,TRUE – ручной LPCTSTR lpName // имя объекта ); HANDLE OpenWaitableTimer ( DWORD fdwAccess, // режим доступа BOOL fInherit, // флаг наследования LPCTSTR lpName // имя объекта );

Слайд 24





Режимы доступа к таймеру
TIMER_ALL_ACCESS – полный доступ (разрешены все возможные виды доступа)
TIMER_MODIFY_STATE – определяет возможность изменения состояния таймера функциями SetWaitableTimer () и CancelWaitableTimer ()
SYNCHRONIZE – позволяет использовать дескриптор объекта таймера в любой из функций ожидания
Описание слайда:
Режимы доступа к таймеру TIMER_ALL_ACCESS – полный доступ (разрешены все возможные виды доступа) TIMER_MODIFY_STATE – определяет возможность изменения состояния таймера функциями SetWaitableTimer () и CancelWaitableTimer () SYNCHRONIZE – позволяет использовать дескриптор объекта таймера в любой из функций ожидания

Слайд 25





Управление таймером ожидания
BOOL SetWaitableTimer( 
	HANDLE hTimer, 
	const LARGE_INTEGER *pDueTime,
	LONG lPeriod, 
	LPTIMERAPCROUTINE pfnCompletionRoutine, 
	LPVOID pvArgToCompletionRoutine,
	BOOI fResume
); 
BOOL CancelWaitableTimer (HANDLE hTimer);
Описание слайда:
Управление таймером ожидания BOOL SetWaitableTimer( HANDLE hTimer, const LARGE_INTEGER *pDueTime, LONG lPeriod, LPTIMERAPCROUTINE pfnCompletionRoutine, LPVOID pvArgToCompletionRoutine, BOOI fResume ); BOOL CancelWaitableTimer (HANDLE hTimer);

Слайд 26





Запуск таймера ожидания
Параметры pDuеТimе и lPeriod функции SetWaitableTimer () задают соответственно, время когда таймер должен сработать в первый раз, и интервал, с которым должны происходить дальнейшие срабатывания. 
Если таймер должен сработать только 1 раз, то достаточно передать 0 в параметре lPeriod.
При необходимости Вы можете не выполнять синхронизацию с объектом таймера с помощью Wait-функций, а сразу вызвать некоторую функцию. Адрес этой функции и аргументы для ее вызова указываются в параметрах pfnCompletionRoutine и pvArgToCompletionRoutine. 
Параметр fResume полезен на компьютерах с поддержкой режима сна. Если этот параметр был установлен в состояние TRUE, то когда компьютер выйдет из режима сна, то пробудятся потоки, ожидавшие этот таймер.
Описание слайда:
Запуск таймера ожидания Параметры pDuеТimе и lPeriod функции SetWaitableTimer () задают соответственно, время когда таймер должен сработать в первый раз, и интервал, с которым должны происходить дальнейшие срабатывания. Если таймер должен сработать только 1 раз, то достаточно передать 0 в параметре lPeriod. При необходимости Вы можете не выполнять синхронизацию с объектом таймера с помощью Wait-функций, а сразу вызвать некоторую функцию. Адрес этой функции и аргументы для ее вызова указываются в параметрах pfnCompletionRoutine и pvArgToCompletionRoutine. Параметр fResume полезен на компьютерах с поддержкой режима сна. Если этот параметр был установлен в состояние TRUE, то когда компьютер выйдет из режима сна, то пробудятся потоки, ожидавшие этот таймер.

Слайд 27





Отмена действия таймера
Для отмены действия таймера ожидания следует использовать функцию CancelWaitableTimer (), после ее применения таймер не сработает до следующего вызова SetWaitableTimer (). 
Для переустановки текущих параметров таймера ожидания нет необходимости вызывать CancelWaitableTimer (), каждый вызов SetWaitableTimer () автоматически отменяет предыдущие настройки перед установкой новых.
Описание слайда:
Отмена действия таймера Для отмены действия таймера ожидания следует использовать функцию CancelWaitableTimer (), после ее применения таймер не сработает до следующего вызова SetWaitableTimer (). Для переустановки текущих параметров таймера ожидания нет необходимости вызывать CancelWaitableTimer (), каждый вызов SetWaitableTimer () автоматически отменяет предыдущие настройки перед установкой новых.

Слайд 28





Создание объекта типа «семафор»
HANDLE CreateSemaphore( 
	LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, 
					// атрибуты защиты 
	LONG lInitialCount, 	// начальное значение 
					// счетчика семафора 
	LONG lMaximumCount,    //  максимальное значение 				             // счетчика
	LPCTSTR lpName                // имя объекта 
);
Описание слайда:
Создание объекта типа «семафор» HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // атрибуты защиты LONG lInitialCount, // начальное значение // счетчика семафора LONG lMaximumCount, // максимальное значение // счетчика LPCTSTR lpName // имя объекта );

Слайд 29





Открытие объекта типа «семафор»
HANDLE OpenSemaphore( 
	DWORD fdwAccess, 	// режим доступа
	BOOL fInherit, 		// флаг наследования 
	LPCTSTR lpName 	// имя объекта 
);
Описание слайда:
Открытие объекта типа «семафор» HANDLE OpenSemaphore( DWORD fdwAccess, // режим доступа BOOL fInherit, // флаг наследования LPCTSTR lpName // имя объекта );

Слайд 30





Режимы доступа к семафору
SEMAPHORE_ALL_ACCESS – полный доступ (разрешены все возможные виды доступа)
SEMAPHORE_MODIFY_STATE – определяет возможность изменения значение счетчика семафора функцией ReleaseSemaphore ()
SYNCHRONIZE – позволяет использовать дескриптор объекта семафора в любой из функций ожидания
Описание слайда:
Режимы доступа к семафору SEMAPHORE_ALL_ACCESS – полный доступ (разрешены все возможные виды доступа) SEMAPHORE_MODIFY_STATE – определяет возможность изменения значение счетчика семафора функцией ReleaseSemaphore () SYNCHRONIZE – позволяет использовать дескриптор объекта семафора в любой из функций ожидания

Слайд 31





Захват семафора
Для прохождения через семафор (захвата семафора) необходимо использовать функции WaitForSingleObject () или WaitForMultipleObject ().
Если Wait-функция определяет, что счетчик семафора равен «0» (семафор занят), то система переводит вызывающий поток в состояние ожидания. Когда другой поток увеличит значение этого счетчика, система вспомнит о ждущем потоке и снова начнет выделять ему процессорное время (а он, захватив ресурс, уменьшит значение счетчика на 1).
Описание слайда:
Захват семафора Для прохождения через семафор (захвата семафора) необходимо использовать функции WaitForSingleObject () или WaitForMultipleObject (). Если Wait-функция определяет, что счетчик семафора равен «0» (семафор занят), то система переводит вызывающий поток в состояние ожидания. Когда другой поток увеличит значение этого счетчика, система вспомнит о ждущем потоке и снова начнет выделять ему процессорное время (а он, захватив ресурс, уменьшит значение счетчика на 1).

Слайд 32





Освобождение семафора
Для увеличения значения счетчика семафора приложение должно использовать функцию ReleaseSemaphore ().
Функция ReleaseSemaphore () увеличивает значение счетчика семафора, дескриптор которого передается ей через параметр hSemaphore, на значение, указанное в параметре lReleaseCount.
Предыдущее значение счетчика, которое было до использования функции ReleaseSemaphore (), записывается в переменную типа LONG. Адрес этой переменной передается функции через параметр lplPreviousCount.
Описание слайда:
Освобождение семафора Для увеличения значения счетчика семафора приложение должно использовать функцию ReleaseSemaphore (). Функция ReleaseSemaphore () увеличивает значение счетчика семафора, дескриптор которого передается ей через параметр hSemaphore, на значение, указанное в параметре lReleaseCount. Предыдущее значение счетчика, которое было до использования функции ReleaseSemaphore (), записывается в переменную типа LONG. Адрес этой переменной передается функции через параметр lplPreviousCount.

Слайд 33





Функция ReleaseSemaphore
BOOL ReleaseSemaphore( 
	HANDLE hSemaphore, // дескриптор семафора LONG lReleaseCount, // значение инкремента LPLONG lplPreviousCount // адрес переменной для 				// записи предыдущего 					// значения семафора
);
Описание слайда:
Функция ReleaseSemaphore BOOL ReleaseSemaphore( HANDLE hSemaphore, // дескриптор семафора LONG lReleaseCount, // значение инкремента LPLONG lplPreviousCount // адрес переменной для // записи предыдущего // значения семафора );

Слайд 34





Определение текущего состояния семафора
Заметим, что в операционной системе Windows не предусмотрено средств, с помощью которых можно было бы определить текущее значение семафора, не изменяя его.
Нельзя передавать 0 параметр инкремента в функцию ReleaseSemaphore ().
Можно только узнать открыт или закрыт семафор, для этого следует воспользоваться Wait-функцией с нулевым тайм-аутом ожидания.
Описание слайда:
Определение текущего состояния семафора Заметим, что в операционной системе Windows не предусмотрено средств, с помощью которых можно было бы определить текущее значение семафора, не изменяя его. Нельзя передавать 0 параметр инкремента в функцию ReleaseSemaphore (). Можно только узнать открыт или закрыт семафор, для этого следует воспользоваться Wait-функцией с нулевым тайм-аутом ожидания.

Слайд 35





Создание и открытие мьютекса
HANDLE CreateMutex( 
	LPSECURITY_ATTRIBUTES lpMutexAttributes, 
				// атрибуты защиты 
	BOOL bInitialOwner, // начальное состояние 
	LPCTSTR lpName	// имя объекта
); 
HANDLE OpenMutex( 
	DWORD fdwAccess,	 // режим доступа
	BOOL fInherit,	 // флаг наследования 
	LPCTSTR lpName 	// имя объекта 
);
Описание слайда:
Создание и открытие мьютекса HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, // атрибуты защиты BOOL bInitialOwner, // начальное состояние LPCTSTR lpName // имя объекта ); HANDLE OpenMutex( DWORD fdwAccess, // режим доступа BOOL fInherit, // флаг наследования LPCTSTR lpName // имя объекта );

Слайд 36





Режимы доступа к мьютексу
MUTEX _ALL_ACCESS – полный доступ (разрешены все возможные виды доступа)
MUTEX _MODIFY_STATE – определяет возможность изменения значение счетчика мьютекса функцией ReleaseMutex ()
SYNCHRONIZE – позволяет использовать дескриптор объекта мьютекса в любой из функций ожидания
Описание слайда:
Режимы доступа к мьютексу MUTEX _ALL_ACCESS – полный доступ (разрешены все возможные виды доступа) MUTEX _MODIFY_STATE – определяет возможность изменения значение счетчика мьютекса функцией ReleaseMutex () SYNCHRONIZE – позволяет использовать дескриптор объекта мьютекса в любой из функций ожидания

Слайд 37





Управление мьютексом
Для захвата мьютекса необходимо использовать одну из Wait-функций.
Для освобождения мьютекса используется функция ReleaseMutex ().
	
	BOOL ReleaseMutex (HANDLE hMutex);
Описание слайда:
Управление мьютексом Для захвата мьютекса необходимо использовать одну из Wait-функций. Для освобождения мьютекса используется функция ReleaseMutex (). BOOL ReleaseMutex (HANDLE hMutex);

Слайд 38





Межпроцессное взаимодействие
Критические секции в Win32 API
Описание слайда:
Межпроцессное взаимодействие Критические секции в Win32 API

Слайд 39





Критические секции
В составе API ОС Windows имеются специальные и эффективные функции для организации входа в критическую секцию (Critical Section) и выхода из нее потоков одного процесса в режиме пользователя. 
Критическая секция позволяет добиться решения задачи взаимного исключения – в случае невозможности входа в критический участок поток переходит в состояние ожидания. Впоследствии, когда такая возможность появится, поток будет «разбужен» и сможет сделать попытку входа в критическую секцию.
Описание слайда:
Критические секции В составе API ОС Windows имеются специальные и эффективные функции для организации входа в критическую секцию (Critical Section) и выхода из нее потоков одного процесса в режиме пользователя. Критическая секция позволяет добиться решения задачи взаимного исключения – в случае невозможности входа в критический участок поток переходит в состояние ожидания. Впоследствии, когда такая возможность появится, поток будет «разбужен» и сможет сделать попытку входа в критическую секцию.

Слайд 40





Функции Win32 API для работы с критическими секциями
Для работы с критическими секциями используют функции:
InitializeCriticalSection – создание КС;
DeleteCriticalSection – освобождение ресурсов КС;
EnterCriticalSection – вход в КС;
LeaveCriticalSection – освобождение КС;
TryEnterCriticalSection – проверка КС.
Эти функции имеют в качестве параметра предварительно проинициализированную структуру типа CRITICAL_SECTION.
Описание слайда:
Функции Win32 API для работы с критическими секциями Для работы с критическими секциями используют функции: InitializeCriticalSection – создание КС; DeleteCriticalSection – освобождение ресурсов КС; EnterCriticalSection – вход в КС; LeaveCriticalSection – освобождение КС; TryEnterCriticalSection – проверка КС. Эти функции имеют в качестве параметра предварительно проинициализированную структуру типа CRITICAL_SECTION.

Слайд 41





Структура типа CRITICAL_SECTION 
typedef struct _RTL_CRITICAL_SECTION 
{ 
	PRTL_CRITICAL_SECTION_DEBUG DebugInfo; // исп. ОС
	LONG LockCount; 		// счетчик блокировок 
	LONG RecursionCount; 	// счетчик повторного захвата 
	HANDLE OwningThread;	// ID потока, 
				       	// владеющего секцией 	
	HANDLE LockSemaphore; 	// дескриптор события
	ULONG_PTR SpinCount; 	// кол-во холостых циклов 
				         	// перед вызовом ядра 
} 
RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;
Описание слайда:
Структура типа CRITICAL_SECTION typedef struct _RTL_CRITICAL_SECTION { PRTL_CRITICAL_SECTION_DEBUG DebugInfo; // исп. ОС LONG LockCount; // счетчик блокировок LONG RecursionCount; // счетчик повторного захвата HANDLE OwningThread; // ID потока, // владеющего секцией HANDLE LockSemaphore; // дескриптор события ULONG_PTR SpinCount; // кол-во холостых циклов // перед вызовом ядра } RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;

Слайд 42





Основные поля структуры CRITICAL_SECTION
Поле LockCount увеличивается на единицу при каждом вызове EnterCriticalSection() и уменьшается при каждом вызове LeaveCriticalSection().
Поле OwningThread содержит ID потока-владельца или «0» для незанятых секций. 
Поле RecursionCount хранит количество повторных входов в критическую секцию одним и тем же потоком-владельцем. Для освобождения секции необходимо вызывать функцию LeaveCriticalSection () столько же раз, сколько раз была вызвана функция EnterCriticalSection ().
Поле LockSemaphore содержит дескриптор объекта синхронизации типа «событие», функционирующий в режиме автосброса, и реализующий конкурентный доступ к секции со стороны нескольких потоков.
Описание слайда:
Основные поля структуры CRITICAL_SECTION Поле LockCount увеличивается на единицу при каждом вызове EnterCriticalSection() и уменьшается при каждом вызове LeaveCriticalSection(). Поле OwningThread содержит ID потока-владельца или «0» для незанятых секций. Поле RecursionCount хранит количество повторных входов в критическую секцию одним и тем же потоком-владельцем. Для освобождения секции необходимо вызывать функцию LeaveCriticalSection () столько же раз, сколько раз была вызвана функция EnterCriticalSection (). Поле LockSemaphore содержит дескриптор объекта синхронизации типа «событие», функционирующий в режиме автосброса, и реализующий конкурентный доступ к секции со стороны нескольких потоков.

Слайд 43





Вход в свободную секцию
Если при попытке входа в критическую секцию, LockCount уже равен 0, т.е. секция свободна:
поле LockCount увеличивается на 1;
в поле OwningThread записывает ID текущего потока, который может быть получен с помощью функции GetCurrentThreadId ().
текущий поток продолжает выполнение – функция EnterCriticalSection() немедленно возвращает управление.
Описание слайда:
Вход в свободную секцию Если при попытке входа в критическую секцию, LockCount уже равен 0, т.е. секция свободна: поле LockCount увеличивается на 1; в поле OwningThread записывает ID текущего потока, который может быть получен с помощью функции GetCurrentThreadId (). текущий поток продолжает выполнение – функция EnterCriticalSection() немедленно возвращает управление.

Слайд 44





Вход в занятую секцию
При попытке входа в занятую критическую секцию, (LockCount > 0) проверяется поле OwningThread: 
если OwningThread совпадает с ID текущего потока, то имеет место рекурсивный захват, и RecursionCount просто увеличивается на единицу, а EnterCriticalSection() возвращает управление немедленно. 
иначе текущий поток проверяет поле LockSemaphore. Если поле LockSemaphore равно 0, то поток создает событие LockSemaphore в сброшенном состоянии. Далее поток вызывает WaitForSingleObject (LockSemaphore) и ожидает пока поток, захвативший критическую секцию, не вызовет LeaveCriticalSection() количество раз равное значению поля RecursionCount.
Описание слайда:
Вход в занятую секцию При попытке входа в занятую критическую секцию, (LockCount > 0) проверяется поле OwningThread: если OwningThread совпадает с ID текущего потока, то имеет место рекурсивный захват, и RecursionCount просто увеличивается на единицу, а EnterCriticalSection() возвращает управление немедленно. иначе текущий поток проверяет поле LockSemaphore. Если поле LockSemaphore равно 0, то поток создает событие LockSemaphore в сброшенном состоянии. Далее поток вызывает WaitForSingleObject (LockSemaphore) и ожидает пока поток, захвативший критическую секцию, не вызовет LeaveCriticalSection() количество раз равное значению поля RecursionCount.

Слайд 45





Освобождение секции
Поток-владелец при вызове LeaveCriticalSection() уменьшает поле RecursionCount на единицу и проверяет его. 
Если значение этого поля стало равным 0, а LockCount > 0, то это значит, что есть как минимум один поток, ожидающий готовности события LockSemaphore. 
В этом случае поток-владелец вызывает SetEvent (LockSemaphore), что дает возможность пробудиться первому по очереди из ожидающих потоков и выполнить вход в уже свободную критическую секцию.
Описание слайда:
Освобождение секции Поток-владелец при вызове LeaveCriticalSection() уменьшает поле RecursionCount на единицу и проверяет его. Если значение этого поля стало равным 0, а LockCount > 0, то это значит, что есть как минимум один поток, ожидающий готовности события LockSemaphore. В этом случае поток-владелец вызывает SetEvent (LockSemaphore), что дает возможность пробудиться первому по очереди из ожидающих потоков и выполнить вход в уже свободную критическую секцию.

Слайд 46





Иллюстрация использования критической секции
Описание слайда:
Иллюстрация использования критической секции

Слайд 47





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

Слайд 48





Пример использования критической секции
CRITICAL_SECTION cs; 
DWORD WINAPI SecondThread() 
{ 
	InitializeCriticalSection(&cs); EnterCriticalSection(&cs); 
	//…критический участок кода 
	LeaveCriticalSection(&cs); 
}
Описание слайда:
Пример использования критической секции CRITICAL_SECTION cs; DWORD WINAPI SecondThread() { InitializeCriticalSection(&cs); EnterCriticalSection(&cs); //…критический участок кода LeaveCriticalSection(&cs); }

Слайд 49





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

Слайд 50





Опасный код
Поток 1.
EnterCriticalSection(&cs1); 
EnterCriticalSection(&cs2); 
//…критический участок кода 
LeaveCriticalSection(&cs2); 
LeaveCriticalSection(&cs1);
Описание слайда:
Опасный код Поток 1. EnterCriticalSection(&cs1); EnterCriticalSection(&cs2); //…критический участок кода LeaveCriticalSection(&cs2); LeaveCriticalSection(&cs1);

Слайд 51





Правила хорошего тона
Критические секции должны быть короткими.
Критических секций не должно быть много.
Критическая секция не должна быть одна на весь код.
Описание слайда:
Правила хорошего тона Критические секции должны быть короткими. Критических секций не должно быть много. Критическая секция не должна быть одна на весь код.

Слайд 52





Реализация критических секций
Функции EnterCriticalSection () и LeaveCriticalSection () реализованы на основе атомарных Interlocked-функций, поэтому они более производительны, чем мьютексы!!!
Описание слайда:
Реализация критических секций Функции EnterCriticalSection () и LeaveCriticalSection () реализованы на основе атомарных Interlocked-функций, поэтому они более производительны, чем мьютексы!!!

Слайд 53





Сравнение инструментов синхронизации Windows 2000+
Описание слайда:
Сравнение инструментов синхронизации Windows 2000+

Слайд 54





Межпроцессное взаимодействие
Атомарные операции и lockless программирование
Описание слайда:
Межпроцессное взаимодействие Атомарные операции и lockless программирование

Слайд 55





Lockless программирование
Lockless программирование – разработка неблокирующих многопоточных приложений.
Отказ от использования блокирующих примитивов типа мьютексов и даже критических секций для доступа к разделяемым данным.
Достоинство – повышенная производительность многопоточных приложений на многоядерных процессорах.
Описание слайда:
Lockless программирование Lockless программирование – разработка неблокирующих многопоточных приложений. Отказ от использования блокирующих примитивов типа мьютексов и даже критических секций для доступа к разделяемым данным. Достоинство – повышенная производительность многопоточных приложений на многоядерных процессорах.

Слайд 56





Атомарные операции как lockless-инструмент
Простейшим способом lockless-программирования является активное использованием атомарных операций при конкурентном доступе нескольких  потоков к общим переменным.
В достаточно частых случаях необходимо обеспечить конкурентный доступ к какой-либо целочисленной переменной, являющейся счетчиком. Тогда бывает достаточно просто обеспечить атомарность выполнения операций увеличения, уменьшения или изменения значения переменной.
Описание слайда:
Атомарные операции как lockless-инструмент Простейшим способом lockless-программирования является активное использованием атомарных операций при конкурентном доступе нескольких потоков к общим переменным. В достаточно частых случаях необходимо обеспечить конкурентный доступ к какой-либо целочисленной переменной, являющейся счетчиком. Тогда бывает достаточно просто обеспечить атомарность выполнения операций увеличения, уменьшения или изменения значения переменной.

Слайд 57





Виды атомарных операций
Все инструкции вида Операция Регистр-Регистр можно считать атомарными так как регистры за пределами вычислительного процессорного ядра не видны. 
Загрузка данных из памяти по выровненному адресу в регистр общего назначения. 
Сохранение данных из регистра общего назначения в память по выровненному адресу.
Специальные операции для атомарной работы (например, cmpxchg).
Многие команды вида Чтение-Модификация-Запись могут быть сделаны искусственно атомарными с помощью операции блокировки шины (префикс lock).
Описание слайда:
Виды атомарных операций Все инструкции вида Операция Регистр-Регистр можно считать атомарными так как регистры за пределами вычислительного процессорного ядра не видны. Загрузка данных из памяти по выровненному адресу в регистр общего назначения. Сохранение данных из регистра общего назначения в память по выровненному адресу. Специальные операции для атомарной работы (например, cmpxchg). Многие команды вида Чтение-Модификация-Запись могут быть сделаны искусственно атомарными с помощью операции блокировки шины (префикс lock).

Слайд 58





Реализация атомарных операций в Windows 2000+
Для увеличения значения целочисленных переменных –InterlockedIncrement, InterlockedIncrement64.
Для уменьшения значения целочисленных переменных  – InterlockedDecrement, InterlockedDecrement64.
Для изменения значений целочисленных переменных  – InterlockedExchange, InterlockedExchange64, InterlockedExchangeAdd, InterlockedExchangePointer.
Для изменения значений целочисленных переменных со сравнением – InterlockedCompareExchange, InterlockedCompareExchangePointer.
Описание слайда:
Реализация атомарных операций в Windows 2000+ Для увеличения значения целочисленных переменных –InterlockedIncrement, InterlockedIncrement64. Для уменьшения значения целочисленных переменных – InterlockedDecrement, InterlockedDecrement64. Для изменения значений целочисленных переменных – InterlockedExchange, InterlockedExchange64, InterlockedExchangeAdd, InterlockedExchangePointer. Для изменения значений целочисленных переменных со сравнением – InterlockedCompareExchange, InterlockedCompareExchangePointer.

Слайд 59





Пример кода с использованием атомарной операции
	static DWORD	array [100];
	…
	for (int i = 0; i < 100; i++)
		InterlockedIncrement(array+i);
Описание слайда:
Пример кода с использованием атомарной операции static DWORD array [100]; … for (int i = 0; i < 100; i++) InterlockedIncrement(array+i);

Слайд 60





Эффект переупорядочивания
Поток 1:
	
	result = 7;
flag = TRUE;
Описание слайда:
Эффект переупорядочивания Поток 1: result = 7; flag = TRUE;

Слайд 61





Переупорядочивание и модель памяти
Чтение или запись не всегда будет происходить в том порядке, который указан в вашем коде. 
Переупорядочивать операции могут компилятор, исполняемая среда и процессор.
Говоря о переупорядочивании, мы приходим к термину модели памяти (memory consistency model или просто memory model).
Описание слайда:
Переупорядочивание и модель памяти Чтение или запись не всегда будет происходить в том порядке, который указан в вашем коде. Переупорядочивать операции могут компилятор, исполняемая среда и процессор. Говоря о переупорядочивании, мы приходим к термину модели памяти (memory consistency model или просто memory model).

Слайд 62





«Сильная» и «слабая» модели памяти
Модель памяти, в которой нет переупорядочиваний чтения и записи будет считаться сильной (strong), а модель памяти, где возможны любые переупорядочивания чтения и записи принято считать слабой (weak). 
При этом слабые модели обеспечивают наибольшую производительность за счет возможных оптимизаций, но и порождают большое количество проблем при программировании.
Описание слайда:
«Сильная» и «слабая» модели памяти Модель памяти, в которой нет переупорядочиваний чтения и записи будет считаться сильной (strong), а модель памяти, где возможны любые переупорядочивания чтения и записи принято считать слабой (weak). При этом слабые модели обеспечивают наибольшую производительность за счет возможных оптимизаций, но и порождают большое количество проблем при программировании.

Слайд 63





Сводная таблица для некоторых архитектур
Описание слайда:
Сводная таблица для некоторых архитектур

Слайд 64





Барьеры памяти и оптимизации
Для борьбы с переупорядочиванием применяются так называемые барьеры памяти (memory barrier или memory fence). 
В случае барьера для компилятора применяют еще и термин барьер оптимизации (optimization barrier). 
Барьеры могут быть как явными, так и не явными (с точки зрения программиста).
Кроме того барьеры могут быть полными, двухсторонними и односторонними.
Описание слайда:
Барьеры памяти и оптимизации Для борьбы с переупорядочиванием применяются так называемые барьеры памяти (memory barrier или memory fence). В случае барьера для компилятора применяют еще и термин барьер оптимизации (optimization barrier). Барьеры могут быть как явными, так и не явными (с точки зрения программиста). Кроме того барьеры могут быть полными, двухсторонними и односторонними.

Слайд 65





Полные барьеры
Полный барьер (full fence) предотвращает любые переупорядочивания операций чтения или записи через него. 
Можно говорить о том, что все операции чтения и записи до полного барьера будут завершены, по отношению к операциям, расположенным после барьера. 
Данный барьер предлагает использование инструкции mfence для x86/x64 архитектуры.
Описание слайда:
Полные барьеры Полный барьер (full fence) предотвращает любые переупорядочивания операций чтения или записи через него. Можно говорить о том, что все операции чтения и записи до полного барьера будут завершены, по отношению к операциям, расположенным после барьера. Данный барьер предлагает использование инструкции mfence для x86/x64 архитектуры.

Слайд 66





Двухсторонние барьеры
Двусторонние барьеры (Store fence и Load fence) предотвращают переупорядочивание лишь одного вида операций. 
Барьер записи (store fence) не позволяет переупорядочивать через себя операции записи. 
Барьер чтения (load fence) не позволяет переупорядочивать через себя операции чтения соответственно. 
На x86/x64 архитектурах данные барьеры реализованы в инструкциях lfence и sfence.
Описание слайда:
Двухсторонние барьеры Двусторонние барьеры (Store fence и Load fence) предотвращают переупорядочивание лишь одного вида операций. Барьер записи (store fence) не позволяет переупорядочивать через себя операции записи. Барьер чтения (load fence) не позволяет переупорядочивать через себя операции чтения соответственно. На x86/x64 архитектурах данные барьеры реализованы в инструкциях lfence и sfence.

Слайд 67





Односторонние барьеры
Односторонние барьеры обычно реализуют одну из двух семантик – write release (store release) или read acquire (load acquire).
Write release семантика предотвращает любое переупорядочивание чтения и записи через барьер до барьера (запрет ↓), но не предотвращает переупорядочивания после него.
Read acquire семантика предотвращает переупорядочивание чтения и записи через барьер после барьера (запрет ↑), но не предотвращает переупорядочивание до него.
Описание слайда:
Односторонние барьеры Односторонние барьеры обычно реализуют одну из двух семантик – write release (store release) или read acquire (load acquire). Write release семантика предотвращает любое переупорядочивание чтения и записи через барьер до барьера (запрет ↓), но не предотвращает переупорядочивания после него. Read acquire семантика предотвращает переупорядочивание чтения и записи через барьер после барьера (запрет ↑), но не предотвращает переупорядочивание до него.

Слайд 68





Управление переупорядочиванием в MS VC
MS VC для предотвращения переупорядочивания инструкций со стороны компилятора предлагает использовать _ReadBarrier(), _WriteBarrier(), _ReadWriteBarrier(). 
Эти функции не предотвращают переупорядочивание на уровне процессора, они являются лишь инструментом более тонкого контроля над оптимизациями со стороны компилятора.
Для предотвращения переупорядочивания инструкций со стороны процессора предлагает макрос MemoryBarrier(), который является полным барьером и предотвращает переупорядочивание как чтения, так и записи. Исходный код этого макроса можно увидеть в MSDN. 
Описание слайда:
Управление переупорядочиванием в MS VC MS VC для предотвращения переупорядочивания инструкций со стороны компилятора предлагает использовать _ReadBarrier(), _WriteBarrier(), _ReadWriteBarrier(). Эти функции не предотвращают переупорядочивание на уровне процессора, они являются лишь инструментом более тонкого контроля над оптимизациями со стороны компилятора. Для предотвращения переупорядочивания инструкций со стороны процессора предлагает макрос MemoryBarrier(), который является полным барьером и предотвращает переупорядочивание как чтения, так и записи. Исходный код этого макроса можно увидеть в MSDN. 

Слайд 69





Неявные барьеры в MS VC 2005
В случае MS VC 2005+ ключевое слово volatile приобретает значение, выходящее за рамки С++ стандарта. 
Запись в volatile переменную всегда реализует семантику одностороннего барьера write release. 
Чтение из volatile переменной всегда реализует семантику одностороннего барьера read acquire. 
Причем оба эти неявных барьера реализуются как для компилятора, так и для процессора. 
http://msdn.microsoft.com/en-us/library/windows/desktop/ee418650%28v=vs.85%29.aspx
Описание слайда:
Неявные барьеры в MS VC 2005 В случае MS VC 2005+ ключевое слово volatile приобретает значение, выходящее за рамки С++ стандарта. Запись в volatile переменную всегда реализует семантику одностороннего барьера write release. Чтение из volatile переменной всегда реализует семантику одностороннего барьера read acquire. Причем оба эти неявных барьера реализуются как для компилятора, так и для процессора. http://msdn.microsoft.com/en-us/library/windows/desktop/ee418650%28v=vs.85%29.aspx

Слайд 70





Пример решения проблемы переупорядочивания
Поток 1:
	result = 7; // store
	_WriteBarrier();
flag = TRUE; // store
Описание слайда:
Пример решения проблемы переупорядочивания Поток 1: result = 7; // store _WriteBarrier(); flag = TRUE; // store

Слайд 71





Производительность lockless приложений
MemoryBarrier () занимает 20-90 циклов. 
InterlockedIncrement () занимает 36-90 циклов. 
Вхождение или освобождение критической секции может занимать 40-100 циклов. 
Захват или освобождение мьютекса может занимать 750-2500 циклов.
Описание слайда:
Производительность lockless приложений MemoryBarrier () занимает 20-90 циклов. InterlockedIncrement () занимает 36-90 циклов. Вхождение или освобождение критической секции может занимать 40-100 циклов. Захват или освобождение мьютекса может занимать 750-2500 циклов.



Похожие презентации
Mypresentation.ru
Загрузить презентацию