Как операционная система работает с памятью

Обновлено: 07.07.2024

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

  • Функции управления памятью в ОС
  • Типы адресов
  • Методы распределения памяти в ОС
  • Принцип кэширования данных в ОС

Содержание

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

Операционная система решает следующие задачи:

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

Типы адресов

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

Символьные имена

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

Виртуальные адреса

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

Физические адреса

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

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

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

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

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

Для того чтобы проще было понять принцип работы современной операционной системы, обратимся к истории, вспомним — с чего всё начиналось. Тем более что с тех пор практически ничего не изменилось. Увеличилось быстродействие процессора, объемы жестких дисков и оперативной памяти, возросла скорость совершаемых операций, но базовые принципы работы компьютера остались неизменными.

Изначально в компьютере всегда существовала базовая система ввода-вывода — BIOS, которая даёт компьютеру элементарные понятия восприятия внутренних устройств, способности распознавать команды, вводимые с клавиатуры, в том числе основные функции: F1, F2, F3, F4, F5, а также функцию вывода результатов на экран.

Итак, при включении компьютера, в первую очередь автоматически происходила загрузка BIOS, после чего уже человек должен был загрузить программу работы с дисками, позволяющую компьютеру производить чтение информации с диска, а также запись на диск. Программа имела название Disc Operating System или сокращенно DOS, что в переводе означает Дисковая Операционная Система. После загрузки DOS, требовалось загрузить именно ту программу, с которой пользователь собирался работать.

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

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

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

На сегодняшний день, наиболее популярны всего три операционных системы. Лидером с большим опережением является Windows (около 95% пользователей), на втором месте находится MacOS (около 4% аудитории), третье место определить гораздо сложнее, поскольку, процент пользователей находится в пределах статистической погрешности. Наверное, всё-же, это платформа Linux, хотя утверждать что-либо сложно.

Здесь следует отметить, что Windows и Linux могут устанавливаться на все компьютеры, в то время, как MacOS предназначена для компьютеров производства компании Apple.

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

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

В OS/2 программисту доступно 32-разрядное линейное адресное пространство. Как же организована работа с ним?

Общие принципы распределения памяти

Как известно, при работе в IBM OS/2 программисту доступно 32-разрядное линейное (плоское) адресное пространство со страничной организацией, т. е. все операции с памятью производятся над страницами заданного размера. Каждому запущенному процессу OS/2 выделяет виртуальное адресное пространство размером 512 Мбайт, т. е. максимальный адрес, доступный программе, равен 0x1FFFFFFF (три старших разряда 32-разрядного указателя не используются).

Распределение виртуальной памяти отделено от ее отображения на физическую память компьютера. Благодаря этому разные процессы выполняются "бок о бок", но их виртуальные адресные пространства полностью изолированы друг от друга. Конечно, память, которую процесс фактически может занять при выполнении, ограничена размером ОЗУ компьютера и объемом свободного пространства в том разделе жесткого диска, где расположен файл страничной подкачки SWAPPER.DAT.

Младшие 64 Кбайт адресного пространства зарезервированы для нужд операционной системы, так что минимальный адрес равен 0x10000; он соответствует точке начала EXE-модуля. Вся остальная память делится на совместно используемую (ее должно быть не менее 64 Мбайт) и частную память процесса. Частная память, доступ к которой может получить только процесс-владелец, начинается с младших адресов и растет вверх. Совместно используемая, наоборот, выделяется начиная со старших адресов и растет вниз. Она доступна процессу всегда, даже если реально им не используется.

Выделение и фиксация памяти

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

Операция, обратная фиксации, - расфиксирование (открепление), обратная выделению - освобождение. Закончив работу с виртуальной памятью, ее обязательно следует освободить, чтобы вернуть соответствующие ресурсы операционной системе. Если программа завершится, не освободив память, возникнет так называемая "утечка памяти": операционная система будет считать фактически свободную память используемой. Характерным признаком утечки памяти является увеличение объема файла SWAPPER.DAT.

