
- •Операционные системы (ос)
- •Назначение и функции ос [01-04]
- •Мультипрограммирование [05-08]
- •Режим работы и ос реального времени [13-16]
- •Универсальные операционные системы и ос специального назначения [17-20]
- •Сегментация виртуального адресного пространства процесса [29-32]
- •Диспетчеризация и синхронизация процессов [37-40]
- •Способы реализации мультипрограммирования [49-52]
- •Понятие прерывания [53-56]
- •Многопроцессорный режим работы [57-60]
- •Управление памятью [01, 05, …, 65]
- •Совместное использование памяти [02,06,...,66]
- •Защита памяти [03,07,...,67]
- •Механизм реализации виртуальной памяти [04,08,...,68]
- •Стратегия подкачки страниц [61-64]
- •Принципы построения и защита от сбоев и несанкционированного доступа [65-68]
- •Листинг 1. Классификация сбоев
- •Задача [01-72]
Совместное использование памяти [02,06,...,66]
При реализации различных механизмов ОС с помощью использования разными задачами одной и той же области физической памяти преследуются цели либо экономии использования каких-то ресурсов, либо организации межзадачного взаимодействия. Однако, совместное использование ресурсов задачами обычно требует дополнительной синхронизации и накладывает ограничения на способ реализации в программном коде. С целью обеспечения корректной работы механизмов в число объектов ядра включаются объекты синхронизации, а в библиотеки ядра – атомарные функции, не допускающие прерывания одной команды или группы команд.
Возможный тип совместного использования повторно входимого и реентерабельного участка кода, содержащего машинные команды – организация на его базе нескольких потоков, работающих с различными данными. Потоки разделяют контекст процесса и, в принципе, «видят» всё ВАП. Если области памяти, используемые ими для записи или модификации данных, пересекаются, то это может привести к некорректной обработке общей задачи. Если не пересекаются, достигается экономия за счёт использования одного и того же участка памяти несколькими потоками.
Один и тот же участок памяти с кодом динамически связываемой библиотеки может исполняться в контекстах разных процессов. ОС при этом ведёт счёт клиентов, использующих этот ресурс, но эти небольшие накладные расходы окупаются за счёт отсутствия необходимости размещать в памяти несколько копий модуля.
Программный канал (pipe) представляет собой кольцевой буфер, который одна задача использует для записи, а другая – для чтения. При этом требуется следить за отсутствием переполнения при записи и обеспечить запрет чтения, если все данные прочитаны.
Совместное использование для записи или модификации двумя и более процессами общего участка памяти, некоторые другие операции, например, с дескрипторами ресурсов заключаются в логические контейнеры, называемые критическими секциями, при входе в которые требуется корректно обеспечить взаимоисключение (mutual exclusion) с помощью атомарных операций, семафоров или мьютексов.
Почтовые ящики в фоново-оперативных системах (в WINNT Mailslots), uarea в UNIX, точка управления задачей (Job Control Point) в NOS/BE1 – области, совместно используемые ОС и процессами. При некорректном использовании нескольких почтовых ящиков в многопроцессных системах может образоваться тупик из-за кругового ожидания.
При порождении процесса в ОС UNIX со страничной организацией выделения дочерний процесс использует контекст родительского процесса, при этом и всю физическую память, ему доступную, в режиме, защищённом от записи, пока не будет произведена попытка какой-либо записи в память. При этом выделяется новая страница, копия старой, COW, и запись производится на неё.
Защита памяти [03,07,...,67]
Защита памяти операционной системой в той или иной степени использует аппаратные механизмы вычислительной платформы. В MSDOS, например, не использовался защищённый режим и проверялось только соблюдение границы сегмента. Современные ОС реализуют защищённый режим исполнения через механизмы, такие как сегментация и страничная организация, обеспечивая заполнение соответствующих таблиц отображения виртуального адресного пространства процесса на физическую память. При этом таблицы заполняются так, чтобы обеспечить разделение полномочий между режимами ядра и пользователя с помощью задания привилегий в полях дескрипторов сегментов. В архитектуре IA32 при обращении к памяти с помощью пары (селектор, указатель адреса) из одной из дескрипторных таблиц LDT, GDT извлекается дескриптор сегмента, сравниваются текущий (CPL), запрашиваемый уровень (RPL) и уровень привилегий дескриптора (DPL), и при невыполнении условия допуска или нарушении границы сегмента происходит аппаратное прерывание «нарушение сегментации». В UNIX CPL может принимать значения 0 (режим ядра) или 3 (режим задачи), хотя в архитектуре IA32 предусмотрены и значения 1 и 2 для организации шлюзов. Механизм страничной трансляции обеспечивает разделение адресных пространств, сбрасывая все биты достоверности в буфере ассоциативной трансляции TLB при записи в управляющий регистр CR3 базового адреса таблицы страниц, которую осуществляет ядро при переключении контекста процесса. Строки кэша страниц содержат дескрипторы страничных кадров, содержащие поля, обеспечивающие защиту от записи и исполнения данных, заполняемые операционной системой.