- •Введение
- •Эволюция ос.
- •Классификация ос.
- •Краткий обзор архитектуры Windows.
- •Основные системные файлы Windows 95, nt, 2000.
- •Средства аппаратной поддержки управления памятью.
- •Сегментная организация памяти.
- •Страничная или сегментно-страничная организация памяти.
- •Механизмы управления памятью Windows.
- •Раздел 4. В него загружаются ядро Windows nt и драйверы устройств. Этот раздел полностью защищен и по чтению, и по записи. Регионы в адресном пространстве.
- •Системные переменные и операционные системы.
- •Передача физической памяти региону.
- •Механизм выделения страниц физической памяти.
- •Выделение физической памяти под программный код.
- •Атрибуты защиты страниц.
- •Стек потока.
- •Стек потока под Windows 95, 98.
- •Функции компилятора для контроля стека.
- •Кучи (Heaps).
- •Особенности кучи в Windows 95, Windows nt.
- •Структура арены.
- •Рассмотрим функции работы с кучей.
- •Удаление кучи.
- •Выделение блока памяти в определённой куче.
- •Освобождение блока кучи.
- •Дополнительные кучи Win32 процесса.
- •Создание дополнительных куч для эффективного управления памятью.
- •Локальный доступ. Создание дополнительных куч для локализации доступа.
- •Файлы проецируемые в память (фпвп).
- •Проецирование в память exe и dll файлов.
- •Совместное использование статических данных несколькими экземплярами exe и dll модулей.
- •Иерархия функций работы с памятью.
- •Объекты kernel32.Dll.
- •Процессы.
- •Структуры данных процесса.
- •Структура блока pdb.
- •Блок kprocess.
- •Блок переменных окружения (peb).
- •Переменная ядра, связанная с процессами.
- •Последовательность действий, выполняемых функцией CreateProcess.
- •Потоки.
- •Основные функции для работы с потоками.
- •Управляющие структуры ос для работы с потоками.
- •Описание структур управления потоками.
- •Управление потоками.
- •Лекция № 11
- •Функции Win32 связанные с планированием.
- •Учёт квантов времени.
- •Сценарий планирования.
- •Поток простоя.
- •Динамическое повышение приоритета потока.
- •Планирование потоков в системах с симметричной мультипроцессорной системой (smp).
- •Синхронизация.
- •Синхронизация потоков без использования объектов синхронизации.
- •Синхронизация потоков.
- •Критические секции.
- •Работа потока с несколькими критическими секциями.
- •Синхронизация объектов.
- •События со сбросом вручную.
- •События с автоматическим сбросом.
- •Модули.
- •Структура imte.
- •Структура modref.
- •Файлы. Формат pe файла.
- •Особенности ре формата:
- •Заголовок ре файла.
- •Основные секции исполняемого файла.
- •.Idata bfc0847d .Text jmp dword ptr [00040042 … call 00014408 (Вызов GetMessage) Прикладная программа
- •Импортирование ре файлов.
- •Эскпорт ре файлов.
- •Лекция № 15
- •Ресурсы ре файла.
- •Базовые поправки ре файла.
- •Файловые системы.
- •Загрузочный сектор.
- •Особенности ntfs.
- •Новые возможности ntfs.
- •Структура ntfs на диске.
- •Кластеры.
- •Главная таблица файлов.
- •Структура файловых ссылок.
- •Записи о файлах.
- •Индексация имён файлов.
- •Битовая карта.
- •Восстанавливаемость ntfs.
- •Журнал транзакций.
- •Записи контрольной точки.
- •Восстановление данных в ntfs.
- •Проход повтора.
- •Проход отмены.
- •Отказоустойчивость ntfs.
- •Словарь терминов.
Работа потока с несколькими критическими секциями.
Если поток работает с двумя ресурсами, доступ к которым должен выпоняться последовательно, то используется несколько критических секций. При работе с несколькими критическими секциями нужно соблюдать одинаковую последовательность входа и выхода из критической секции, иначе возможны взаимные блокировки потоков, например, в приложении определены две критические секции.
Critical_Section c1;
Critical_Section c2;
// поток 1
EnterCritical_Section(&c1);
EnterCritical_Section(&c2);
LeaveCritical_Section(&c1);
// поток 2
EnterCritical_Section(&c2);
EnterCritical_Section(&c1);
LeaveCritical_Section(&c1);
LeaveCritical_Section(&c2);
Возможна взаимная блокировка.
Interlocked(…) – смотри в MSDN.
InterlockedExchange(…). С помощью этой функции изменяются значения переменной.
InterlockedExchangeAda(…). Адрес переменной изменяет содержимое переменной.
Синхронизация объектов.
Для синхронизации с использованием объектов используются функции
WaitForSingleObject(…),
WaitForMultipleObject(…).
Синхронизация с использованием таких объектов ядра, как файл, процесс, поток, консольный ввод/вывод, оповещение об изменениях в файловой системе.
Рассмотрим синхронизацию на примере проессов потоков. Процесс поток пока выпоняется находится в занятом состоянии, когда завершается переход в свободное состояние. Синхронизация возможна по завершению.
Объект mutex.
CreateMutex(…). Объект ядра мьютекс хранит идентификатор потока, занявшего этот объект, поэтому освободить объект мьютекс может только тот поток, который его занял.
Объекты мьютекс допускают рекурсивный вход.
Объект семафор.
CreateSemaphore(…). Имеют счётчик числа ресурсов, пока этот счётчик числа – это максимально возможное число этого ресурса и текущий счётчик. Доступ к ресурсам возможен до тех пор, пока текущий счётчик больше максимального. Функции WaitForSingleObject(…), WaitForMultipleObject(…) увеличивают на 1 единицу текущий счётчик ресурса. Функция ReleaseSemaphore(…) уменьшает на 1 единицу счётчик.
Пример. Программа работает с последовательными портами, доступ к которым возможен с помощью семафоров. Максимального число ресурсов равно 4.
Объект событие. Используется для оповещения об окончании какой-либо операции. Существуют два типа событий: события со сбросом вручную и с автоматическим сбросом.
Сброс – это перевод события в занятое состояние, то есть в состояние non-signaled.
CreateEvent(…). В качестве параметров указываются имя события, тип и начальное состояние.
События со сбросом вручную.
При освобождении события со сбросом вручную из состояния ожидания могут выйти одновременно несколько потоков.
Пример. Один поток считывает, другой эти данные обрабатывает.
ResetEvent(…) – переводит в состояние non-signaled.
SetEvent(…) – переводит в свободное состояние signaled.
Поток перед считыванием с помощью функции ResetEvent(…) переводит в занятое состояние, считывает и освобождает с помощью SetEvent(…). Остальные потоки ждут с помощью функции WaitForSingleObject(…).