Защищенные страницы, очевидно, нельзя использовать как ограничители, контролирующие границы массивов: если, скажем, запросить память для массива из 512 однобайтовых элементов, система выделит целую страницу, т. е. 4096 байт, так что обращение к элементу номер 513 не вызовет нарушения защиты. Основная функция защищенных страниц - обеспечивать автоматическое возрастание стека. Для массива, размер которого должен увеличиваться в процессе работы программы, можно выделить и зафиксировать две страницы, первая из которых будет доступной для чтения и записи, а вторая - защищенной. При попытке выйти за пределы отведенной страницы произойдет нарушение защиты, и в ответ операционная система (если только программа не обрабатывает эту ошибку самостоятельно) попытается зафиксировать защищенную страницу и отметить как защищенную следующую за ней. В случае неудачи возникает ошибка "Невозможно нарастить стек", после чего программа сможет продолжить работу, но для размещения массива в ее распоряжении будет всего 4096 байт.

Способы работы с памятью

В OS/2 существует несколько способов работы с памятью, или, иначе, типов памяти. Это объекты в памяти, куча, локальная память нити и совместно используемая память. Рассмотрим их особенности.

Объекты в памяти

Основным способом работы с памятью в OS/2 является использование объектов в памяти (memory objects). Объект в памяти всегда состоит из целого числа страниц: при его создании запрошенное число байтов округляется в большую сторону до ближайшего значения, кратного 4 Кбайт. Внутри объекта память резервируется блоками от 1 байта до размера всего объекта.

Для выделения памяти объектам служит функция DosAllocMem, для ее освобождения - функция DosFreeMem, для фиксации и открепления - функция DosSetMem.

При работе с OS/2 рекомендуется не менять размер объектов в памяти, а сразу выделять достаточно большой "разреженный" объект, в котором затем по мере необходимости фиксировать и откреплять порции нужного размера. Например, если программе в большинстве случаев должно хватить около 512 Кбайт памяти, но при определенных условиях потребуется 5 Мбайт, нужно поступить следующим образом:

- при инициализации программы выделить для нее 5 Мбайт (функция DosAllocMem); - зафиксировать первые 512 Кбайт или какую-то их часть (DosSetMem); - продолжить работу программы, по мере необходимости фиксируя и открепляя память; когда потребуется 5 Мбайт, зафиксировать их, а после использования открепить (DosSetMem); - по окончании работы программы освободить память (DosFreeMem).

Куча (heap) - это область внутри объекта в памяти, из которой программа может выделять небольшие блоки; размер блока округляется в большую сторону до ближайшего значения, кратного 8 байтам.

Программисты, пишущие на Си, могут воспользоваться библиотечными функциями управления кучей - new, delete, malloc, strdup, free. Собственные функции менеджера кучи OS/2 называются DosSubSetMem, DosSubUnsetMem, DosSubAllocMem и DosSubFreeMem. Программа инициализирует объект в памяти, вызывая функцию DosSubSetMem, а затем выделяет и освобождает память внутри него с помощью соответственно DosSubAllocMem и DosSubFreeMem. В листинге содержится фрагмент программы, в котором создается объект для подвыделения памяти (размер объекта 8192 байт) и затем выделяются два небольших блока памяти.

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

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

Локальная память нити

Локальная память нити управления представляет собой небольшую (не более 32 двойных слов, т. е. 128 байт) область специфической памяти, которая отводится нити при инициализации и обычно используется для хранения небольшого числа указателей. Она выделяется функцией DosAllocThreadLocalMemory и освобождается функцией DosFreeThreadLocalMemory.

Совместно используемая память

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

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

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

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

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

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

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

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

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

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

Типы адресов

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

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

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

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

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

6.3. Распределение памяти

