Структура оперативной памяти windows

Как устроена оперативная память компьютера

З наете ли вы, что такое оперативная память? Конечно, знаете. Это такое устройство, от которого зависит скорость работы компьютера. В общем, так оно и есть, только выглядит такое определение немного дилетантски. Но что в действительности представляет собой оперативная память? Как она устроена, как работает и чем один вид памяти отличается от другого?

Компьютерная память

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

Но если ОЗУ это одна часть компьютерной памяти, тогда что представляет собой её другая часть? Носителем этой части памяти является жесткий диск. В отличие от ОЗУ, он может хранить информацию, не будучи подключён к источнику питания. Жесткие диски, флешки и CD-диски — все эти устройства именуются ПЗУ, что расшифровывается как постоянное запоминающее устройство. Как и ОЗУ, ПЗУ хранят данные в виде нулей и единиц.

Для чего нужна ОЗУ

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

Физическое устройство оперативной памяти таково, что чтение/запись в ней производится намного быстрее . Если бы вместо ОЗУ у вас было ПЗУ, компьютер бы работал очень медленно.

Физическое устройство ОЗУ

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

Каждая микросхема содержит множество конденсаторов связанных в единую ячеистую структуру — матрицу или иначе ядро памяти. Также микросхема содержит выходной буфер — особый элемент, в который попадает информация перед тем, как быть переданной на шину памяти. Из уроков физики мы знаем, что конденсатор способен принимать только два устойчивых состояния: либо он заряжен, либо разряжен. Конденсаторы в ОЗУ играют ту же роль, что и магнитная поверхность жёсткого диска, то есть удержание в себе электрического заряда, соответствующего информационному биту. Наличие заряда в ячейке соответствует единице, а отсутствие — нулю.

Как в ОЗУ записывается и читается информация

Понять, как в ОЗУ происходит запись и считывание данных будет проще, если представить её в виде обычной таблицы. Чтобы считать данные из ячейки, на горизонтальную строку выдаётся сигнал выбора адреса строки (RAS). После того как он подготовит все конденсаторы выбранной строки к чтению, по вертикальной колонке подаётся сигнал выбора адреса столбца (CAS), что позволяет считать данные с конкретной ячейки матрицы.

Характеристика, определяющая количество информации, которое может быть записано или прочитано за одну операцию чтения/записи, именуется разрядностью микросхемы или по-другому шириной шины данных. Как нам уже известно, перед тем как быть переданной на шину микросхемы, а затем в центральный процессор, информация сначала попадает в выходной буфер. С ядром он связывается внутренним каналом с пропускной способностью равной ширине шины данных. Другой важной характеристикой ОЗУ является частота шины памяти. Что это такое? Это периодичность, с которой происходит считывание информации, а она совсем не обязательно должна совпадать с частотой подающегося на матрицу памяти сигнала, что мы и увидим на примере памяти DDR.

В современных компьютерах используется так называемая синхронная динамическая оперативная память — SDRAM. Для передачи данных в ней используется особый синхросигнал. При его подаче на микросхему происходит синхронное считывание информации и передача её в выходной буфер.

Представим, что у нас есть микросхема памяти с шириной шины данных 8 бит, на которую с частотой 100 МГц подаётся синхросигнал. В результате за одну транзакцию в выходной буфер по 8-битовому каналу попадает ровно 8 бит или 1 байт информации. Точно такой же синхросигнал приходит на выходной буфер, но на этот раз информация попадает на шину микросхемы памяти. Умножив частоту синхросигнала на ширину шины данных, мы получим ещё один важный параметр — пропускную способность памяти.

8 бит * 100 МГц = 100 Мб/с

Память DDR

