ЗАНЯТИЕ 29. Организация памяти современного компьютера

Со времен создания ЭВМ фон Неймана основная память в компьютерной системе организована как линейное (одномерное) адресное пространство, состоящее из последовательности слов, а позже байтов. Аналогично организована и внешняя память. Хотя такая организация и отражает особенности используемого аппарат¬ного обеспечения, она не соответствует способу, которым обычно создаются программы. Большинство программ организованы в виде модулей, некоторые из которых неизменны (только для чтения, только для исполнения), а другие содержат данные, которые могут быть изменены.
Если операционная система и аппаратное обеспечение мо¬гут эффективно работать с пользовательскими программами и дан¬ными, представленными модулями, то это обеспечивает ряд пре¬имуществ.

  1. Модули могут быть созданы и скомпилированы независимо друг от друга, при этом все ссылки из одного модуля в другой разрешаются системой во время работы программы.
  2. Разные модули могут получать разные степени защиты (только чтение, только исполнение) за счет весьма умеренных накладных расходов.
  3. Возможно применение механизма, обеспечивающего совмест¬ное использование модулей разными процессами (для случая сотрудничества процессов в работе над одной задачей).
    Память – важнейший ресурс вычислительной системы, требующий эффективного управления. Несмотря на то, что в наши дни память среднего домашнего компьютера в тысячи раз превы¬шает память больших ЭВМ 70-х годов, программы увеличиваются в размере быстрее, чем память. Достаточно сказать, что только операционная система занимает сотни Мбайт (например, Windows 2000 – до 30 млн строк), не говоря о прикладных программах и ба¬зах данных, которые могут занимать в вычислительных системах десятки и сотни Гбайт.
    Перефразированный закон Паркинсона гласит: «Программы расширяются, стремясь заполнить весь объем памяти, доступный для их поддержки» (сказано это было об ОС). В идеале программи¬сты хотели бы иметь неограниченную в размере и скорости па¬мять, которая была бы энергонезависимой, т.е. сохраняла свое со¬держимое при выключении электричества, а также недорого бы стоила. Однако реально пока такой памяти нет. В то же время на любом этапе развития технологии производства запоминающих устройств действуют следующие достаточно устойчивые соотно¬шения:
    • чем меньше время доступа, тем дороже бит;
    • чем выше емкость, тем ниже стоимость бита;
    • чем выше емкость, тем больше время доступа.
    Чтобы найти выход из сложившийся ситуации, необходимо опираться не на отдельно взятые компоненты или технологию, а выстроить иерархию запоминающих устройств, показанную на рис. 87. При перемещении слева направо происходит следующее :
    • снижается стоимость бита;
    • возрастает емкость;
    • возрастает время доступа;
    • снижается частота обращений процессора к памяти.
Рис. 87. Иерархия памяти

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

Обозначим через Т2 = 10 нс время обращения ко второму уровню памяти, а через Р – отношение числа нахождений нужного слова в быстрой памяти к числу всех обращений. Пусть в нашем примере Р = 0,95 (т.е. 95% обращений приходится на быструю па­мять, что вполне реально), тогда среднее время доступа к памяти можно записать так:

Tср = 0,95*1нс + 0,05* (1нс+10нс)=1,55нс

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

Z = 1 — pn, где n – число процессов.

На рис. 88 показана зависимость Z=p(n) для различного вре­мени ожидания завершения операции ввода-вывода (20%, 50% и 80%) и числа процессов n. Большое количество задач, необходимое для высокой загрузки процессора, требует большого объема опера­тивной памяти. В условиях, когда для обеспечения приемлемого уровня мультипрограммирования имеющейся памяти недоста­точно, был предложен метод организации вычислительного про­цесса, при котором образы некоторых процессов целиком или ча­стично временно выгружаются на диск.

Рис. 88. Загрузка процессора при различном числе процессов

Очевидно, что имеет смысл временно выгружать неактив¬ные процессы, находящиеся в ожидании каких-либо ресурсов, в том числе очередного кванта времени центрального процессора. К моменту, когда пройдет очередь выполнения выгруженного про¬цесса, его образ возвращается с диска в оперативную память. Если при этом обнаруживается, что свободного места в оперативной па¬мяти не хватает, то на диск выгружается другой процесс.
Такая подмена (виртуализация) оперативной памяти диско¬вой памятью позволяет повысить уровень мультипрограммирова¬ния, поскольку объем оперативной памяти теперь не столь жестко ограничивает число одновременно выполняемых процессов. При этом суммарный объем оперативной памяти, занимаемой образами процессов, может существенно превосходить имеющийся объем оперативной памяти.
В данном случае в распоряжение прикладного программи¬ста предоставляется виртуальная оперативная память, размер кото¬рой намного превосходит реальную память системы и ограничива¬ется только возможностями адресации используемого процесса (в ПК на базе Pentium 232= 4 Гбайт). Вообще виртуальным (кажу¬щимся) называется ресурс, обладающий свойствами (в данном слу¬чае большой объем ОП), которых в действительности у него нет.
Виртуализация оперативной памяти осуществляется сово¬купностью аппаратных и программных средств вычислительной системы (схемами процессора и операционной системой) автома¬тически без участия программиста и не сказывается на логике ра¬боты приложения.
Виртуализация памяти возможна на основе двух возможных подходов:
• свопинг (swapping) – образы процессов выгружаются на диск и возвращаются в оперативную память целиком;
• виртуальная память (virtual memory) – между оперативной па¬мятью и диском перемещаются части образов (сегменты, страницы, блоки и т.п.) процессов.
Недостатки свопинга:
• избыточность перемещаемых данных и отсюда замедление ра¬боты системы и неэффективное использование памяти;
• невозможность загрузить процесс, виртуальное пространство которого превышает имеющуюся в наличии свободную па¬мять.
Достоинство свопинга по сравнению с виртуальной памя¬тью – меньшие затраты времени на преобразование адресов в кодах программ, поскольку оно делается один раз при загрузке с диска в память (однако это преимущество может быть незначительным, т.к. выполняется при очередной загрузке только часть кода и полно¬стью преобразовывать код, может быть, и не надо).
Виртуальная память не имеет указанных недостатков, но ее ключевой проблемой является преобразование виртуальных адре¬сов в физические (почему это проблема, будет ясно дальше, а пока можно отметить существенные затраты времени на этот процесс, если не принять специальных мер).

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

