
- •Вопросы по курсу «Операционные системы» весеннего семестра 2010-2011 учебного года
- •1. Общие сведения об операционных системах, цели применения ос, структура ос.
- •2. Модель взаимодействия компонентов операционной системы.
- •3. Классификация ос.
- •4.5. Теоретические основы параллельного программирования, понятия: процесс, задача, мультизадачный режим работы ос, нить, контекст нити.
- •6. Теоретические основы параллельного программирования: классификация программных модулей; понятия реентерабельности и повторной входимости программных модулей.
- •7. Прерывания и механизмы обработки прерываний операционной системой.
- •8.9.Диспетчер задач: дисциплины диспетчеризации, критерии оценки дисциплин диспетчеризации задач.
- •10. Теоретические основы параллельного программирования: независимые и взаимодействующие процессы, понятия ресурса и критического ресурса.
- •11. Теоретические основы параллельного программирования: список условий функционирования взаимодействующих процессов, понятие тупика.
- •12. Теоретические основы параллельного программирования: принцип организации критических секций.
- •13. Теоретическая классификация видов взаимодействия процессов: сигналы, семафоры, мьютексы.
- •15. Теоретическая классификация видов взаимодействия процессов: очереди сообщений, файлы, разделяемая память, объект «ресурс».
- •16. Теоретическая классификация видов взаимодействия процессов: почтовые ящики, конвейеры.
- •17 Организация подсистемы безопасности в ос Windows: создание и открытие объектов, понятие описателя, атрибуты безопасности, права доступа, структура описателя безопасности.
- •18.Организация подсистемы безопасности в ос Windows: маркеры, привилегии пользователей, олицетворение.
- •19. Организация подсистемы безопасности в ос Windows: получение доступа к объекту.
- •20. Процессы в ос Windows: понятие Win32 api; main() и WinMain(), создание и завершение процессов и нитей, основные функции работы с процессами и нитями.
- •21. Работа с файлами в ос Windows: синхронная и асинхронная.
- •24. Таймеры ожидания в ос Windows и понятие apc
- •25. Структурная обработка исключений.
- •26. Способы управления памятью: простое непрерывное распределение, оверлейное распределение.
- •1. Простое непрерывное распределение
- •2. Оверлейное распределение (OverLay)
- •27. Способы управления памятью: распределение статическими и динамическими разделами.
- •28. Способы управления памятью: сегментная организация памяти.
- •29. Страничная организация памяти
- •30. Сегментно-страничный способ организации памяти
- •31. Таблицы физических страниц памяти в современных ос. Понятие pfn, понятие mdl.
- •32. Распределение оперативной памяти в современных компьютерах. Спецификация acpi
- •33. Распределение первого мегабайта оперативной памяти в персональных компьютерах.
- •35. Резервирование памяти с помощью функции VirtualAlloc
- •36. Работа с кучами процессов
- •37 . Динамически загружаемые библиотеки (dll). Связывание во время загрузки библиотеки.
- •38. Системные перехватчики (hook
- •40. Службы
24. Таймеры ожидания в ос Windows и понятие apc
Эти таймеры используются для выполнения определённых действий в заданное время или через определённый интервал времени.
Таймер ожидания является таким же объектом синхронизации как, например семафор, т.е. его можно дождаться с помощью ф-ций WaitFor. Таймер переходит в сигнальное состояние по достижению заданной точки во времени. Этими таймерами следует пользоваться с большей предпочтительностью, нежели оконным сообщением WM_TIMER.
Ждущий таймер создается с помощью функции CreateWaitableTimer.
HANDLE CreateWaitableTimer(
LPSECURITY_ATTRIBUTES psa,
BOOL bManualReset,
LPCTSTR pTimerName); // имя таймера
HANDLE OpenWaitableTimer(
DWORD dwDesiredAccess, // описатель таймера
BOOL bInhemtHandle, //время срабатывания
LPCTSTR pTimerName);
Положительное значение времени срабатывания даёт абсолютное время, отрицательное даёт относительное время.
Задание времени срабатывания таймера производится с помощью функции SetWaitableTimer.
Если период срабатывания таймера в функции SetWaitableTimer равен нулю, то таймер сработает лишь однажды.
TimerAPCProc(
LPVOID pArgCompletion,
DWORD dTimerLowValue, //время
DWORD dTimerLowValue); //время
Ждущие таймеры как и события бывают с ручным сбросом и синхронизирующие. Таймеры с ручным сбросом освобождают все ждущие их нити, синхронизирующие только одну.
Время измеряется в ста наносекундных интервалах начиная с 1 января 1601 года. SystemTimeToFileTime.
Структура SystemTime содержит значения: год, месяц, день, минута, секунда.
Структура FILETIME – это 8-ми байтовое целое.
Для того чтобы перевести время из текущего часового пояса в значение по Гринвичу используется ф-ция: LocalFileTimeToFileTime
Ожидание срабатывания таймера можно производить с помощью ф-ций группы WaitFor, другой способ задания APC ф-ций. Не рекомендуется делать и то и другое одновременно, поскольку если вы ждёте таймер в тревожном состоянии с помощью ф-ций с суффиксом Ex, то после срабатывания таймера произойдёт выход из ф-ции ожидания, а когда выйдете из ф-ции, то нить перестанет быть в тревожном состоянии и APC ф-ция не вызовется.
APC (Asynchronous Procedure Call) – асинхронный вызов процедуры.
С помощью ждущих таймеров можно легко программировать максимальное время ожидания поступления данных.
Существуют спец. ф-ции отмены ожидания: CancelWaitableTimer
25. Структурная обработка исключений.
Структурная обработка исключений позволяет при возникновении ошибки в программе, обработать эту ошибку и продолжить выполнение программы. Язык программирования С++ позволяет проводить такую обработку с помощью блоков try и catch. Это весьма гибкий механизм обработки исключительных ситуаций.
Его описание можно найти в любой книге по С++. Microsoft помимо стандартного обработчика исключительных ситуаций С++ заложила в свой компилятор еще один механизм обработки завершения исключений. Это пара блоков:
__try __try
__finale __except
Первый блок предназначен для обработки завершающего блока, а второй для обработки исключений.
В блоке __try производится стандартное выполнение программы. Блок __finaly выполняется всегда после блока __try. Блок __except выполняется при возникновении исключения. Любое количество блоков __try может быть вложено один в другой.
Однако каждый должен завершаться либо блоком finaly либо блоков except.
__try {
if (bNeedtoOut)
__leave;
return;
}
__finaly {
if (AbnormalTermination()) {}
else {}
}
__try {
//защищенный блок}
__except (
//фильтр исключений)
{
//обработка исключений
}
Фильтр исключений – это 1 оператор. Результатом работы этого оператора могут быть три значения 1, 0, -1.
1 – EXCEPTION_EXECUTE_HANDLER
ошибка распознана. Последствия ошибки будут ликвидированы в блоке except. Затем программа перейдет на оператор, следующий за блоком except.
0 – EXCEPTION_CONTINUE_SEARCH
Ошибка не распознана. Необходимо перейти на следующий вверх блок except.
-1 – EXCEPTION_CONTINUE_EXECUTION
Ошибка распознана и устранена. Необходимо вернуться на ту же самую машинную команду, которая вызвала ошибку.
__try {
__try {}
__except(0) {}
}
__except (1) {}
Если такого обработчика нет, то вызвать стандартный обработчик исключений ОС, который аварийно завершит программу.
Стек обработчиков исключений для каждой нити свой. Текущий обработчик исключений находится по адресу fs:0 (сегментный регистр). В ОС Windows сегментный регистр fs не указывает на общее адресное пространство процессов. Он указывает на небольшой блок памяти, выделяемый ОС отдельно для каждой нити. Этот блок называется Tread Environment Block (TEB) и он не документирован. По адресу 0 в этом блоке лежит адрес текущего обработчика исключений, который, в свою очередь, уже относится к адресному пространству процесса.
При входе в блок try{} предыдущее обращение к адресу обработчика запоминается в стеке нити и на его место записывается новое значение (адрес блока try{}). Посмотреть параметры исключения можно внутри фильтра исключений EXCEPTION_POINTER.
GetExceptionInformation ();
typedef struct {
PEXCEPTION_RECORD ExceptionRecord;
PCONTEXT ContextRecord;
} EXCEPTION_POINTER;
typedef struct _EXCEPTION_RECORD{
ULOG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETRS];
} EXEPTION_RECORD, *PEXCEPTION_RECORD;
ContextRecord – содержимое контекста регистров ЦП при исключении, который использовала данная нить.
Исключение можно вызвать намеренно. Для этого существует функция RaiseException