Это был простейший пример работы SDR — памяти с однократной скоростью передачи данных. Этот тип памяти сейчас практически не используется, сегодня его место занимает DDR — память с удвоенной скоростью передачи данных. Разница между SDR и DDR заключается в том, что данные с выходного буфера такой ОЗУ читаются не только при поступлении синхросигнала, но и при его исчезновении. Также при подаче синхросигнала в выходной буфер с ядра памяти информация попадает не по одному каналу, а по двум, причём ширина шины данных и сама частота синхросигнала остаются прежними.

Для памяти DDR принято различать два типа частоты. Частота, с которой на модуль памяти подаётся синхросигнал, именуется базовой, а частота, с которой с выходного буфера считывается информация — эффективной. Рассчитывается она по следующей формуле:

эффективная частота = 2 * базовая частота

В нашем примере с микросхемой 8 бит и частотой 100 МГц это будет выглядеть следующим образом.

8 бит * (2 * 100 МГц) = 200 Мб/с

Чем отличаются DDR от DDR2, DDR3 и DDR4

Количеством связывающих ядро с выходным буфером каналов, эффективной частотой, а значит и пропускной способностью памяти. Что касается ширины шины данных (разрядности), то в большинстве современных модулей памяти она составляет 8 байт (64 бит). Допустим, что у нас есть модуль памяти стандарта DDR2-800. Как рассчитать его пропускную способность? Очень просто. Что такое 800? Это эффективная частота памяти в мегагерцах. Умножаем её на 8 байт и получаем 6400 Мб/с.

Читайте также:  Как восстановить windows ноутбук hp pavilion

И последнее. Что такое пропускная способность мы уже знаем, а что такое объём оперативной памяти и зависит ли он от её пропускной способности? Прямой взаимосвязи между этим двумя характеристиками нет. Объём ОЗУ зависит от количества запоминающих элементов. И чем больше таких ячеек, тем больше данных может хранить память без их перезаписи и использования файла подкачки.

Архитектура памяти windows

Цель работы: получение практических навыков по использованию Win32 API для исследования памяти Windows

На рисунке ниже представлена взаимосвязь виртуального адресного пространства процесса с физической и внешней памятью.

Физическая память (Physical memory) — это реальные микросхемы RAM, установленные в компьютере. Каждый байт физической памяти имеет физический адрес (Physical Address), который представляет собой число от нуля до числа на единицу меньшего, чем количество байтов физической памяти. Например, ПК с установленными 64 Мб RAM, имеет физические адреса &Н00000000-&Н04000000 в шестнадцатеричной системе счисления, что в десятичной системе будет 0-67 108 863.

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

Виртуальная память (Virtual Memory) — это просто набор чисел, о которых говорят как о виртуальных адресах. Программист может использовать виртуальные адреса, но Windows не способна по этим адресам непосредственно обращаться к данным, поскольку такой адрес не является адресом реального физического запоминающего устройства, как в случае физических адресов и адресов файла подкачки. Для того чтобы код с виртуальными адресами можно было выполнить, такие адреса должны быть отображены на физические адреса, по которым действительно могут храниться коды и данные. Эту операцию выполняет диспетчер виртуальной памяти (Virtual Memory Manager VMM). Операционная система Windows обозначает некоторые области виртуальной памяти как области, к которым можно обратиться из программ пользовательского режима. Все остальные области указываются как зарезервированные. Какие области памяти доступны, а какие зарезервированы, зависит от версии операционной системы (Windows 9x или Windows NT).

Страничные блоки памяти

Как известно, наименьший адресуемый блок памяти — байт. Однако самым маленьким блоком памяти, которым оперирует Windows VMM, является страница (Page) памяти, называемая также страничным блоком (Page Frame) памяти. На компьютерах с процессорами Intel объем страничного блока равен 4 Кб.

Память файла подкачки

Страничный файл (Pagefile), который называется также файлом подкачки (Swap File) в Windows находится на жестком диске. Он используется для хранения данных и программ точно так же, как и физическая память, но его объем обычно превышает объем физической памяти. Windows использует файл подкачки (или файлы, их может быть несколько) для хранения информации, которая не помещается в RAM, производя, если нужно, обмен страниц между файлом подкачки и RAM.

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

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

