Материал: Ответы к экзамену (Операционные системы)

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
  1. Кооперативная многозадачность.

Определение

Тип многозадачности, при котором следующая задача выполняется только после того, как текущая задача явно объявит себя готовой отдать процессорное время другим задачам. Как частный случай такое объявление подразумевается при попытке захвата уже занятого объекта мьютекс (ядро Linux), а также при ожидании поступления следующего сообщения от подсистемы пользовательского интерфейса (Windows версий до 3.x включительно, а также 16-битные приложения в Windows 9x).

Кооперативную многозадачность можно назвать многозадачностью «второй ступени», поскольку она использует более передовые методы, чем простое переключение задач, реализованное многими известными программами (например, DOS Shell из MS-DOS 5.0). При простом переключении активная программа получает все процессорное время, а фоновые приложения полностью замораживаются. При кооперативной многозадачности приложение может захватить фактически столько процессорного времени, сколько оно считает нужным. Все приложения делят процессорное время, периодически передавая управление следующей задаче.

Преимущества

Преимущества кооперативной многозадачности: отсутствие необходимости защищать все разделяемые структуры данных объектами типа критических секций и мьютексов, что упрощает программирование, особенно перенос кода из однозадачных сред в многозадачные.

Недостатки

Недостатки: неспособность всех приложений работать в случае ошибки в одном из них, приводящей к отсутствию вызова операции «отдать процессорное время». Крайне затрудненная возможность реализации многозадачной архитектуры ввода-вывода в ядре ОС, позволяющей процессору исполнять одну задачу в то время, как другая задача инициировала операцию ввода-вывода и ждет её завершения.

  1. Вытесняющая многозадачность.

Определение

Вид многозадачности, в котором операционная система сама передает управление от одной выполняемой программы другой в случае завершения операций ввода-вывода, возникновения событий в аппаратуре компьютера, истечения таймеров и квантов времени, или же поступлений тех или иных сигналов от одной программы к другой. В этом виде многозадачности процессор может быть переключен с исполнения одной программы на исполнение другой без всякого пожелания первой программы и буквально между любыми двумя инструкциями в её коде. Распределение процессорного времени осуществляется планировщиком процессов. К тому же каждой задаче может быть назначен пользователем или самой операционной системой определенный приоритет, что обеспечивает гибкое управление распределением процессорного времени между задачами (например, можно снизить приоритет ресурсоёмкой программе, снизив тем самым скорость её работы, но повысив производительность фоновых процессов). Этот вид многозадачности обеспечивает более быстрый отклик на действия пользователя.

Преимущества

  • возможность полной реализации многозадачного ввода-вывода в ядре ОС, когда ожидание завершения ввода-вывода одной программой позволяет процессору тем временем исполнять другую программу;

  • cильное повышение надежности системы в целом, в сочетании с использованием защиты памяти — идеал в виде «ни одна программа пользовательского режима не может нарушить работу ОС в целом» становится достижимым хотя бы теоретически, вне вытесняющей многозадачности он не достижим даже в теории.

  • возможность полного использования многопроцессорных и многоядерных систем.

Недостатки

  • необходимость особой дисциплины при написании кода, особые требования к его реентерабельности, к защите всех разделяемых и глобальных данных объектами типа критических секций и мьютексов.

Реализована в таких ОС, как:

• UNIX-подобные ОС,

• Windows 95/98/Me/NT, 2000/XP/Vista/7

  1. Алгоритмы переключения задач.

Механизм переключения задач:

Переключение задач осуществляется межсегментными командами JMP, CALL, IRET.

JMP <селектор> <смещение>

CALL <селектор> <смещение>

1. Микропроцессор (МП) из регистра TR определяет адрес TSS Task State Segment — сегмент состояния задачи текущей задачи и переписывает в TSS содержимое регистров текущей задачи (контекст задачи).

2. Для команд JMP и CALL МП берет селектор из команды, а для команды IRET – селектор из поля возврата TSS. Селектор загружается в регистр TR => текущей становится новая задача.

3. По селектору МП находит в памяти TSS новой задачи. Из TSS МП загружает регистры новым содержимым. Это называется переключением контекста задачи.

4. Поле <смещение> не используется.

