- Управление памятью
- Типы памяти
- Память с произвольным доступом
- Память только для чтения
- Кэш-память
- Отображение памяти
- Утечки памяти
- Виртуальная память
Обновлено: 07.04.2010
Чтобы обеспечить безопасную и стабильную среду, операционная система должна осуществлять надлежащее управление памятью – это одна из наиболее важных ее задач. В конце концов, все происходит в памяти. Это подобно тому, как наше существование зависит от кислорода и гравитации.
Целями управления памятью являются:
- Предоставление уровня абстракции программистам
- Максимизация производительности при ограниченном объеме доступной памяти
- Защита операционной системы и приложений, загруженных в память
Каждый компьютер имеет иерархию памяти: небольшой объем скоростной и дорогой памяти (кэш и регистры) и большой объем более медленной и более дешевой (оперативная память, жесткие диски). Часть операционной системы, которая отслеживает использование различных типов памяти, называется менеджером памяти. Он выделяет и освобождает различные сегменты памяти, реализует управление доступом, гарантируя, что процессы взаимодействуют только с их собственными сегментами памяти, переносит участки памяти из оперативной памяти на жесткий диск (файл подкачки).
Менеджер памяти отвечает за следующие пять основных функций:
Перемещение
- Переносит участки памяти из оперативной памяти на жесткий диск по мере необходимости (более подробно об этом рассказывается в разделе «Виртуальная память» далее в этом Домене).
- Предоставляет приложениям указатели, если их команды и сегменты памяти были перемещены в другое место в основной памяти.
- Ограничивает взаимодействие процессов только теми сегментами памяти, которые связаны с ними.
- Обеспечивает управление доступом к сегментам памяти
- Использует комплексные защитные меры для обеспечения целостности и конфиденциальности при использовании процессами одних и тех же общих сегментов памяти.
- Позволяет множеству пользователей с различными уровнями доступа взаимодействовать с одними и теми же приложениями, запущенными в одном сегменте памяти.
- Позволяет совместно использовать специальные программные модули, такие как динамически подключаемые библиотеки (DLL – dynamic link library).
- Сегментирует пространство физической памяти для приложений и процессов операционной системы.
ПРИМЕЧАНИЕ. Динамически подключаемые библиотеки (DLL) представляют собой набор функций, которые приложения могут использовать при необходимости. Например, операционная система имеет библиотеку Crypt32.dll, используемую операционной системой и приложениями для выполнения криптографических функций. Windows имеет целый набор библиотек DLL, которые могут быть использованы приложениями.Каким образом операционная система обеспечивает, что процесс взаимодействует только со своим сегментом памяти? Когда процесс создает поток для выполнения своих команд и обработки данных, процессор использует два регистра. Базовый регистр (base register) содержит начальный адрес, который был предоставлен этому процессу, а регистр границы области памяти (limit register) содержит конечный адрес, как показано на рисунке 3-6. Поток содержит адрес, где находятся команды и данные для обработки. Процессор сравнивает этот адрес с базовым регистром и регистром границы области памяти, чтобы убедиться, что поток не пытается получить доступ к сегменту памяти за пределами своих границ.
Рисунок 3-6. Базовый регистр и регистр границы области памяти используются для контроля выхода процесса за пределы своего сегмента памяти
Память также защищается с помощью пользовательского и привилегированного режимов выполнения, как уже упоминалось ранее. Более подробно это описано ниже в разделе "Режимы процессора и Кольца защиты" этого Домена.
В следующих разделах рассматриваются различные типы памяти, использующиеся в компьютерных системах.
Память с произвольным доступом (RAM – random access memory) – это разновидность временного хранилища данных, в котором данные и команды программного обеспечения могут храниться и изменяться. RAM используется операционной системой и приложениями для выполнения операций чтения/записи. Эта память является временной, т.к. при отключении электропитания вся информация в ней теряется.
Микросхема RAM состоит из миллионов транзисторов и конденсаторов. В конденсаторах хранятся электрические заряды, которые преобразуются системой в 1 или 0. Транзистор работает как затвор (gate) или переключатель (switch). Для хранения двоичного значения 1, конденсатор держит внутри себя несколько электронов, которые имеют отрицательный заряд, а если конденсатор пуст, это соответствует значению 0. Когда операционная система записывает значение 0 поверх 1, фактически это приводит просто к освобождению конденсатора от электронов.
Одной из проблем является то, что конденсаторы не могут долго держать заряд. Поэтому контроллер памяти должен «перезаряжать» конденсаторы, постоянно считывая и записывая в них соответствующие значения – это называется регенерацией. Если контроллер памяти не обновит значение 1, конденсатор начнет терять электроны и значение в нем превратится в 0 или будет повреждено. Так организована работа динамической RAM (DRAM – dynamic RAM). Данные поступают на хранение в ячейки памяти, а затем постоянно динамически регенерируются, чтобы биты в них не исчезали. Операции регенерации осуществляется постоянно, что занимает определенное время, поэтому DRAM работает медленнее, чем статическая память.
ПРИМЕЧАНИЕ. Когда мы имеем дело с работой памяти, мы используем время, измеряемое в наносекундах (нс), что является одной миллиардной долей секунды. Если вы посмотрите на микросхему RAM и увидите маркировку 70 нс, это означает, что чтение и регенерация каждой ячейки памяти занимает 70 наносекунд.Статическая RAM (SRAM – static RAM) не требует постоянной регенерации, т.к. она использует другие технологии, с помощью которых хранит биты в ячейках памяти без использования конденсаторов, но SRAM требует большего количества транзисторов, чем DRAM. SRAM не нуждается в постоянной регенерации, поэтому она быстрее, чем DRAM, но поскольку SRAM требует больше транзисторов, она занимает больше места в микросхеме. Производители не могут разместить на микросхеме также много ячеек памяти SRAM, как DRAM, поэтому SRAM стоит дороже. Таким образом, DRAM дешевле и медленнее, а SRAM дороже и быстрее. SRAM обычно используется как кэш-память, а DRAM – как основная оперативная память.
Аппаратная сегментация. Системам высшего уровня доверия может потребоваться реализовать аппаратную сегментацию памяти, используемой различными процессами. Это означает, что память разделяться физически, а не просто логически. Это добавляет еще один уровень защиты для обеспечения того, чтобы более низкопривилегированный процесс не имел доступа к памяти и не изменял пространство памяти процесса более высокого уровня.Кроме того, существует множество других типов оперативной памяти. Основной причиной постоянной эволюции видов памяти является ее непосредственное влияние на скорость работы компьютера в целом. Многие люди ошибочно думают, что компьютер будет работать быстро, только если установить быстрый процессор. Однако, такие параметры, как тип и размер памяти, разрядность шины также имеют критическое значение. Представьте себе память компьютера в виде листов бумаги, используемых компьютером для хранения команд. Если компьютер использует листы небольшого размера (небольшой объем памяти), он будет тратить много времени на поиск нужных листов и их правильное расположение. Когда компьютер тратит много времени, перемещая данные из одной небольшой части памяти в другую, вместо реальной обработки данных, это приводит к существенному падению скорости системы.
Разрядность шины данных также вносит свой вклад в скорость системы. Вы можете представить себе шину данных, как шоссе, соединяющее различные части компьютера. Если необходимо переправить тонну данных от памяти к процессору, и есть только четырехполосное шоссе, то времени на перемещение данных будет затрачено больше, чем в случае 64-полосного шоссе. Таким образом, процессор, тип памяти и ее размер, а также разрядность шины являются критическими составляющими производительности системы.
Вы должны быть знакомы со следующими дополнительными типами оперативной памяти:
- SDRAM (Synchronous DRAM) синхронизируется с процессором, возвращая ответ на поступивший управляющий сигнал не сразу, а после получения очередного тактового импульса. Это координирует действия с таймером процессора, синхронизируя таким образом частоты процессора и памяти. Это увеличивает скорость передачи данных.
- EDO DRAM (Extended Data Out DRAM) загружает следующий блок данных, пока предыдущий блок отправляется процессору для обработки. Это способ «предвидения», который повышает скорость доступа к памяти.
- BEDO DRAM (Burst EDO DRAM) работает аналогично EDO DRAM (и построена на ее базе), она также может одновременно передавать данные процессору и выполнять функцию чтения, однако при этом она может отправлять больше данных за раз (burst). Она может считывать и отправлять информацию из четырех адресов памяти в течение небольшого числа тактов.
- DDR SDRAM (Double Data Rate SDRAM) выполняет операции чтения на восходящем и нисходящем цикле тактового импульса. Таким образом, она выполняет две операции за такт вместо одной, что обычно удваивает скорость работы такой памяти по сравнению с обычной SDRAM при меньшем числе тактов.
ПРИМЕЧАНИЕ. Эти различные типы RAM требуют использования различных контроллеров для взаимодействия с ними, поэтому материнские платы всегда специфичны и предназначены для использования конкретных типов памяти.Ну, хватит пока о RAM. Давайте взглянем на другие типы памяти, которые используются почти в каждом компьютере в мире.
Память только для чтения (ROM – read only memory) – это тип энергонезависимой памяти, в которой данные остаются в микросхемах памяти даже после выключения электропитания. Записанные в микросхемы ROM данные уже не могут быть изменены. Некоторые микросхемы ROM производятся с уже записанным программным обеспечением или подпрограммами. Программное обеспечение, которое хранится в ROM называется прошивкой.
Программируемая ROM (PROM – Programmable ROM) – это разновидность ROM, информация в которой может изменяться после ее изготовления, но только один раз, поскольку напряжение, которое используется для записи битов в ячейки памяти, фактически выжигает предохранители, которые соединяют отдельные ячейки памяти. Для прошивки PROM используются специальные программаторы.
Стираемая и программируемая ROM (EPROM – Erasable and programmable ROM) может быть очищена, изменена и обновлена. Данные в EPROM могут быть стерты с помощью ультрафиолетового света и перезаписаны электрическим способом. Для стирания микросхемы EPROM, ее нужно извлечь из компьютера и направить в имеющееся на ней специальное окно из кварцевого стекла ультрафиолетовый луч определенной мощности, который сотрет абсолютно все содержимое микросхемы. Чтобы не усложнять себе жизнь необходимостью использования ультрафиолета, изобрели другой вид ROM, данные на которой стираются электрическим способом без применения ультрафиолетовых лучей. Это электрически стираемая и программируемая ROM (EEPROM – Electrically erasable programmable ROM).
EEPROM похожа на EPROM, но хранящиеся на ней данные могут быть стерты и изменены электрическим способом непосредственно на плате с помощью специальной схемы программирования и соответствующих электрических сигналов. Такая функция стирает только один байт за раз, что достаточно медленно. Поэтому была разработана еще одна технология, которая очень похожа на EEPROM, но работает быстрее.
Флеш-память (flash memory) – это специальный тип памяти, который в наше время используется в цифровых камерах, микросхемах BIOS, накопителях для ноутбуков, игровых консолях и т.д. Флеш-память изготавливается по твердотельной (solid-state) технологии, т.е. она не имеет движущихся частей, и используется больше как разновидность жестких дисков, чем как память.
Флэш-память работает на основе различных уровней напряжения, указывающих какое значение (1 или 0) хранится по определенному адресу. Ее работа больше похожа на работу ROM, чем RAM, она энергонезависима, также как ROM. Когда флэш-память должна быть стерта и возвращена в исходное состояние, программа активирует ее внутренние механизмы, которые выполняют стирание информации с помощью электрического поля. Удаление информации производится в рамках отдельных блоков или в рамках всей микросхемы, а не по одному байту за раз.
Флэш-память чаще всего используется в качестве небольшого дискового накопителя. Ее преимущества по сравнению с обычным жестким диском заключаются в том, что она меньше, быстрее и легче. Возможно когда-нибудь флеш-память полностью заменит жесткие диски, но сегодня она относительно дорога по сравнению с обычными жесткими дисками.
Ссылки по теме:
Кэш-память (cache memory) – это тип памяти, который используется для высокоскоростных операций чтения-записи. Когда система (ее программная логика) предполагает, что ей часто будет требоваться доступ к определенной информации, она организует хранение этой информации в кэш-памяти, чтобы она была быстро и легко доступна. Данные из кэша можно получить гораздо быстрее, чем данные, хранящиеся в оперативной памяти. Поэтому любая информация, необходимая процессору очень быстро и очень часто, обычно хранится в кэш-памяти, тем самым повышая общую скорость работы компьютерной системы.
Наш мозг хранит часто используемую информацию аналогичным образом. Если одна из основных должностных обязанностей Ирины состоит в том, чтобы она сообщала клиентам адрес компании, ее мозг сохраняет эту информацию в той части (разновидности кэша), из которой она может легко и быстро извлечена. Но если вдруг Ирину попросят вспомнить имя ее учителя в третьем классе, эта информация вряд ли хранится в ее «кэш-памяти», скорее она будет искать ее в более долгосрочном хранилище. Долгосрочное хранилище мозга можно сравнить с жестким диском компьютерной системы. Поиск и извлечение информации с жесткого диска занимает значительно больше времени по сравнению со специализированной кэш-памятью.
ПРИМЕЧАНИЕ. Различные материнские платы имеют различные типы кэш-памяти. Кэш-память уровня 1 (L1) быстрее, чем кэш-память уровня 2 (L2), а L2 быстрее, чем L3. Некоторые процессоры и контроллеры устройств имеют встроенную кэш-память. В процессоры и контроллеры встраивается обычно кэш-память уровней L1 и L2.
Поскольку различные типы памяти хранят различные типы данных, компьютерная система не хочет, чтобы любой пользователь, процесс или приложение имел доступ к любым типам памяти в любое время, когда он захочет. Доступ к памяти должен контролироваться, чтобы данные не были повреждены, а критичная информация не была доступна неуполномоченным на доступ к ней процессам. Этот обеспечивается с помощью отображения памяти и адресации.
Процессор является одним из самых доверенных компонентов системы, поэтому он может обращаться к памяти напрямую. Он использует физическую адресацию вместо указателей (логических адресов), поскольку физически (проводами) соединен с микросхемами памяти компьютера. Физическая адресация представляет собой точки пересечения проводников и рядов транзисторов в микросхеме памяти. Программное обеспечение использует не физическую, а логическую адресацию памяти. Такой непрямой доступ к памяти обеспечивает еще один уровень управления доступом программного обеспечения к памяти, что помогает обеспечить защиту и повысить эффективность системы. На рисунке 3-7 показана работа с памятью процессора (напрямую, с помощью физического адреса) и программного обеспечения (ненапрямую, посредством отображения памяти).
Рисунок 3-7. Доступ к памяти процессора и приложений организован по-разному
Давайте рассмотрим аналогию. Предположим, вы хотите купить земельный участок и вас заинтересовало объявление некоего г-на Маршалла, который продает свой участок. Вы хотели бы поговорить с г-ном Маршаллом, но вы не знаете его лично и не хотите давать ему свой домашний (физический) адрес, чтобы он пришел к вам. Вместо этого, вы предпочитаете более абстрактный и управляемый способ взаимодействия – вы звоните г-ну Маршаллу, чтобы поговорить с ним о земле и решить, хотите ли вы встретиться с ним лично. То же самое происходит и в компьютерах. Когда компьютер работает под управлением программного обеспечения, он не хочет без крайней необходимости позволять оказывать влияние на себя со стороны программ, написанных хорошими и плохими программистами. Компьютер разрешает программному обеспечению получать доступ к памяти с помощью индексных таблиц и указателей, вместо того, чтобы предоставить ему право на прямой доступ к памяти. Это один из способов самозащиты компьютерной системы.
Перед тем, как программе будет предоставлен доступ к памяти, проверяются ее права доступа. Команды программы выполняются способом, обеспечивающим невозможность влияния ее плохо написанного кода на другие программы и саму систему. Приложения и их процессы могут получить доступ только к той памяти, которая выделена для них (см. Рисунок 3-8). Такая архитектура обеспечивает защиту системы.
Рисунок 3-8. Приложения и процессы могут использовать только свои собственные сегменты памяти
Физические адреса памяти, которые использует процессор, называются абсолютными адресами (absolute address). Индексные адреса памяти, которые использует программное обеспечение, называются логическими адресами (logical address). Также используются относительные адреса (relative address), основанные на известном адресе и величине смещения относительно него. Как говорилось ранее, приложение «не знает», что память используется совместно различными приложениями. Когда программе для работы нужен сегмент памяти, она просто говорит менеджеру памяти, сколько памяти ей нужно. Менеджер памяти выделяет ей необходимый объем физической памяти, который может иметь физическую адресацию, например, от 34000 до 39000. Однако приложение не понимает такую адресацию. Оно разработано для работы с логическими адресами, начинающимися с 0 и заканчивающимися, скажем, 5000. Таким образом, менеджер памяти позволяет приложению использовать свою логическую схему адресации. Когда приложение обращается к одному из этих «фантомных» логических адресов, менеджер должен преобразовать его в реальный физический адрес.
Процесс отображения (преобразования) адресов показан на Рисунке 3-9. Если приложению нужно передать процессору команды и данные, физические адреса загружаются в базовый регистр и регистр границы области памяти. Когда поток передает команду для обработки, он использует логические адреса. Менеджер памяти преобразует логический адрес в физический адрес, чтобы процессор знал, где находится команда. Фактически поток использует относительный адрес, поскольку приложение работает в логическом адресном пространстве от 0 до 5000. Когда поток говорит, что ему нужно выполнить команду, которая находится в памяти по адресу 3400, менеджер памяти преобразует логический адрес 0 в фактический физический адрес, а затем находит физический адрес для логического адреса 3400. Т.е. логический адрес 3400 берется относительно начального адреса 0.
Рисунок 3-9. Процессор использует абсолютные адреса, а приложения – логические
Таким образом, приложения, работают в «своем мире» и используют «свои адреса», а менеджер памяти преобразует эти значения в реальные, абсолютные значения адресов.
Когда приложение запрашивает сегмент памяти, операционная система выделяет ему соответствующий объем памяти. Когда приложение заканчивает работу с этим сегментом памяти, оно говорит операционной системе, что нужно освободить эту память, чтобы она стала доступна другим приложениям. Это правильно. Однако некоторые плохо написанные приложения не сообщают системе, что ранее выделенная для них память им больше не требуется. Когда это происходит большое число раз, у операционной системы начинает заканчиваться свободная память, что крайне негативно влияет на производительность системы.
Когда утечку памяти обнаруживают хакеры, это позволяет им провести DoS-атаку. Например, когда было обнаружено, что Unix-реализация отдельных версий протокола Telnet, содержит утечку памяти, хакеры воспользовались этой проблемой, усилив ее воздействие. Они постоянно посылали запросы системам с этой уязвимостью. Системы выделяли ресурсы для каждого из этих запросов и не освобождали ее. Это вело к все большему и большему расходу памяти. В конечном итоге системе не хватало памяти и она зависала.
ПРИМЕЧАНИЕ. Утечки памяти могут происходить в операционных системах, приложениях и драйверах.Существует две контрмеры против утечек памяти: лучше разрабатывать код программ, чтобы он должным образом освобождал память, либо использовать «сборщики мусора» (garbage collector), которые находят неиспользуемую память и сообщают системе, что ее можно считать свободной. Различные виды сборщиков мусора работают с различными операционными системами, языками программирования и алгоритмами.
Вторичным хранилищем (secondary storage) являются энергонезависимые носители информации, такие как жесткие диски, дискеты, компакт-диски и т.п. Когда RAM и вторичное хранилище используются совместно, вместе они образуют виртуальную память. Система использует пространство на жестком диске, чтобы увеличить объем своей оперативной памяти. Пространство файла подкачки – это зарезервированное пространство на жестком диске, которое используется для расширения оперативной памяти. Например, Windows-системы используют файл pagefile.sys для резервирования места на жестком диске. Когда система заполняет все пространство своей энергозависимой оперативной памяти, она записывает часть данных из памяти на жесткий диск. Когда программа запрашивает доступ к этим данным, они переносятся с жесткого диска обратно в память частями, называемыми «страницами» (pages). Этот процесс называется «подкачкой» (paging) виртуальной памяти. Доступ к данным, находящимся в файле подкачки на жестком диске, занимает больше времени, чем использование данных, находящихся в RAM, т.к. необходимо производить операции чтения/записи с жесткого диска. Внутреннее управление блоками, поддерживаемое операционной системой, отслеживает, какие страницы находятся в памяти, а какие доступны «оффлайн» и готовы быть при необходимости перенесены в RAM для выполнения или обработки. Выигрыш заключается в создании впечатления, что система может хранить в памяти невероятное количество информации и команд программного обеспечения, как показано на Рисунке 3-10.
Рисунок 3-10. RAM и вторичное хранилище используются совместно, образуя виртуальную память
Следует иметь в виду, что данные, выгруженные из памяти в файл подкачки на жестком диске, после выключения компьютера или завершения работы процессов, использовавших пространство файла подкачки, физически с жесткого диска не удаляются, просто указатели на соответствующие страницы памяти помечаются как свободные. Эти данные могут быть перехвачены и скомпрометированы. В очень безопасных операционных системах есть специальные процедуры для безопасной очистки пространства файла подкачки после завершения процесса и перед повторным использованием этого пространства. С помощью такой процедуры следует очищать файл подкачки перед завершением работы операционной системы, поскольку начиная с этого момента операционная система не сможет более обеспечивать контроль за доступом к содержимому жесткого диска.
ПРИМЕЧАНИЕ. Если программа шифрует данные при сохранении на жестком диске, то они расшифровываются при их обработке программой. Такие данные могут временно храниться в оперативной памяти в расшифрованном виде, а система может записать их в таком виде в файл подкачки на жестком диске. Потенциально, злоумышленники могут получить несанкционированный доступ к этому файлу.Ссылки по теме:
- Управление памятью Windows как оно есть (часть 1). http://habrahabr.ru/blogs/windows/107605/
ОтветитьУдалить- Управление памятью Windows как оно есть (часть 2). http://habrahabr.ru/blogs/windows/107607/
- Управление памятью Windows как оно есть (часть 3). http://habrahabr.ru/blogs/windows/107637/