Под памятью (memory) в данном случае подразумевается оперативная (основная) память компьютера. В однопрограммных операционных системах основная память разделяется на две части. Одна часть для операционной системы (резидентный монитор, ядро), а вторая – для выполняющейся в текущий момент времени программы. В многопрограммных ОС «пользовательская» часть памяти – важнейший ресурсвычислительной системы – должна быть распределена для размещения нескольких процессов, в том числе процессов ОС. Эта задача распределения выполняется опера¬ционной системой динамически специальной подсистемой управ¬ления памятью (memory management). Эффективное управление па¬мятью жизненно важно для многозадачных систем. Если в памяти будет находиться небольшое число процессов, то значительную часть времени процессы будут находиться в состоянии ожидания ввода-вывода и загрузка процессора будет низкой.
В ранних ОС управление памятью сводилось просто к за¬грузке программы и ее данных из некоторого внешнего накопителя (перфоленты, магнитной ленты или магнитного диска) в ОЗУ. При этом память разделялась между программой и ОС. На рис. 89 пока¬заны три варианта такой схемы. Первая модель раньше применя¬лась на мэйнфреймах и мини-компьютерах. Вторая схема сейчас используется на некоторых карманных компьютерах и встроенных системах, третья модель была характерна для ранних персональных компьютеров с MS-DOS.
С появлением мультипрограммирования задачи ОС, связан¬ные с распределением имеющейся памяти между несколькими од¬новременно выполняющимися программами, существенно услож¬нились.
Функциями ОС по управлению памятью в мультипрограм¬мных системах являются:

Рис. 89. Варианты распределения памяти

• отслеживание (учет) свободной и занятой памяти;
• первоначальное и динамическое выделение памяти процессам приложений и самой операционной системе и освобождение па¬мяти по завершении процессов;
• настройка адресов программы на конкретную область физической памяти;
• полное или частичное вытеснение кодов и данных процессов из ОП на диск, когда размеры ОП недостаточны для размещения всех процессов, и возвращение их в ОП;
• защита памяти, выделенной процессу, от возможных вмеша¬тельств со стороны других процессов;
• дефрагментация памяти.
Перечисленные функции особого пояснения не требуют, остановимся только на задаче преобразования адресов программы при ее загрузке в ОП.
Для идентификации переменных и команд на разных этапах жизненного цикла программы используются символьные имена, виртуальные (математические, условные, логические – все это си¬нонимы) и физические адреса (рис. 90).

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

Символьные имена присваивает пользователь при написа¬нии программ на алгоритмическом языке или ассемблере. Вирту¬альные адреса вырабатывает транслятор, переводящий программу на машинный язык. Поскольку во время трансляции неизвестно, в какое место оперативной памяти будет загружена программа, транслятор присваивает переменным и командам виртуальные (условные) адреса, считая по умолчанию, что начальным адресом программы будет нулевой адрес.
Физические адреса соответствуют номерам ячеек оператив¬ной памяти, где в действительности будут расположены перемен¬ные и команды.
Совокупность виртуальных адресов процесса называется виртуальным адресным пространством. Диапазон адресов вирту¬ального пространства у всех процессов один и тот же и определя¬ется разрядностью адреса процессора (для Pentium адресное про¬странство составляет объем, равный 232 байт, с диапазоном адре¬сов от 0000.000016 до FFFF.FFFF16).
Существует два принципиально отличающихся подхода к преобразованию виртуальных адресов в физические. В первом слу¬чае такое преобразование выполняется один раз для каждого про¬цесса во время начальной загрузки программы в память. Преобра¬зование осуществляет перемещающий загрузчик на основании имеющихся у него данных о начальном адресе физической памяти, в которую предстоит загружать программу, а также информации, предоставляемой транслятором об адресно-зависимых элементах программы.
Второй способ заключается в том, что программа загружа¬ется в память в виртуальных адресах. Во время выполнения про¬граммы при каждом обращении к памяти операционная система преобразует виртуальные адреса в физические.

Оставить комментарий

avatar
  Подписаться  
Уведомление о