- •1) Определение операционной системы и ее функции. (виртуальная машина, управление ресурсами, задачи управления ресурсами)
- •1. Назначение и функции операционных систем
- •1.1.Основные понятия и определения
- •1.2.Управление ресурсами
- •3) Функциональные требования, предъявляемые к операционным системам и способы их реализации (расширяемость, переносимость, надежность, совместимость, безопасность, производительность).
- •5) Основные архитектуры операционных систем. (монолитные, многоуровневые, микроядерные, объектно-ориентированные, виртуальные машины)
- •Монолитные системы
- •Многоуровневые системы
- •Клиент – сервер (микроядро)
- •Объектно-ориентированный подход в проектировании ос.
- •Виртуальная машина (вм), Экзоядро
- •6) Абстракция процесса, управление процессами в многозадачной операционной системе. (определение процесса, диаграмма состояния, контекст, дескриптор, квантование, приоритетное планирование, нити)
- •7) Функциональные возможности многозадачности в ос Windows. (способы использования многозадачности, решаемые задачи)
- •8) Планировщик ос Windows. (класс и уровень приоритета, переключение контекста, «неготовые» потоки, динамический приоритет)
- •9) Эффект инверсии приоритетов. (пример, способы преодоления)
- •10) Мультипроцессорная обработка в ос Windows. (термины, вызовы api, назначение)
- •11) Эффект гонки. (пример, способ преодоления)
- •12) Средства синхронизации в режиме пользователя в ос Windows. (interlocked-функции, объект «критическая секция»)
- •13) Задача о критической секции. Алгоритм Петерсона для двух процессов. (условия задачи, объяснение принципа алгоритма)
- •14) Эффект отталкивания (голодания). (пример, модификатор volatile)
- •15) Эффект ложного разделения переменных (влияния кэш линий). (пример)
- •16) Управление объектами ядра в ос Windows. (описатель объекта, таблица описателей объектов процесса, создание, наследование, именование, дублирование)
- •17) Средства синхронизации в режиме ядра в ос Windows. (события, семафоры, мьютексы)
- •18) Эффект взаимоблокировки (возникновение тупика). (определение, условия возникновения, моделирование)
- •19) Стратегия «обнаружение-устранение» для борьбы с взаимоблокировками. (с использованием графов Холта, матриц распределения ресурсов)
- •20) Стратегия избегания блокировок. Алгоритм банкира. (диаграмма траекторий ресурсов, алгоритм банкира для одного вида ресурсов)
- •21) Стратегии предотвращения блокировок. (исключение условий в определении блокировок)
- •22) Методы управления памятью без использования внешней памяти. (фиксированные, динамические и перемещаемые разделы)
- •23) Методы управления памятью с использованием внешней памяти. (сегментный, страничный, сегментно-страничный способ)
- •24) Свопинг. Кэширование. (назначение, принцип работы механизма)
- •25) *Реализация сегментного механизма управления памятью в процессорах семейства x86.
- •26) *Реализация страничного механизма управления памятью в процессорах семейства x86. (размер и основные поля структур данных, особенности реализации)
- •27) *Средства ос Windows для управления виртуальной памятью процесса. (VirtualAlloc, структурированная обработка исключений, файлы, отображаемые в память)
15) Эффект ложного разделения переменных (влияния кэш линий). (пример)
Влияние КЭШ-линий.
volatile int x = 0; // Thread1( ) x++
volatile int y = 0; // Thread2( ) y++
Для ускорения работы с ОЗУ каждый из процессоров использует локальный КЭШ, однако подгрузка в КЭШ производится не побайтно, а загружается целиком КЭШ-линия (участок памяти, выровненный по 32-байтной границе). Если две переменные попадают в одну КЭШ-линию, то эффект от использования КЭШа пропадает: нужно обновлять данные и в ОЗУ и во втором КЭШе. Поэтому следует выровнять переменные по границам КЭШ-линии или вводить фиктивные переменные, чтобы гарантировать, что переменные не попадут в одну КЭШ-линию. Для того чтобы избежать этих проблем, в Windows реализован такой объект, как критическая секция.
16) Управление объектами ядра в ос Windows. (описатель объекта, таблица описателей объектов процесса, создание, наследование, именование, дублирование)
Создание CreateMutex()
Закрытие BOOL CloseHandle(HANDLE)
Каждый процесс имеет таблицу описателей:
При закрытии HANDLE мы удаляем описатель из таблицы и декрементируем счетчик i. Если i = 0 – уничтожение объекта.
Наследование: SECURITY_ATTRIBUTE sa;
sa.nlength = sizeof(sa);
sa.lpSecurityDescriptor=NULL; /*NULL – защита по умолчанию; определяет, кто может пользоваться объектом (при NULL – создатель процесса и администраторы) */
sa.bInHeritHandle=TRUE; /*наследовать HANDLE*/
HANDLE hMutex = CreateMutex (&sa, FALSE, NULL);
Для передачи описателя в дочерний процесс обычно используется командная строка или переменные окружения.
Если объект создается уже после создания дочернего процесса, то дочерний процесс не содержит наследованного описателя.
SetHandleInformation
GetHandleInformation
HANDLE_FLAG_INHERIT
HANDLE_FLAG_PROTECT_FROM_CLOSE (CloseHandle)
flag
Именование:
Можно задать имя:
HANDLE hMut = CreateMutex(NULL, FALSE, “SomeMutex”);
Проводится проверка, имеется ли объект ядра с нашим именем и происходит проверка типа объекта ядра.
Если объект с таким именем и типом уже существует, то функция не создает новый объект, а возвращает описатель существующего объекта (при этом 1-й и 2-й параметры игнорируются) и генерирует код оштбки.
Можно осуществить проверку на возникновение ошибки:
If (GetLastError() = = ERROR_ALREADY_EXISTS) {…}
Пространство имен объектов ядра является глобальным, если только не запущен терминал. В последнем случае к имени добавляются префиксы Global\, Local\.
Дублирование:
BOOL DuplicateHandle(
HANDLE hSourceProcessHandle,//описатель исходного процесса (GetCurrentProcess())
HANDLE hSourceHandle, //дублируемый описатель процесса-источника
HANDLE hTargetProcessHandle, //процесс-приемник
PHANDLE phTargetHandle, //описатель в процессе-приемнике
DWORD dwPesiredAccess,
DWORD dwQotions);
Особенность: нужно использовать механизм межпроцессного взаимодействия для передачи продублированного описателя (DuplicateHandle его сформирует, но нужно также поставить в известность и сам процесс-приемник).