5. В новой задаче устанавливается бит B(Busy)=1. Если была команда JMP или IRET, то бит В предыдущей задачи сбрасывается. При CALL – не сбрасывается (т.к. задача не может вызвать саму себя). Рекурсия запрещена, т.к. каждая задача имеет только один TSS. При рекурсии мы потеряем старое содержимое TSS. Но внутри задачи рекурсия разрешена.

6. В регистре CR0 есть бит TS (Task Switched). При любом переключении задач бит TS устанавливается в 1. Если при этом встретится программа сопроцессора, то вызывается исключение №7 (FPU недоступен). Бит TS аппаратно не сбрасывается. Поэтому каждая задача должна сама сбрасывать бит TS.

7. При выполнении команды CALL устанавливается бит NT (Nesting Task) в поле регистра флагов TSS. Если NT=1, то команда IRET выполняет действия, описанные выше. Если NT=0, то IRET выполняется обычным образом.

  1. Очереди задач и система приоритетов.

Важной концепцией, лежащей в основе многих вытесняющих алгоритмов планирования, является приоритетное обслуживание. Приоритетное обслуживание предполагает наличие у потоков некоторой изначально известной характеристики — приоритета, на основании которой определяется порядок их выполнения.

Некоторые процессы запускают программу, выполняющую команды, введенные пользователем. Другие процессы являются частью системы, справляясь с такими задачами, как выполнение запросов на обслуживание файлов или управление деталями работы дискового или ленточного привода. Когда происходят дисковые прерывания, система принимает решение остановить выполнение текущего процесса и запустить процесс работы с диском, заблокированный в ожидании этого прерывания. Таким образом, вместо того чтобы думать о прерываниях, мы можем думать о пользовательских процессах, процессах работы с диском, процессах работы с терминалом и т. д., которые блокируются, когда ожидают каких - то событий. Когда считана информация с диска или набран символ, процесс, ожидающий это событие, разблокируется и получает право на возобновление выполнения.

  1. Организация памяти: сегментная, страничная.

Физическая память компьютера имеет иерархическую структуру. Программа представляет собой набор сегментов в логическом адресном пространстве. ОС осуществляет связывание логических и физических адресных пространств.

Существуют две другие схемы организации управления памятью:

  • Сегментная;

  • Сегментно-страничная.

Сегментно-страничная и сегментная организация памяти позволяет легко организовать совместное использование одних и тех же данных и программного кода разными задачами. Для этого различные логические блоки памяти разных процессов отображают в один и тот же блок физической памяти, где размещается разделяемый фрагмент кода или данных.

Сегментная организация памяти

  • Сегменты могут иметь переменный размер.

  • Виртуальный адрес является двумерным программиста и ОС.

  • Виртуальный адрес состоит из двух полей: № сегмента и смещения внутри сегмента.

  • Двухмерность адреса является следствием представления пользователя о процессе не в виде линейного массива байтов, а как набор сегментов переменного размера (данные, код, стек...).

  • Логическое адресное пространство – набор сегментов.

  • Каждый сегмент имеет имя, размер и другие параметры (уровень привилегий, разрешенные виды обращений, флаги присутствия).

  • Пользователь специфицирует каждый адрес двумя величинами: именем сегмента и смещением.

  • Каждый сегмент – линейная последовательность адресов, начинающаяся с 0.

  • Максимальный размер сегмента определяется разрядностью процессора (при 32-разрядной адресации это 232 байт или 4 Гбайт).

  • Размер сегмента может меняться динамически (например, сегмент стека).

  • Логический адрес – упорядоченная пара v=(s,d), номер сегмента и смещение внутри сегмента.

  • В системах, где сегменты поддерживаются аппаратно, параметры номер сегмента и смещение внутри сегмента обычно хранятся в таблице дескрипторов сегментов, а программа обращается к этим дескрипторам по номерам-селекторам.

