
- •Системное по. Цели, задачи, классификация
- •Операционная система. Основные функции ос. Структура операционной системы.
- •Общая характеристика операционных систем Microsoft: семейства dos, Windows
- •Интерфейс прикладных программ (api). Apidos (программные прерывания) и Win32
- •Дисковая подсистема в архитектуре ibmpc
- •Низкоуровневая организация дисковой памяти. Сервис bios доступа к дисковой подсистеме.
- •Понятие файловой системы. Назначение, требования, функции. Способы организации фс.
- •Объекты файловой системы: файлы, директории, логические устройства, другие виды объектов.
- •Файловые системы на основе fat
- •X.2 Файловая система ntfs
- •Служебные структуры fat и их использование
- •Программный интерфейс файловой системы (функции для взаимодействия с фс, файлового ввода-вывода) – dos, Windows Функции общего назначения
- •Файловый ввод-вывод
- •14. Адресное пространство процесса (задачи).
- •15. Приложения Windows (Win 32), разновидности. Структура оконных приложений
- •1. Основные определения
- •2. Особенности приложений Win 32.
- •3. Событийное управление
- •4. Структура приложения
- •16. Окно Win32: назначение, виды, свойства. Оконные классы.
- •17. Создание и управление окнами.
- •18. Событийное управление в Win32. Сообщения и очереди сообщений Windows (Windowsmessages): назначение, структура, отсылка, доставка, обработка Сообщения и очереди сообщений.
- •19. Цикл обработки сообщений. Оконная процедура: назначение, выполнение, способы активизации и завершения.
- •20. Многозадачность, многозадачные операционные системы, особенности выполнения приложений в многозадачной среде. Модель многозадачности Win 32
- •21. Состояния процессов (многозадачная среда). Состояния процессов (потоков)
- •22. Многозадачность в win32. Планирование и выполнения программ в win32
- •23. Процессы win32. Атрибуты и состояния процессов. Порождение процессов и управление ими. Основы управления процессами Win32
- •24. Потоки и многопоточные приложения. Порождение потоков, состояние потоков, управление ими. Основы управления потоками Win32
- •25. Нити – альтернативное управление выполнением программы Управление нитями
- •26. Распределение времени выполнения программ в многозадачной системе. Приоритеты. Распределение времени между потоками (управление приоритетами)
- •27. Приоритеты процессов и потоков win32. Управление приоритетами.
- •28. Взаимодействие процессов/потоков, взаимное исключение, синхронизация (базовые сведения)
- •29. Реализация взаимного исключения. Механизм criticalsection.
- •30. Синхронизация при управлении процессами и потоками
- •31. Функция ожидания
- •32. Использование каналов и почтовых ящиков для обмена данными
- •33. Использование файловой системы для обмена данными
- •X.2.6. Использование сообщения wm_copydata
- •34. Графическая подсистема win32 – общая характеристика, основные принципы.
- •35. Основные объекты win32 gdi. Средства векторной и растровой графики
- •Растровая графика
- •36. Подсистема памяти. Основные задачи, функции, требования
- •37. Виртуальное адресное пространство, управление памятью.
- •38. Динамическое распределение памяти программами (heap). HeapApiWin32.
- •Функции работы с кучами (heap-область)
- •39. Подсистема памяти win32. Регионы(области) памяти. Группы функций api подсистемы памяти. Адресное пространство процесса.
- •40. Управление на уровне менеджера вирнуальной памяти. (vmm)
- •41. Отображение файлов в память Проецирование файлов в память
- •42. Системный реестр windows: назначение, организация, доступ
24. Потоки и многопоточные приложения. Порождение потоков, состояние потоков, управление ими. Основы управления потоками Win32
Поток Win 32 – базовый объект планирования выполнения задач и распределения процессорного времени. Каждый процесс имеет первоначально один первичный (главный, primary) поток и может затем создавать произвольное (ограниченное доступными ресурсами) количество вторичных потоков. Потоки одного процесса, равно как и потоки различных процессов, выполняются одновременно, асинхронно и независимо друг от друга.
Переключение потоков осуществляется планировщиком задач прозрачно для самих потоков. Текущее состояние потока описывается его контекстом исполнения, куда входят регистры процессора, переменные окружения, стеки ядра и пользователя. Заполнение структуры контекста происходит в те моменты, когда планировщик "отбирает" управление у потока. Продолжительность распределяемого потоку кванта времени в различных ОС семейства Win 32 составляет 10..20 мс, но величина эта недостаточно стабильна, и ориентироваться на нее, например, при измерении интервалов времени, проблематично. Уменьшение кванта повышает оперативность реагирования системы на события, но увеличивает непроизводительные затраты на переключение потоков.
Все потоки одного процесса находятся в его адресном пространстве (за исключением раздельных стеков) и могут без ограничений пользоваться глобальными переменными и объектами (при соблюдении требований синхронизации).
С точки зрения программиста поток описывается как вполне "нормальная" функция, однако вызов ее осуществляется не явно, а путем передачи ее адреса в функцию CreateThread. После этого функция начинает выполняться в новом отдельном потоке, и все ее действия, включая вызовы других функций, остаются в рамках этого потока. Поток завершается завершением его функции.
Еще один случай неявного "вхождения" в поток – вызов обработчика сообщения, который активизируется и исполняется в том же потоке, в котором данное сообщение было выбрано и перенаправлено на исполнение (см. цикл обработки сообщений).
Для идентификации потоков, как и процессов, служат идентификаторы и описатели. В отличие от описателей ряда других объектов, описатель потока нельзя использовать в другом потоке даже в пределах одного и того же процесса, следует "дублировать" его с помощью функции DuplicateHandle().
Все вторичные (порожденные) потоки создаются явно с помощью функции CreateThread(), которая действует в рамках процесса и не обращается ни к каким файлам.
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttrib, //атрибутызащитыпотока
DWORD dwStackSize, //размерстекапотока
LPTHREAD_START_ROUTINE lpStartAddr, //адресфункциипотока
LPVOID lpParam, //параметрфункциипотока
DWORD dwCreationFlags, //флагисозданияпотока
LPDWORD lpThreadId //указатель переменной – идентификатора созданного потока
)
Функция возвращает описатель созданного потока, его идентификатор записывается в переменную, адрес которой передан последним параметром вызова (может быть NULL).
Типу LPTHREAD_START_ROUTINE соответствует следующий формат функции:
DWORD WINAPI ThreadRoutineName(LPVOID lpParam).
Наличие передаваемого параметра и возвращаемого значения обязательны, но их интерпретация в программе произвольна (целое значение, указатель, игнорирование).
В качестве флагов создания потока может быть задано значение CREATE_SUSPENDED – создавать поток в приостановленном состоянии.
Доступ к потоку может быть получен функцией OpenThread(), формат которой подобен OpenProcess():
HANDLE OpenThread(
DWORD dwDesiredAccess, // запрашиваемые права доступа
BOOLbInheritHandle, // флаг разрешения наследования описателя
DWORDdwThreadId // идентификатор "заказанного" потока
)
Сам поток может получить свои идентификатор и описатель с помощью функций GetCurrentThreadId() и GetCurrentThread() соответственно.
Для управления состоянием созданного потока служат следующие функции:
ResumeThread(HANDLEhThread) – активизация или возобновление выполнения потока;
SuspendThread(HANDLEhThread) – приостановка выполнения потока.
В действительности функции управляют лишь флагом приостановки потока, который представляет собой целое неотрицательное значение: SuspendThread() увеличивает его на единицу, а ResumeThread() уменьшает, но не ниже 0. Пока значение флага больше нуля, поток остается приостановленным. Очевидно, многократные "приостановки" потока требуют такого же количества его "запусков". Обе функции возвращают предыдущее значение флага, что позволяет ориентироваться в случаях, когда оно заранее не известно.
Корректное завершение потока "изнутри" осуществляется вызовом
voidExitThread(DWORDdwExitCode).
Единственный параметр – код возврата, который подобен коду возврата процесса и может быть затем получен "извне" вызовом
BOOLGetExitCodeThread(
HANDLEhThread, // описатель завершившегося потока
LPDWORDlpdwExitCode // указатель на переменную, которой передается значение
)
Для принудительного "жесткого" завершения потока "извне" служит функция
BOOL TerminateThread(
HANDLE hThread, //описательпотока
DWORD dwExitCode //его будущий код возврата
)
Замечания относительно принудительного завершения потока те же, что и в отношении процесса.
Завершение первичного потока процесса вызывает завершение процесса в целом. Завершение процесса сопровождается завершением всех его потоков.