Файлы, отображаемые в память

В лабораторной работе ЛАБ_ОС-2 обсуждались файлы, отображаемые в память, там же был приведен пример отображения файла. Любой файл применяется для проецирования виртуальной памяти так же, как для этих целей используется файл подкачки. Фактически единственное назначение файла подкачки — проецирование (Backing) виртуальной памяти.

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

Функция CreateFileMapping объявляется так:

Function CreateFileMapping(hFile: THandle; lpFileMappingAttributes: PSecurityAttributes; flProtect, dwMaximumSizeHigh, dwMaximumSizeLow: DWORD; lpName: PChar): THandle; stdcall;

Function CreateFileMapping; external kernel32 name ‘CreateFileMappingA’;

Она создает объект «отображение файла» (FileMapping Object), используя дескриптор открытого файла, и возвращает дескриптор этого объекта. Дескриптор может использоваться с функцией MapViewOf File, отображающей файл в виртуальную память:

Function MapViewOfFile(hFileMappingObject: THandle; dwDesiredAccess: DWORD; dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap: DWORD): Pointer; stdcall;

Function MapViewOfFile; external kernel32 name ‘MapViewOfFile’;

Начальный адрес объекта «отображение файла» в виртуальной памяти возвращает функция MapViewOfFile. Можно также сказать, что представление проецируется на файл с дескриптором HFile.

Если параметр HFile, передаваемый функции CreateFileMapping, установлен в -1, то объект «отображение файла» (любые представления, созданные на основе этого объекта) проецируем на файл подкачки, а не на заданный файл.

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

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

Если файл, такой как DLL, находится в совместно используемой физической памяти, то о нем можно говорить как о совместно используемом.

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

В частности, можно создать такой объект, проецируемый на файл подкачки,

Просто установив параметр hFile функции CreateFileMapping в -1.

Адресное пространство процесса

Каждый процесс Win32 получает виртуальное адресное пространство (virtual address space), называемое также адресным пространством, или пространством процесса (process space), объем которого равен 4 Гб. Таким образом, код процесса может ссылаться на адреса с &Н00000000 по &HFFFFFFFF (или с 0 по 232 — 1 = 4 294 967 295 в десятичной системе счисления). Конечно, так как виртуальные адреса — это просто числа, заявление о том, что каждый процесс получает свое собственное виртуальное адресное пространство, выглядит довольно бессмысленным. (Это все равно, что сказать, что каждый человек получает свой собственный диапазон возраста от 0 до 150).

Читайте также:  Linux создал пользователя не пускает по ssh

Тем не менее, это утверждение должно означать, что Windows не видит ни какой взаимосвязи в том, что и процесс А, и процесс В используют один и тот же виртуальный адрес, например &Н40000000. В частности, Windows может сопоставить (или не сопоставить) виртуальным адресам каждого процесса разные физические адреса.

Использование адресного пространства в Windows 9X

На рисунке показана общая схема использования адресного пространства процесса в Windows 9x.

Как следует из рисунка, Windows 9х резервирует область А, объем которой всего лишь 4 Кб, для того же, что и Windows NT первые 64 Кб памяти, — с целью предупреждения о нулевых указателях. Эта область защищена, и попытка обращения к ней из программы пользовательского режима приводит к ошибке нарушения доступа.

Данная область памяти используется для поддержания совместимости с приложениями DOS и 16-разрядными приложениями Windows. Несмотря на потенциальную доступность, она не должна использоваться для программирования.

Область С — это адресное пространство, используемое прикладными программами и их DLL. Здесь размещаются также и модули Windows. Например, если приложению требуется управляющий элемент OCX, его модуль будет находиться в этой области.

