Задачи операционной системы

По управлению памятью

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

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

Функции ОС по управлению памятью в мультипрограммной системе следующие:

 отслеживание свободной и занятой памяти;

 выделение памяти процессам и освобождение памяти по завершении процес­сов;

 вытеснение кодов и данных процессов из оперативной памяти на диск (пол­ное или частичное), когда размеры основной памяти не достаточны для раз­мещения в ней всех процессов, и возвращение их в оперативную память, ко­гда в ней освобождается место;

 настройка адресов программы на конкретную область физической памяти.

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

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

Защита памяти – это еще одна важная задача операционной системы, которая состоит в том, чтобы не позволить выполняемому процессу записывать или чи­тать данные из памяти, назначенной другому процессу. Эта функция, как прави­ло, реализуется программными модулями ОС в тесном взаимодействии с аппа­ратными средствами.

 

Типы адресов

 

Для идентификации переменных и команд на разных этапах жизненного цикла программы используются символьные имена (метки), виртуальные адреса и фи­зические адреса (рис. 1).

Символьные имена присваивает пользователь при написании программы на алгоритмическом языке или ассемблере.

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

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

 

 

Рис. 1. Типы адресов

Совокупность виртуальных адресов процесса называется виртуальным адресным пространством. Диапазон возможных адресов виртуального пространства у всех процессов является одним и тем же. Например, при использовании 32-разрядных виртуальных адресов этот диапазон задается границами 0000000016и FFFFFFFF16. Тем не менее каждый процесс имеет собственное виртуальное ад­ресное пространство – транслятор присваивает виртуальные адреса переменным и кодам каждой программе независимо (рис. 2).

 

Рис. 2. Виртуальные адресные пространства нескольких программ

 

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

В разных операционных системах используются разные способы структуриза­ции виртуального адресного пространства. В одних ОС виртуальное адресное пространство процесса подобно физической памяти представлено в виде непре­рывной линейной последовательности виртуальных адресов. Такую структуру адресного пространства называют также плоской (flat). При этом виртуальным адресом является единственное число, представляющее собой смещение отно­сительно начала (обычно это значение 000…000) виртуального адресного про­странства (рис 3, а). Адрес такого типа называют линейным виртуальным ад­ресом

В других ОС виртуальное адресное пространство делится на части, называемые сегментами (или секциями, или областями, или другими терминами). В этом случае помимо линейного адреса может быть использован виртуальный адрес, представляющий собой пару чисел (n, m), где n определяет сегмент, а m – сме­щение внутри сегмента (рис. 3, б).

 

 

Рис. 3. Типы виртуальных адресных пространств:

а) плоское; б) сегментированное

 

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

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

Существуют два принципиально отличающихся подхода к преобразованию виртуальных адресов в физические.

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

Второй способ заключается в том, что программа загружается в память в неизмененном виде в виртуальных адресах, т. е. операнды инструкций и адреса пере­ходов имеют те значения, которые выработал транслятор. В наиболее простом случае, когда виртуальная и физическая память процесса представляют собой единые непрерывные области адресов, операционная система выполняет преоб­разование виртуальных адресов в физические по следующей схеме. При загруз­ке операционная система фиксирует смещение действительного расположения программного кода относительно виртуального адресного пространства. Во время выполнения программы при каждом обращении к оперативной памяти выполня­ется преобразование виртуального адреса в физический. Схема такого преобра­зования показана на рис. 4. Пусть, например, операционная система использует линейно-структурированное виртуальное адресное пространство и некото­рая программа, работающая под управлением этой ОС, загружена в физическую память начиная с физического адреса S. ОС запоминает значение начального смещения S и во время выполнения программы помещает его в специальный ре­гистр процессора. При обращении к памяти виртуальные адреса данной програм­мы преобразуются в физические путем прибавления к ним смещения S. Напри­мер, при выполнении инструкции MOV пересылки данных, находящихся по адресу VA, виртуальный адрес VA заменяется физическим адресом VA+S.

 

Рис. 4. Схема динамического преобразования адресов

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

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

Необходимо различать максимально возможное виртуальное адресное простран­ство процесса и назначенное (выделенное) процессу виртуальное адресное про­странство. В первом случае речь идет о максимальном размере виртуального адресного пространства, определяемом архитектурой компьютера, на котором работает ОС, и, в частности, разрядностью его схем адресации (32-битная, 64-бит­ная и т. п.). Например, при работе на компьютерах с 32-разрядными процессорами Intel Pentium операционная система может предоставить каждому процессу вир­туальное адресное пространство до 4 Гбайт (232). Однако это значение представ­ляет собой только потенциально возможный размер виртуального адресного пространства, который редко на практике бывает необходим процессу. Процесс использует только часть доступного ему виртуального адресного пространства.

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

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

Сегодня для машин универсального назначения типична ситуация, когда объем виртуального адресного пространства превышает доступный объем оперативной памяти. В таком случае операционная система для хранения данных виртуально­го адресного пространства процесса, не помещающихся в оперативную память, ис­пользует внешнюю память, которая в современных компьютерах представлена жесткими дисками (рис. 5, а). Именно на этом принципе основана виртуаль­ная память – наиболее совершенный механизм, используемый в операционных системах для управления памятью.

 

Рис. 5. Соотношение объемов виртуального адресного пространства и физической памяти:а) виртуальное адресное пространство превосходит объем физической памяти; б) виртуальное адресное пространство меньше объема физической памяти

 

Однако соотношение объемов виртуальной и физической памяти может быть и обратным. Так, в мини-компьютерах 80-х годов разрядности поля адреса нередко не хватало для того, чтобы охватить всю имеющуюся оперативную память. Не­сколько процессов могло быть загружено в память одновременно и целиком (рис. 5, б).

Необходимо подчеркнуть, что виртуальное адресное пространство и виртуаль­ная память – это различные механизмы и они не обязательно реализуются в операционной системе одновременно. Можно представить себе ОС, в которой поддерживаются виртуальные адресные пространства для процессов, но отсутст­вует механизм виртуальной памяти. Это возможно только в том случае, если размер виртуального адресного пространства каждого процесса меньше объема физической памяти.

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

Обычно виртуальное адресное пространство процесса делится на две непрерыв­ные части: системную и пользовательскую. В некоторых ОС (например, Win­dows NT, OS/2) эти части имеют одинаковый размер – по 2 Гбайт, хотя в прин­ципе деление может быть и другим, например 1 Гбайт – для ОС и 2 Гбайт – для прикладных программ. Часть виртуального адресного пространства каждо­го процесса, отводимая под сегменты ОС, является идентичной для всех процес­сов. Поэтому при смене активного процесса заменяется только вторая часть вир­туального адресного пространства, содержащая его индивидуальные сегменты, как правило, – коды и данные прикладной программы. Архитектура современных процессоров отражает эту особенность структуры виртуального ад­ресного пространства, например в процессорах Intel Pentium существует два типа системных таблиц – одна для описания сегментов, общих для всех процес­сов, а другая для описания индивидуальных сегментов данного процесса. При смене процесса первая таблица остается неизменной, а вторая заменяется новой.

Обычно аппаратура налагает свои ограничения на порядок использования виртуального адресного пространства. Некоторые процессоры предусматривают для определенной области системной части адресного про­странства особые правила отображения на физическую память. При этом вирту­альный адрес прямо отображается на физический адрес (последний либо полно­стью соответствует виртуальному адресу, либо равен его части). Такая особая область памяти не подвергается страничному вытеснению, и поскольку достаточно трудоемкая процедура преобразования адресов исключается, то доступ к располагаемым здесь кодам и данным осуществляется очень быстро.