Функции ОС по управлению памятью

Под памятью (memory) в данном случае подразумевается оперативная (основная) память компьютера. В однопрограммных операционных системах основная память раз­деляется на две части. Одна часть - для операционной системы (резидентный монитор, ядро), а вторая - для выполняющейся в текущий момент времени программы. В многопрограммных ОС «пользовательская» часть памяти - важнейший ресурс вычислитель­ной системы - должна быть распределена для размещения нескольких процессов, в том числе процессов ОС. Эта задача распределения выполняется операционной системой динамически специальной подсистемой управления памятью (memory management). Эффективное управление памятью жизненно важно для многозадачных систем. Если в памяти будет находиться небольшое число процессов, то значительную часть времени процессы будут находиться в состоянии ожидания ввода-вывода и загрузка процессора будет низкой.

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

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

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

· отслеживание (учет) свободной и занятой памяти;

· первоначальное и динамическое выделение памяти процессам приложений и са­мой операционной системе и освобождение памяти по завершении процессов;

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

· полное или частичное вытеснение кодов и данных процессов из О П на диск, ког­да размеры ОП недостаточны для размещения всех процессов, и возвращение их в ОП;

· защита памяти, выделенной процессу от возможных вмешательств со стороны других процессов;

· дефрагментация памяти.

 

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

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

 

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

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

Совокупность виртуальных адресов процесса называется виртуальным адресным пространством. Диапазон адресов виртуального пространства у всех процессов один и тот же и определяется разрядностью адреса процессора (для Pentium адресное про­странство составляет объем, равный 232байт, с диапазоном адресов от 0000.000016до FFFF.FFFF16).

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

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

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