Windows 9х отображает системные DLL Win32 (KERNEL32.DLL, USER32.DLL и т. д.) в это адресное пространство. Данные файлы используются совместно, то есть несколько процессов могут обращаться к единственной копии такого файла в физической памяти.

Область D доступна для программ пользовательского режима (однако размещать их здесь не рекомендуется).

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

Она также доступна для программ пользовательского режима.

Распределение виртуальной памяти

Каждая страница виртуального адресного пространства может находиться в одном из трех состояний:

· Reserved (зарезервирована) — страница зарезервирована для использования;

· Committed (передана) — для данной виртуальной страницы выделена физическая память в файле подкачки или в файле, отображаемом в память;

· Free (свободна) — данная страница не зарезервирована и не передана, и поэтому в данный момент она недоступна для процесса.

Виртуальная память может быть зарезервирована или передана с помощью вызова API-функции VirtualAlloc:

LPVOID IpAddress, //Адрес резервируемой или выделяемой области.

DWORD dwSise, //Объем области.

DWORD flAllocationType, // Тип распределения.

DWORD flProtect // Тип защиты от доступа.

Параметр flAllocationType может принимать значения следующих констант (помимо других);

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

· МЕМ_СОММIТ — параметр, выделяющий физическую память в оперативной памяти или в файле подкачки на диске для заданного зарезервированною набора страниц.

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

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

Windows тоже использует этот подход, когда выделяет память под стек каждого вновь создаваемого потока. Система резервирует 1 Мб виртуальной памяти под стек каждого потока, но выделяет первоначально только две страницы (8 Кб).

Параметр flProtect функции virtualAlloc используется для задания типа защиты от доступа, соответствующего вновь выделенной (committed) виртуальной памяти (это не относится к резервируемой памяти). Существуют следующие методы защиты:

· PAGE_READONLY присваивает доступ «только для чтения» выделенной виртуальной памяти;

· PAGE_READWRITE назначает доступ «чтение-запись» выделенной виртуальной памяти;

· PAGE_WRITECOPY устанавливает доступ «запись копированием» (сору-оnwrite) выделенной виртуальной памяти.

· PAGE_EXECUTE разрешает доступ «выполнение» выделенной виртуальной памяти. Тем не менее, любая попытка чтения — записи этой памяти приведет к нарушению доступа;

· PAGE_EXECUTE_READ назначает доступ «выполнение» и «чтение»;

· PAGE_EXECUTE_READWRITE разрешает доступ «выполнение», «чтение» и «запись»;

· PAGE_EXECUTE_WRITECOPY присваивает доступ «выполнение», «чтение» и «запись копированием»;

· PAGE_NOACCESS запрещает все виды доступа к выделенной виртуальной памяти.

Любые из этих значений, за исключением PAGE_NOACCESS, могут комбинироваться при помощи логического оператора OR со следующими двумя флагами:

· PAGE_GUARD определяет помеченные страницы как защищенные (guard page). При любой попытке обращения к защищенной странице система возбуждает исключительную ситуацию STATUS_GUARD_PAGE и снимает с данной страницы статус защищенной. Таким образом, защищенные страницы предупреждают только о первом обращении к ним;

· PAGE_NOCACHES запрещает кэширование выделенной памяти.

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

Необходимо отметить, что атрибуты защиты страницы могут быть изменены с помощью API-функции Virtual Protect.

Гранулярность при распределении памяти

Если параметр IpAddress не является кратным 64 Кб, то система округляет указанный адрес в меньшую сторону до ближайшего числа, кратного 64 Кб. Windows всегда выравнивает начальный адрес виртуальной памяти на границу гранулярности распределения (allocation granularily), которая является числом кратным 64 Кб (при использовании процессоров Intel). Другими словами, начальный адрес любого блока зарезервированной памяти представляет собой число кратное 64 Кб.

Читайте также:  Как полностью удалить корел с компьютера windows 10

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

Дескриптор виртуальных адресов

