- •1. Определение ос. Назначение и функции операционной системы. Место ос в структуре вычислительной системы.
- •3. Понятие ресурса. Основные ресурсы вычислительной системы. Управление ресурсами.
- •4. Критерии эффективности и классы ос.
- •8. Прерывания (понятие, классификация, обработка прерываний).
- •9. Требования, предъявляемые к современным ос.
- •10. Виртуализация. Гипервизор 1 и 2 типа. Контейнеры.
- •11. Архитектура ос. Ядро и вспомогательные модули.
- •12. Классическая архитектура ос. Монолитные и многослойные ос.
- •13. Микроядерная архитектура ос.
- •14. Процессы и потоки. Состояния потока
- •15. Планирование и диспетчеризация потоков, моменты перепланировки.
- •16. Алгоритм планирования, основанный на квантовании.
- •17. Приоритетное планирование.
- •18. Алгоритмы планирования в ос пакетной обработки: «первым пришел – первым обслужен», «кратчайшая задача – первая», «наименьшее оставшееся время выполнения».
- •Наименьшее оставшееся время выполнения
- •19. Алгоритмы планирования в интерактивных ос: циклическое, приоритетное, гарантированное, лотерейное, справедливое планирование.
- •Циклическое планирование (квантование)
- •Гарантированное планирование
- •Лотерейное планирование
- •Справедливое планирование
- •Приоритетное планирование
- •20. Алгоритм планирования Windows nt.
- •21. Алгоритмы планирования Linux: о(1), cfs.
- •22. Синхронизация процессов и потоков: цели и средства синхронизации.
- •23. Ситуация состязаний (гонки). Способы предотвращения.
- •24. Способы реализации взаимных исключений: блокирующие переменные, критические секции, мьютексы
- •25. Взаимные блокировки. Условия, необходимые для возникновения тупика.
- •26. Предотвращение взаимоблокировки. Алгоритм банкира для одного вида ресурсов.
- •27. Предотвращение взаимоблокировки. Алгоритм банкира для нескольких видов ресурсов.
- •28. Синхронизирующие объекты ос: системные семафоры, мьютексы, события, сигналы, барьеры, ждущие таймеры.
- •29. Организация обмена данными между процессами (каналы, разделяемая память, почтовые ящики, сокеты).
- •Каналы.
- •Разделяемая память
- •Почтовые ящики
- •Сокеты.
- •30. Функции ос по управлению памятью.
- •31. Алгоритмы распределения памяти без использования внешних носителей (фиксированные, динамические, перемещаемые разделы).
- •Распределение памяти динамическими разделами
- •32. Понятие виртуальной памяти Виртуализация памяти
- •Виртуальное адресное пространство - совокупность виртуальных адресов процесса. И эта совокупность может превышать объем физической памяти.
- •Структура виртуального адресного пространства
- •Виды виртуального адресного пространства:
- •33. Страничное распределение памяти.
- •34. Таблицы страниц для больших объемов памяти.
- •1 Многоуровневые таблицы страниц
- •2 Инвертированные таблицы страниц
- •35. Сегментное распределение памяти.
- •36. Сегментно-страничное распределение памяти.
- •37. Задачи ос по управлению файлами и устройствами.
- •38. Многослойная модель подсистемы ввода-вывода.
- •39. Физическая организация диска. Hdd, ssd устройства.
- •40. Файловая система. Определение, состав, типы файлов. Логическая организация файловой системы.
- •41. Физическая организация и адресация файлов.
- •42. Fat. Структура тома. Формат записи каталога. Fat12, fat16, fat32, exFat
- •43. Ufs, ext2: структура тома, адресация файлов, каталоги, индексные дескрипторы.
- •44. Ntfs: структура тома, типы файлов, организация каталогов.
- •45. Файловые операции. Процедура открытия файла.
- •46. Организация контроля доступа к файлам. Контроль доступа к файлам на примере Unix.
- •47. Отказоустойчивость файловых систем.
- •48. Избыточные дисковые подсистемы raid.
- •49. Многоуровневые драйверы.
- •50. Ускорение выполнения дисковых операций: традиционный дисковый кэш, кэш на основе механизма виртуальной памяти.
- •Классические задачи синхронизации: “производители-потребители”, “проблема обедающих философов”, “проблема спящего брадобрея”.
- •1. Официант
- •2. Иерархия вилок
- •3. Монитор
27. Предотвращение взаимоблокировки. Алгоритм банкира для нескольких видов ресурсов.
Алгоритм банкира может быть распространен на работу с несколькими ресурсами. На рис. 6.10 показано, как он работает. Здесь изображены две матрицы. Левая матрица показывает, сколько экземпляров каждого ресурса в данный момент выделено каждому из пяти процессов. Правая показывает, сколько экземпляров ресурсов все еще необходимо каждому процессу для завершения его работы. На рис. 6.5 эти матрицы назывались С и R. Как и в случае с ресурсом одного типа, процессы перед выполнением своей работы должны сообщить о своих общих потребностях в ресурсах, чтобы система в любой момент могла вычислить правую матрицу.
Три вектора, изображенные справа от матриц, показывают соответственно существующие ресурсы (вектор Е), занятые ресурсы (вектор Р) и доступные ресурсы (вектор А). Судя по значению вектора Е, в системе имеется шесть накопителей на магнитной ленте, три плоттера, четыре принтера и два привода компакт-дисков. Из них заняты в данный момент пять накопителей, три плоттера, два принтера и два привода компакт-дисков. Этот факт можно установить путем сложения значений четырех столбцов, соответствующих ресурсам, в левой матрице. Вектор доступных ресурсов — это разница между количеством присутствующих в системе ресурсов, и количеством ресурсов используемых в настоящее время.
Теперь может быть изложен алгоритм проверки состояния на безопасность.
1. Ищем в матрице R строку, соответствующую процессу, чьи неудовлетворенные потребности в ресурсах меньше или равны вектору А. Если такой строки не существует, то система в конце концов войдет в состояние взаимоблокировки, поскольку ни один процесс не сможет доработать до успешного завершения (предполагается, что процессы удерживают все ресурсы, пока не завершат свою работу).
2. Допускаем, что процесс, чья строка была выбрана, запрашивает все необходимые ему ресурсы (возможность чего гарантируется) и завершает свою работу. Отме чаем этот процесс как завершенный и прибавляем все его ресурсы к вектору А.
3. Повторяем шаги 1 и 2 до тех пор, пока либо все процессы будут помечены как завершенные (в этом случае исходное состояние может считаться безопасным), либо не останется процессов, чьи запросы могут быть удовлетворены (в этом случае возникнет взаимоблокировка).
Если в шаге 1 подходят для выбора несколько процессов, то неважно, который из них будет выбран: фонд доступных ресурсов либо увеличивается, либо в худшем случае остается таким же.
28. Синхронизирующие объекты ос: системные семафоры, мьютексы, события, сигналы, барьеры, ждущие таймеры.
В ОС есть объекты, которые предназначены не для чего больше, кроме как для синхронизации.
Системные семафоры, мьютексы, события, таймеры - специальные средства синхронизации. Кроме них могут быть использованы другие объекты ОС, придуманные (созданные) для других целей. Например, файлы, процессы, потоки..
Системные семафоры (те же семафоры Дейкстры, но реализованные на системной уровне, т.е. находящиеся в системной памяти) - используются для синхронизации потоков разных процессов.
Семафор – переменная определенного типа, которая доступна параллельным процессам для проведения над ней только двух операций:
A(S, n)– увеличить значение семафора S на величину n;
D(S, n)– если значение семафора S < n, процесс блокируется. В противном случае S = S - n;
Z(S)– процесс блокируется до тех пор, пока значение семафора S не станет равным 0.
Семафор играет роль вспомогательного критического ресурса, так как операции A и D неделимы при своем выполнении и взаимно исключают друг друга. Семафорный механизм работает по схеме, в которой сначала исследуется состояние критического ресурса, а затем уже осуществляется допуск к критическому ресурсу или отказ от него на некоторое время. Основным достоинством семафорных операций является отсутствие состояния «активного ожидания», что может существенно повысить эффективность работы мультипрограммной вычислительной системы.
Для создания семафора используется функция CreateSemaphore. Изначально все семафоры инициируются нулевым значением.
Мьютексы - средство реализации взаимного исключения (по сути это блокирующая переменная).
Раз это объект ядра, то может исп-ся для синхронизации потоков разных процессов (к ним можно обращаться из разных процессов). Побочный эффект: тратиться время на переключение (привилегированный режим).
Мьютекс – экземпляр типа pthread_mutex_t – по сути является бинарным семафором, т.е. позволяет разделять доступ к ресурсу нескольким потокам. Перед использованием необходимо инициализировать мьютекс функцией pthread_mutex_init.
Типичные ошибки, которые могут возникнуть:
EAGAIN — недостаточно необходимых ресурсов (кроме памяти) для инициализации мьютекса
ENOMEM — недостаточно памяти
EPERM — нет прав для выполнения операции
EBUSY — попытка инициализировать мьютекс, который уже был инициализирован, но не уничтожен
EINVAL — значение mutexattr не валидно
После использования мьютекса его необходимо уничтожить с помощью функции int pthread_mutex_destroy(pthread_mutex_t *mutex); В результате функция возвращает 0 в случае успеха или может возвратить код ошибки.
(Объекты-взаимоисключения (мьютексы, mutex - от MUTual EXclusion) позволяют координировать взаимное исключение доступа к разделяемому ресурсу. Сигнальное состояние объекта (т.е. состояние "установлен") соответствует моменту времени, когда объект не принадлежит ни одному потоку и его можно "захватить". Предположим, что мьютекс находится в сигнальном состоянии, в этом случае поток тут же становится его владельцем, устанавливая его в несигнальное состояние, и входит в критическую секцию. После того как поток выполнил работу с критическими данными, он «отдает» мьютекс, устанавливая его в сигнальное состояние. Если какой-либо поток ожидает его освобождения, то он становится следующим владельцем этого мьютекса, одновременно мьютекс переходит в несигнальное состояние. )
События
События используются в качестве сигналов о завершении какой-либо операции. Однако в отличие от мьютексов, они не принадлежат ни одному потоку.
Пусть, например, в некотором приложении работа организована таким образом, что один поток читает данные из файла в буфер памяти, а другие потоки обрабатывают эти данные, затем первый поток считывает новую порцию данных, а другие потоки снова ее обрабатывают и так далее. В начале работы первый поток устанавливает объект-событие в несигнальное состояние. Все остальные потоки выполнили вызов Wait(X), где X — указатель события, и находятся в приостановленном состоянии, ожидая наступления этого события. Как только буфер заполняется, первый поток сообщает об этом операционной системе, выполняя вызов Set(X). Операционная система просматривает очередь ожидающих потоков и активизирует все потоки, которые ждут этого события.
Ждущий таймер
Ждущий таймер(waitable timer) представляет собой новый тип объектов синхронизации, поддерживаемый в Windows NT версии 4.0 и выше. Это полноценный объект синхронизации, который может использоваться для организации задержки в одном или нескольких приложениях.
Ждущий таймер работает в трех режимах.
В режиме «ручного сброса» таймер переходит в установленное состояние при истечении заданной задержки и остается установленным до тех пор, пока функция SetWaitableTimer не задаст новую задержку.
В режиме «автоматического сброса» таймер переходит в установленное состояние при истечении заданной задержки и остается установленным до первого успешного вызова функции ожидания. В этом режиме он напоминает объект Event в режиме автоматического сброса, поскольку каждый раз при истечении времени задержки разрешается выполнение лишь одной нити.
Наконец, ждущий таймер может выполнять функции интервального таймера, который перезапускается с заданной задержкой после каждого срабатывания объекта.
Главная особенность, отличающая ждущие таймеры от системных, — то, что ждущие таймеры могут совместно использоваться несколькими приложениями. Например, вы можете приостановить несколько приложений в фоновом режиме так, чтобы они «просыпались» каждые несколько часов для выполнения некоторой операции.
Барьеры. Потоки взаимодействующих процессов должны выполняться поэтапно. (в какие-то моменты времени надо сделать так,чтобы все потоки, например, 1-3 этап выполнили и только после этого продолжили работу)
При инициализации барьера задается какое количество потоков (нитей) он должен остановить, соответственно, потоки, преодолевающие барьер (дошедшие до него), не могут продолжать свое выполнение пока на этот барьер не наткнется указанное при инициализации количество потоков. Барьеры предназначены для того чтобы держать потоки - члены определенной группы вместе. Наткнувшись на барьер, поток из группы не сможет продолжать выполнение, пока все члены группы не дойдут до барьера. Обычно барьеры используют для того, чтобы все потоки, выполняющие какой-то параллельный алгоритм, достигли определенной его точки прежде чем какая-либо из них двинулась дальше.
По отношению к средствам синхронизации говорят о сигнальном/несигнальном состоянии.
Например, событие сигнальным становится, когда оно произошло. Мьютекс сигнальный, когда освободился.Файл переходит в сигнальное состояние, если завершается операция записи в файл. Процессы переходят в сигнальное состояние, когда завершаются все их потоки. Поток переходит в сигнальное состояние, когда он завершается.
Две группы функций:
wait (sleep в Unix). Позволяет потоку сообщить ОС(в частности планировщику), что поток собирается синхронизировать свою работу с чем-то (т.е. он будет ждать чего-то)
set (wakeup в Unix). Манипуляция с средством синхронизации. Например, сделать так,чтобы событие произошло.
Критические секции
Один из методов синхронизации потоков состоит в использовании критических секций (critical sections). Это единственный метод синхронизации потоков, который не требует привлечения ядра Windows, то есть критическая секция не является объектом ядра. Как следствие этого этот метод может использоваться только для синхронизации потоков одного процесса. Критическая секция — это некоторый участок кода, который в каждый момент времени может выполняться только одним из потоков. Если код, используемый для инициализации массива, поместить в критическую секцию, то другие потоки не смогут войти в этот участок кода до тех пор, пока первый поток не завершит его выполнение.