Существует ряд базовых вопросов управления памятью, которые в различных ОС решаются по -разному. Например, следует ли назначать каждому процессу одну непрерывную область физической памяти или можно выделять память участками? Должны ли сегменты программы, загруженные в память , находиться на одном месте в течение всего периода выполнения процесса или их можно время от времени сдвигать? Что делать, если сегменты программы не помещаются в имеющуюся память ? Как сократить затраты ресурсов системы на управление памятью ? Имеется и ряд других не менее интересных проблем управления памятью [5, 10, 13, 17].

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

Классификация методов распределения памяти


Рис. 6.5. Классификация методов распределения памяти

На рис. 6.6 показаны два примера фиксированного распределения. Одна возможность состоит в использовании разделов одинакового размера. В этом случае любой процесс, размер которого не превышает размера раздела, может быть загружен в любой доступный раздел. Если все разделы заняты и нет ни одного процесса в состоянии готовности или работы, ОС может выгрузить процесс из любого раздела и загрузить другой процесс, обеспечивая тем самым процессор работой.

Варианты фиксированного распределения памяти


Рис. 6.6. Варианты фиксированного распределения памяти

При использовании разделов с одинаковым размером имеются две проблемы.

  1. Программа может быть слишком велика для размещения в разделе. В этом случае программист должен разрабатывать программу, использующую оверлеи, чтобы в любой момент времени требовался только один раздел памяти. Когда требуется модуль, отсутствующий в данный момент в ОП, пользовательская программа должна сама его загрузить в раздел памяти программы. Таким образом, в данном случае управление памятью во многом возлагается на программиста.
  2. Использование ОП крайне неэффективно. Любая программа, независимо от ее размера, занимает раздел целиком. При этом могут оставаться неиспользованные участки памяти большого размера. Этот феномен появления неиспользованной памяти называется внутренней фрагментацией (internal fragmentation).

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

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

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

Недостаток заключается в том, что отдельные очереди для разделов могут привести к неоптимальному распределению памяти системы в целом. Например, если в некоторый момент времени нет ни одного процесса размером от 7 до 12 Мбайт, то раздел размером 12 Мбайт будет пустовать, в то время как он мог бы использоваться меньшими процессами. Поэтому более предпочтительным является использование одной очереди для всех процессов. В момент, когда требуется загрузить процесс в ОП, выбирается наименьший доступный раздел, способный вместить данный процесс.

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

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

Для преодоления сложностей, связанных с фиксированным распределением, был разработан альтернативный подход, известный как динамическое распределение. В свое время этот подход был применен фирмой IBM в операционной системе для мэйнфреймов в OS/MVT ( мультипрограммирование с переменным числом задач – Multiprogramming With a Variable number of Tasks). Позже этот же подход к распределению памяти использован в ОС ЕС ЭВМ [12] .

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

Вариант использования памяти

Поскольку процесс 4 меньше процесса 2, появляется еще свободный участок памяти. После того как в некоторый момент времени все процессы оказались неактивными, но стал готовым к работе процесс 2, свободного места в памяти для него не находится, а ОС вынуждена выгрузить процесс 1, чтобы освободить необходимое место и разместить процесс 2 в ОП. Как показывает данный пример, этот метод хорошо начинает работу, но плохо продолжает. В конечном счете, он приводит к наличию множества мелких свободных участков памяти, в которых нет возможности разместить какой-либо новый процесс. Это явление называется внешней фрагментацией ( external fragmentation ), что отражает тот факт, что сильно фрагментированной становится память , внешняя по отношению ко всем разделам.

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

Перечислим функции операционной системы по управлению памятью в этом случае.

  1. Перемещение всех занятых участков в сторону старших или младших адресов при каждом завершении процесса или для вновь создаваемого процесса в случае отсутствия раздела достаточного размера.
  2. Коррекция таблиц свободных и занятых областей.
  3. Изменение адресов команд и данных, к которым обращаются процессы при их перемещении в памяти, за счет использования относительной адресации .
  4. Аппаратная поддержка процесса динамического преобразования относительных адресов в абсолютные адреса основной памяти.
  5. Защита памяти, выделяемой процессу, от взаимного влияния других процессов.

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

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

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

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

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

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