Сегментно-страничная организация памяти

  • Хранить в памяти сегменты большого размера целиком так же неудобно, как и хранить процесс непрерывным блоком. Напрашивается идея разбиения сегментов на страницы. При сегментно-страничной организации памяти происходит двухуровневая трансляция виртуального адреса в физический.

  • Логический адрес состоит из трех полей: номера сегмента логической памяти, номера страницы внутри сегмента и смещения внутри страницы.

  • Используются две таблицы отображения – таблица сегментов, связывающая номер сегмента с таблицей страниц, и отдельная таблица страниц для каждого сегмента

  • Линейный адрес преобразован ОС в двухмерный для удобочитаемости.

  • Пользователь задает только один адрес, который разбивается на номер страницы и смещение прозрачным для программиста образом.

  1. Память приложения: память команд, память данных, стек.

Адресное пространство каждого процесса имеет по крайней мере три сегмента:

Сегмент кода. (содержит команды из нашей программы, которые будут исполнятся.)

Сегмент данных. (Содержит данные, то бишь переменные)

Сегмент стека, про который я писал выше.

Память программ. Необходимость такой памяти вызвана тем, что микроконтроллер не содержит таких устройств памяти, как винчестер в компьютере, с которого загружается исполняемая программа. Поэтому код программы должен постоянно храниться в микроконтроллере.

Все типы памяти программ относятся к энергонезависимой памяти, или постоянной памяти (ПЗУ), содержимое которой сохраняется после выключения питания микроконтроллера.

В процессе выполнения программа считывается из этой памяти, а блок управления (дешифратор команд) обеспечивает ее декодирование и выполнение необходимых операций. Содержимое памяти программ не может меняться (перепрограммироваться) во время выполнения программы. Поэтому функциональное назначение микроконтроллера не может измениться, пока содержимое его памяти программ не будет стерто (если это возможно) и перепрограммировано (заполнено новыми командами).

Память данных. В качестве резидентной памяти данных используется статическое оперативное запоминающее устройство (ОЗУ), позволяющие уменьшать частоту тактирования до сколь угодно малых значений. Содержимое ячеек ОЗУ (в отличие от динамической памяти) сохраняется вплоть до нулевой частоты. Еще одной особенностью статического ОЗУ является возможность уменьшения напряжения питания до некоторого минимально допустимого уровня, при котором программа управления микроконтроллером не выполняться, но содержимое в ОЗУ сохраняется.

В микроконтроллерах для организации вызова подпрограмм и обработки прерываний выделяется часть памяти ОЗУ, именуемая стеком. При этих операциях содержимое программного счетчика и основных регистров (аккумулятора, регистра состояния, индексных и других регистров) сохраняется, а при возврате к основной программе восстанавливается. Напомним, что стек работает по принципу: последний пришел — первый ушел

Область памяти, занятая программой, разделена на три части: TEXT (выполняемые коды программы), DATA (статические данные программы), STACK (динамические данные). Когда ОС освобождает место в памяти за счет TEXT'а, то она не занимается сбросом его на диск. Она сразу помечает его как свободный. Действительно, когда потребуется загрузить TEXT обратно в память, его можно будет взять из самого выполняемого файла с программой. Такая экономия имеет один побочный эффект. Файл программы, которая в данный момент выполняется, невозможно уничтожить.

  1. Загрузка приложения в память, статическая память.

Виртуальная память– это способ организации памяти при котором пользователь предполагает, что нет физической оперативной памяти которая имеет определённый размер, а есть одноуровневая память, объем которой ограничен адресным пространством систем адресаций машины. Таким образом, программы разрабатываются в виртуальных адресах, а исполняются в физических.

В ранних машинах использовалось статическое распределение памяти или распределение памяти фиксированными разделами.

К каждому разделу строились очереди из задач. Маленькие задачи помещались в раздел 1, средние – в раздел 2, а большие – в раздел 3. Можно организовать одну очередь из всех задач, но могут образовываться пустые разделы или фрагментация памяти, что является недостатком такого метода.

Размещение статической памяти - память, выделенная во время компиляции в стеке или других сегментах данных. Это используется, когда количество (размер) памяти является статическим/постоянным и известно во время компиляции.

Распределение статической памяти: Компилятор выделяет требуемое пространство памяти для объявленной переменной. Используя адрес оператора, зарезервированный адрес получен, и этот адрес может быть назначен переменной указателя. Поскольку у большей части объявленной переменной есть статическая память, этот способ присвоения значения указателя переменной указателя известен как распределение статической памяти. память назначается во время компиляции.