Система отслеживает, какие из виртуальных страниц являются зарезервированными, при помощи структуры, называемой дескриптором виртуальных адресов (Virtual Address Descriptor — VAD). Другого способа определения не существует.

Пример использования функции GlobalMemoryStatus

API-функция GlobalMemoryStatus, записывающаяся таким образом:

Procedure GlobalMemoryStatus(var lpBuffer: TMemoryStatus); stdcall;

Procedure GlobalMemoryStatus; external kernel32 name ‘GlobalMemoryStatus’;

Выводит множество данных, имеющих отношение к памяти, в составе следующей структуры:

DWORD dwLength; // Размер структуры MEMORYSTATUS.

DWORD dwMernoryLoad; // Процент используемой памяти.

DWORD dwTotalPhys; // Количество байтов физической памяти.

DWORD dwАvailPhys; // Количество свободных байтов физической памяти.

DWORD dwTotalPageFile; // Размер в байтах файла подкачки.

DWORD dwAvailPageFile; // Количество свободных байтов файла подкачки.

DWORD dwTotalVirtual; // Количество байтов адресного пространства,

DWORD dwAvailvirtual; // Количество свободных байтов памяти,

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

Рассмотрим, как диспетчер виртуальной памяти Windows преобразует адреса виртуальной памяти и физические.

Преобразование виртуальных адресов в физические: попадание

На рисунке показан процесс преобразования при отображении виртуальных адресов в физические. Он называется попаданием в (физическую) страницу (Page Hit).

Все виртуальные адреса делятся на три части. Самая левая часть (биты 22-31) содержит индекс каталога страниц процесса. Windows поддерживает отдельный каталог страниц для каждого процесса. Его адрес хранится в одном из регистров центрального процессора, который называется CR3. (В операцию переключения задач входит переведение CR3 в состояние, когда он указывает на каталог страниц процесса, на который осуществляя переключение.) Каталог страниц одержит 1024 четырехбайтовых элемента.

Windows поддерживает для каждого процесса совокупность таблиц страниц (page table). Каждый элемент каталога страниц содержит уникальный номер. Поэтому Windows поддерживает до 1024 таблиц страниц. ( В действительности таблицы страниц создаются только при попытке обращения к данным или коду конкретному виртуальному адресу, а не когда выделяется виртуальная память).

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

Третья, и последняя, часть виртуального адреса (биты 0-11) представляет собой смещение в данном страничном блоке. Сочетание номера страничного блока и смещения дают в совокупности адрес физической памяти.

Так как каждая таблица страниц состоит из 1024 элементов и количество таблиц равно 1024, общее количество страничных блоков, которое можно определить, таким образом, будет 1024 х 1024 = 210 х 210 = 220. Так как каждый страничный блок имеет объем 4 Кб = 4 х 210 байт, то теоретический предел физического адресного пространства будет 4 х 230 = 4 Гб.

У этой довольно сложной схемы преобразования есть несколько важных преимуществ. Одно из них — очень небольшой объем страничных блоков, которые легко могут быть размещены в памяти. Гораздо легче найти непрерывный блок памяти размером 4 Кб, чем, скажем, 64 Кб.

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

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

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

Каталог и таблицы системных страниц

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

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

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

Каждая страница виртуального адресного пространства процесса объемом 4 Гб существует в одном из трех состояний — свободном (free), зарезервированном (reserved) или переданном (committed). Теперь можно также сказать, что каждая переданная страница (Committed Page) является или действительной, или недействительной. Совокупность действительных страниц, то есть спроецированных на физическую память, называют рабочим наборам (Working Set) процесса. Рабочий набор постоянно меняется по мере того, как страницы подкачиваются в память или выполняется обратное действие.

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

Размер рабочего набора процесса ограничен теми установками, которые определяет Windows в зависимости от объема физической памяти. Эти значения приведены в следующей таблице.

Минимальный размер рабочего набора процесса

Максимальный размер рабочего набора процесса

Оцените статью