Как работает оперативная память и зачем она нужна - иконка статьи

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

Ну, а сейчас, приступаем.

  • Вводная
  • Общее
  • Как же работает оперативная память?
  • Подробнее
  • Зачем нужна эта самая оперативная память?
  • Компоновка модулей
  • Температура, лаг, энергозависимость и вообще "на пальцах"
  • Послесловие

Вводная

Перед каждым пользователем рано или поздно (или никогда) встает вопрос модернизации своего верного «железного коня». Некоторые сразу меняют «голову» - процессор, другие - колдуют над видеокартой, однако, самый простой и дешевый способ – это увеличение объема оперативной памяти.

Почему самый простой?

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

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

Общее

ОЗУ (оперативное запоминающее устройство), оно же RAM (" Random Access Memory " - память с произвольным доступом), представляет собой область временного хранения данных, при помощи которой обеспечивается функционирование программного обеспечения. Физически, оперативная память в системе представляет собой набор микросхем или модулей (содержащих микросхемы), которые обычно подключаются к системной плате.

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

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

По своей структуре память напоминает пчелиные соты, т.е. состоит из ячеек, каждая из которых предназначена для хранения мёда определенного объема данных, как правило, одного или четырех бит. Каждая ячейка оной имеет свой уникальный «домашний» адрес, который делится на два компонента – адрес горизонтальной строки ( Row ) и вертикального столбца ( Column ).

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

Для передачи на микросхему памяти адреса строки служит некий сигнал, который зовется RAS ( Row Address Strobe ), а для адреса столбца — сигнал CAS ( Column Address Strobe ).

С этим разобрались, идем дальше. Затронем еще один немаловажный вопрос:

Как же работает оперативная память?

Работа оперативной памяти непосредственно связана с работой процессора и внешних устройств компьютера, так как именно ей последние «доверяют» свою информацию. Таким образом, данные сперва попадают с жесткого диска (или другого носителя) в саму ОЗУ и уже затем обрабатываются центральным процессором (смотрите изображение).

Как работает оперативная память - Схема - взаимодействие компонентов ПК

Обмен данными между процессором и памятью может происходить напрямую, но чаще все же бывает с участием кэш-памяти.

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

Оперативной памятью управляет контроллер, который находится в чипсете материнской платы, а точнее в той его части, которая называется North Bridge (северный мост) - он обеспечивает подключение CPU (процессора) к узлам, использующим высокопроизводительные шины: ОЗУ , графический контроллер (смотрите изображение).

Как работает оперативная память - Управление оперативной памятью

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

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

Сейчас Вы поймете, о чем это я.

Подробнее

Дело в том, что современные устройства оперативной памяти являются достаточно объемными (привет двухтысячным, когда хватало и 32 Mб), чтобы в ней можно было размещать данные от нескольких одновременно работающих задач. Процессор также может одновременно обрабатывать несколько задач. Это обстоятельство способствовало развитию так называемой системы динамического распределения памяти, когда под каждую обрабатываемую процессором задачу отводятся динамические (переменные по своей величине и местоположению) разделы оперативной памяти.

Динамический характер работы позволяет распоряжаться имеющейся памятью более экономно, своевременно «изымая» лишние участки памяти у одних задач и «добавляя» дополнительные участки – другим (в зависимости от их важности, объема обрабатываемой информации, срочности выполнения и т.п.). За «правильное» динамическое распределение памяти в ПК отвечает операционная система, тогда как за «правильное» использование памяти, отвечает прикладное программное обеспечение.

Совершенно очевидно, что прикладные программы должны иметь способность работать под управлением операционной системы, в противном случае последняя не сможет выделить такой программе оперативную память или она не сможет «правильно» работать в пределах отведенной памяти. Именно поэтому не всегда удается запустить под современной операционкой, ранее написанные программы, которые работали под управлением устаревших систем, например под ранними версиями Windows (98 например).

