- •1. Поняття ос, її призначення та функції.
- •1. Понятие операционной системы. Назначение, состав и функции операционных систем.
- •2. Історія розвитку ос. Класифікація сучасних ос.
- •3. Основные принципы построения ос.
- •4. Операционные оболочки.
- •5. Драйверы и утилиты.
- •6. Процессы. Определение процесса. Классификация процессов ос.
- •4. Функциональные компоненты ос. Общая характеристика
- •7. Ресурсы. Определение ресурса. Классификация ресурсов ос.
- •3. Функціональні компоненти ос.
- •5. Требования к современным ос
- •4. Ядро ос. Привілейований режим і режим користувача. Системний виклик.
- •Рхитектура ос
- •Ядро и вспомогательные модули ос
- •Ядро в привилегированном режиме
- •Микроядерная архитектура
- •Тенденции в структурном построении ос
- •Монолитные системы
- •Многоуровневые системы
- •6. Ос та її оточення. Взаємодія ос і апаратного забезпечення. Засоби апаратної підтримки ос
- •Взаимодействие с аппаратным обеспечением
- •По сфере применения[править | править вики-текст]
- •Содержание
- •Описание и использование интерфейсов[править | править вики-текст]
- •Интерфейсы и абстрактные классы[править | править вики-текст]
- •Множественное наследование и реализация интерфейсов[править | править вики-текст]
- •8. Особливості архітектури Windows. Компоненти режиму ядра. Компоненти режиму користувача. Архитектура Windows nt
- •Режим пользователя[править | править вики-текст]
- •Режим ядра[править | править вики-текст]
- •9. Процеси і потоки в сучасних ос. Складові елементи процесів і потоків. Багатопотоковість. Стани процесів і потоків. Поток выполнения
- •Отличие от процессов[править | править вики-текст]
- •Многопоточность[править | править вики-текст]
- •10. Інтерфейс Windows api. Версії Windows api. Категорії функцій Windows api.
- •Содержание
- •Общие сведения[править | править вики-текст]
- •Содержание
- •Api как средство интеграции приложений[править | править вики-текст]
- •Сигнатура функции[править | править вики-текст]
- •Семантика функции[править | править вики-текст]
- •Api операционных систем. Проблемы, связанные с многообразием api[править | править вики-текст]
- •Структура security_attributes
- •Возвращаемые значения
- •Замечания
- •Содержание
- •Общие сведения[править | править вики-текст]
- •Секреты многопоточности: изучаем модульное тестирование в сфере мобильного программинга
- •Объект ядра Событие
- •Объект ядра Мьютекс
- •Пример работы Mutex
- •Объект ядра Семафор (semaphore)
- •Критические секции
- •Атомарные операции
- •Заключение
- •15. Потоки. Функція CreateThread. Завершення потоку. Зміна класу пріоритету процесу. Установка відносного пріоритету потоку.
- •17. Робота з файлами, каталогами і дисками в Win32. Отримання інформації про диски, вільний простір.
- •18. Функція CreateFile та її параметри. Функция CreateFile
- •Коммуникационные ресурсы
- •19. Функції Windows api для пошуку файлів. Применение функций Windows api
- •Функции LoadKeyboardLayout и UnloadKeyboardLayout
- •Функция GetLocalTime
- •Функция GetTickCount
- •Функция GlobalMemoryStatus
- •Функция Sleep
- •Функции для работы с guid
- •Функция ShellExecute
- •Функция shFileOperation
- •20. Функції Windows api для читання даних з файлу та запису в файл. Синхронні і асинхронні операції з файлами. Функции api для работы с консолью
- •Использование русского языка в консоли с помощью api
- •Чтение/запись данных в консоль/файл
- •Установка заголовка окна консоли
- •Установка цвета символов и фона в консоли
- •Установка позиции курсора
Объект ядра Событие
Событие или event — это самый примитивный объект синхронизации. По сути, это просто флаг, который может находиться либо в нейтральном состоянии, либо в сигнальном. Создать ивент можно с помощью функции CreateEvent.
Описание CreateEvent
HANDLE WINAPI CreateEvent( __in_opt LPSECURITY_ATTRIBUTES lpEventAttributes, __in BOOL bManualReset, __in BOOL bInitialState, __in_opt LPCTSTR lpName );
События имеют возможность автосброса. Для этого надо установить параметр BOOL bManualReset в значение FALSE. В этом случае при обработке ивента функцией WaitFor*** объект автоматически перейдет в нейтральное состояние. Если же bManualReset == TRUE, то сброс флага осуществляется функцией ResetEvent. События могут быть именованными и не именованными. В первом случае к ивенту можно получить доступ из другого процесса, открыв объект с помощью API OpenEvent. Такие events удобно использовать при межпроцессорной синхронизации. Также событию можно задать начальное состояние с помощью параметра BOOL bInitialState. Если он равен TRUE, то объект будет создан сразу в сигнальном состоянии.
Events в связке с WaitFor***-функциями обеспечивает простой и удобный способ синхронизации потоков.
Объект ядра Мьютекс
Мьютекс (mutex) очень похож на event с автосбросом, но, в отличие от последнего, он имеет привязку к конкретному потоку. Если мьютекс находится в сигнальном состоянии, то считается, что он свободен. Как только какой-либо тред дожидается сигнального состояния mutex с помощью функции WaitFor***, объект сбрасывается в нейтральное состояние и считается захваченным этим потоком.
В отличие от события, мьютекс имеет разные состояния для разных тредов. Так, для потока, который захватил mutex, он выглядит как свободный, и все последующие вызовы WaitFor*** вернут результат, говорящий о том, что объект находится в сигнальном состоянии. Все же другие потоки будут видеть его как захваченный объект, то есть в нейтральном состоянии и WaitFor*** API будут ждать, пока он освободится.
Перевести мьютекс обратно в сигнальное состояние можно с помощью функции ReleaseMutex. Кроме того mutex имеет счетчик ссылок. Это означает, что ReleaseMutex надо вызывать столько же раз, сколько были вызваны WaitFor***.
Если понимание того, чем мьютекс отличается от события до сих пор не пришло, то советую взглянуть на пример ниже.
Пример работы Mutex
HANDLE hMutex; void Func() { ::WaitForSingleObject(hMutex, INFINITE); … ::ReleaseMutex(hMutex); } DWORD WINAPI thread1(LPVOID param) { ::WaitForSingleObject(hMutex, INFINITE); Func(); ::ReleaseMutex(hMutex); } DWORD WINAPI thread2(LPVOID param) { ::WaitForSingleObject(hMutex, INFINITE); ... ::ReleaseMutex(hMutex); } int main(...) { hMutex = ::CreateMutex(NULL, FALSE, NULL); HANDLE hThread1 = ::CreateThread(NULL, 0, thread1, ...); HANDLE hThread2 = ::CreateThread(NULL, 0, thread2, ...); }
В этом коде поток thread1 дважды вызывает WaitForSingleObject для нашего мьютекса. Причем вызовы эти вложены друг в друга, то есть сначала два раза вызывается WaitForSingleObject, а затем — два раза ReleaseMutex.
Оба вызова проходят WaitFor*** проходят гладко, так как для thread1 наш мьютекс находится в сигнальном состоянии, несмотря на автосброс. Но этот автосброс влияет на thread2, который ожидает, пока объект станет свободным.
Если бы мы использовали ивенты, то вызов WaitForSingleObject в функции Func в первом потоке привел бы к его полному зависанию, но благодаря свойству мьютекса привязываться к контексту потока, этого не произошло.