Ещё (для общего развития) следует знать, что поддержка памяти зависит от разрядности системы, например, операционная система Windows 7, разрядностью 64 бита, поддерживает объем памяти до 192 Гбайт (младший 32 -битный собрат "видит" не больше 4 Гбайт). Однако, если Вам и этого мало, пожалуйста, 128 -разрядная Windows 8 заявляет поддержку поистине колоссальных объемов – я даже не осмеливаюсь озвучить эту цифру. Чуть подробнее про разрядность мы писали тут.

Что это такое разобрались.

Дальше, на очереди, как и гласил заголовок, у нас не менее интересный вопрос:

Зачем нужна эта самая оперативная память?

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

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

Данные, записанные в оперативной памяти, передаются в CPU (он же не раз упомянутый процессор, он же Central Processing Unit ), там обрабатываются и записываются обратно. И так постоянно: дали команду процессору взять биты по таким-то адресам (как то: обработатьих и вернуть на место или записать на новое) – он так и сделал (смотрите изображение).

Как работает оперативная память - процессор и оперативная память - взаимодействие

Все это хорошо до тех пор, пока ячеек памяти ( 1 ) хватает. А если нет?

Тогда в работу вступает файл подкачки ( 2 ). Этот файл расположен на жестком диске и туда записывается все, что не влезает в ячейки оперативной памяти. Поскольку быстродействие винта значительно ниже ОЗУ , то работа файла подкачки сильно замедляет работу системы. Кроме этого, это снижает долговечность самого жесткого диска. Но это уже совсем другая история.

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

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

Компоновка модулей

Кстати, давайте рассмотрим из чего же состоит (из каких элементов) сам модуль.

Так как практически все модули памяти, состоят из одних и тех же конструктивных элементов, мы для наглядности возьмем стандарт SD-RAM (для настольных компьютеров). На изображении специально приведено разное конструктивное исполнение оных (чтобы Вы знали не только «шаблонное» исполнение модуля, но и весьма «экзотическое»).

Итак, модули стандарта SD-RAM ( 1 ): DDR ( 1.1 ); DDR2 ( 1.2 ).

Как работает оперативная память - компоновка модулей памяти

  1. Чипы (микросхемы) памяти
  2. SPD ( Serial Presence Detect ) – микросхема энергонезависимой памяти, в которую записаны базовые настройки любого модуля. Во время старта системы BIOS материнской платы считывает информацию, отображенную в SPD , и выставляет соответствующие тайминги и частоту работы ОЗУ ;
  3. «Ключ» - специальная прорезь платы, по которой можно определить тип модуля. Механически препятствует неверной установке плашек в слоты, предназначенные для оперативной памяти;
  4. SMD -компоненты модулей (резисторы, конденсаторы). Обеспечивают электрическую развязку сигнальных цепей и управление питанием чипов;
  5. Cтикеры производителя - указывают стандарт памяти, штатную частоту работы и базовые тайминги;
  6. РСВ – печатная плата. На ней распаиваются остальные компоненты модуля. От качества зачастую зависит результат разгона: на разных платах одинаковые чипы могут вести себя по-разному.

Теперь обощая, упрощая.

Температура, лаг, энергозависимость и вообще "на пальцах"

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

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

Файл подкачки, который является "продолжением" этой памяти, логичным образом, хранит в себе данные на жестком диске, что, в общем случае, небезопасно.

Информация в ячейках со временем "теряется", причем, чем выше температура, тем быстрее это происходит.

Чтобы избежать потери сохранённых данных, они должны регулярно обновляться, чтобы восстановить заряд (если он есть) до первоначального уровня. Этот процесс обновления включает чтение каждого бита, а потом запись его обратно. Это происходит не целиком, а блоками. В процессе такого «обновления» память занята и не может выполнять обычные операции, такие как запись или хранение битов. В общем случае из-за этого обновления память тормозит каждые 7,8 мкс.

Послесловие

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

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

Белов Андрей (Sonikelf) Заметки Сис.Админа [Sonikelf's Project's] Космодамианская наб., 32-34 Россия, Москва (916) 174-8226

Читайте также: