Память 1Основные термины ram

Вид материалаДокументы

Содержание


DRAM практически вытеснены синхронными
2Major-производители микросхем и модулей DRAM
2.1Рейтинг major-производителей
3Ближайшее будующее 3.1Ферроэлектрическая память
3.2Архитектура MRAM
3.3Sdram ii (ddr)
3.4SLDRAM (SyncLink)
3.6Concurrent Rambus
3.7Direct Rambus
Ddr sdram
Время появления
3.8Работа с памятью в MS-DOS
3.9Защищенный режим процессора 386
3.10Страничное преобразование
Pentium Pro
3.10.1Отложенное копирование
3.10.3Адресное пространство процесса
Подобный материал:
13 Память

1Основные термины


RAM (Random Access Memory) - "память со случайным доступом"
  1. Любое устройство памяти, для которого время доступа по случайному адресу равняется времени доступа по последовательным адресам. В этом смысле термин практически утратил свое значение, так как современные технологии RAM используют методы оптимизации последовательного доступа, но в прошлом это действительно было критерием для отличения устройств, предназначенных для оперативного хранения небольших объемов данных (в русской традиции - "оперативное запоминающее устройство, ОЗУ") от устройств для постоянного хранения больших массивов ("постоянное или программное ЗУ, ПЗУ"). Сейчас очевидно, что реальным критерием является энергозависимость.
  2. Фактически разделяется на SRAM и DRAM.

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

SRAM (Static RAM) - "статическая память" - разновидность RAM, единицей хранения информации в которой является состояние "открыто-закрыто" в транзисторной сборке. Используется приемущественно в качестве кэш-памяти 2-го уровня. Ячейка SRAM более сложна по сравнению с ячейкой DRAM, поэтому более высокое быстродействие SRAM компенсируется высокой ценой. Несмотря на низкое энергопотребление, является энергозависимой.

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

Так как ячейки DRAM быстро теряют данные, хранимые в них, они должны регулярно обновляться. Это называется refresh, а число рядов, обновляемых за один цикл - refresh rate (частота регенерации). Чаще всего используются refresh rates равные 2K и 4K. Чипы, имеющие частоту регенерации 2К, могут обновлять большее количество ячеек за один раз, чем 4К и завершать процесс регенерации быстрее. Поэтому чипы с частотой регенерации 2К потребляют меньшую мощность. При выполнении операции чтения, регенерация выполняется автоматически, полученные на усилителе сигнала данные тут же записываются обратно. Этот алгоритм позволяет уменьшить число требуемых регенераций и увеличить быстродействие.

Несколько управляющих линий используется для указания, когда осуществляется доступ к ряду и колонке, к какому адресу осуществляется доступ и когда данные должны быть посланы или получены. Эти линии называются RAS и CAS (Row Address Select - указатель адреса ряда и Column Address Select - указатель адреса колонки), адресный буфер и DOUT/DIN (Data Out и Data In). Линии RAS и CAS указывают, когда осуществляется доступ к ряду или колонке. Адресный буфер содержит адрес необходимого ряда/колонки, к которым осуществляется доступ и линии DOUT/DIN указывают направление передачи данных.

SIMM и DIMM (Single и Dual In-Line Memory Module) – форм факторы модулей памяти. Наиболее популярными в настоящее время являются SIMM 72-пин и DIMM 168-пин. Первые имеют ширину шины 32 бит (как результат, в платы с процессором старше 486 их приходится ставить парами), ширина шины вторых 64 бит позволяет устанавливать их поодиночке в 64-битные платы. Это, по сути, единственное принципиальное преимущество DIMM перед SIMM (к тому же, кажется, крайне незначительное - годами SIMM ставили попарно и горя не знали). Надо, впрочем, иметь в виду, что современные высокоскоростные модули памяти для современных же компьютеров все же чаще выполнены в виде DIMM, что и порождает зачастую утверждения типа "DIMM лучше SIMM", хотя и понятно, что в такой форме оно некорректно.

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

Временная диаграмма это количества тактов системной шины, необходимых для доступа к случайно выбранному адресу и следующим за ним адресам. Характерные диаграммы для разных типов памяти (в предположении, что они достаточно быстры, чтобы оптимально взаимодействовать с шиной) - 5-3-3-3 (fast page), 5-2-2-2 (EDO), 5-1-1-1 (SDRAM).

Запись 5-3-3-3 обозначает, что на первую пересылку данных из памяти требуется 5 тактов процесра, а на последующие по 3.

Устройства памяти бывают синхронными и асинхронными:

Асинхронный - Термин применяется к устройствам памяти, цикл обращения к которым состоит из стадий, имеющих разную длительность, что не позволяет оптимизировать совместную работу подсистемы памяти и процессора. Скорость работы чипа асинхронной памяти измеряется в наносекундах (ns). Эта скорость указывает, насколько быстро данные становятся доступными с момента получения сигнала от RAS. Сейчас основные скорости микросхем, присутствующих на рынке - 70, 60, 50 и 45ns.

В настоящее время асинхронные устройства DRAM практически вытеснены синхронными.

Cинхронный - устройство памяти, цикл обращения к которому состоит из операций, имеющих одинаковую длительность, что позволяет синхронизировать его с системным таймером для оптимального взаимодействия между устройством и шиной. Синхронные устройства являются более передовыми по отношению к асинхронным, и в настоящее время идет процесс полного перехода к ним.
  • Доступ к данным в FPM осуществляется следующим образом (пример для операции чтения): когда на линию RAS подается логический ноль (низкое напряжение), адресный буфер содержит номер ряда, из которого данные должны быть переданы на усилитель сигнала. Затем следует такая же операция, но с CAS и с номером колонки. Далее включается линия DOUT, указывая на то, что данные доступны. Чтобы осуществить доступ к другой колонке того же ряда изменяется только CAS (это как раз и называется Fast Page Mode). Каждый раз при включении CAS, DOUT выключается, запрещая доступ к данным.

FPM была практически вытеснена с рынка EDO RAM благодаря тому, что доступ процессора к EDO RAM осуществляется быстрее примерно на 60%, чем к FPM.
  • EDO (Extended Data Out) - разновидность асинхронной DRAM. В памяти типа EDO используются такие же алгоритмы для RAS и CAS, но линия DOUT не выключается, когда включается CAS. Это позволяет начать доступ со следующей колонки не дожидаясь окончания передачи из текущей колонки. Это позволяет увеличить скорость доступа в пределах одной страницы и увеличить производительность системы.
  • BEDO (Burst EDO) разработана фирмой Micron Technology как попытка еще увеличить скорость памяти. Будучи разработанной, эта технология так и не вошла в широкое применение, так как SDRAM «круче». (burst mode - "пакетный режим", в отличие от "обычного" режима, при котором запрос по адресу возвращает только данные по этому адресу, в этом режиме такой запрос возвращает "пакет" данных по этому и последующим адресам.)

FPM, EDO и BEDO не рассчитаны на скорость шины более 66MHz.
  • SDRAM (Synchronous DRAM) - "синхронная DRAM" - название синхронной памяти "первого поколения", широко применяющейся в настоящее время и имеющей пропускную способность порядка 100Mb/сек. В перспективе, технология SDRAM позволит использование частоты шины до 125MHz.

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

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

2Major-производители микросхем и модулей DRAM


Чем отличаются major-производители от остальных?

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

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

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

2.1Рейтинг major-производителей


Hitachi (Япония), Hyundai (Корея), NEC(Япония), Samsung(Корея)

*****

3Ближайшее будующее

3.1Ферроэлектрическая память


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

В настоящее время опытные образцы 1Мбит FeRAM имеют время доступа 60 нс.

Другой игрок на этом поле – компания Fujitsu, которая ведет разработки кристаллов FeRAM емкостью от 64MB до 1GB. Однако здесь успехи более скромнее.

3.2Архитектура MRAM


MRAM (Magnetic RAM – магнитное ОЗУ) разработана фирмой Toshiba, которая уже выпустила опытные образцы, продемонстрировавшие выдающиеся скоростные качества – цикл чтения занимает всего 6нс.

Toshiba планирует создать прототип полновесного чипа MRAM к 2000 году. Примерно тогда же следует ожидать и появление первых чипов MRAM от Motorola, IBM, Siemens и Philips.

3.3SDRAM II (DDR)


Synchronous DRAM II, или DDR (Double Data Rate - удвоенная скорость передачи данных) - следующее поколение существующей SDRAM. DDR основана на тех же самых принципах, что и SDRAM, однако включает некоторые усовершенствования, позволяющие еще увеличить быстродействие. Основные отличия от стандартного SDRAM: во-первых используется более "продвинутая" синхронизация, отсуттствующая в SDRAM; а во-вторых DDR использует DLL (delay-locked loop - цикл с фиксированной задержкой) для выдачи сигнала DataStrobe, означающего доступность данных на выходных контактах. Используя один сигнал DataStrobe на каждые 16 выводов, контроллер может осуществлять доступ к данным более точно и синхронизировать входящие данные, поступающие из разных модулей, находящихся в одном банке. DDR фактически увеличивает скорость доступа вдвое, по сравнению с SDRAM, используя при этом ту же частоту. В результате, DDR позволяет читать данные по восходящему и падающему уровню таймера, выполняя два доступа за время одного обращения стандартной SDRAM. Дополнительно, DDR может работать на большей частоте благодаря замене сигналов TTL/LVTTL на SSTL3. DDR начнет производиться в 1998 году.

3.4SLDRAM (SyncLink)


SLDRAM, продукт DRAM-консорциума, является ближайшим конкурентом Rambus. Этот консорциум объединяет двенадцать производителей DRAM. SLDRAM продолжает дальнейшее развитие технологии SDRAM, расширяя четырехбанковую архитектуру модуля до шестнадцати банков. Кроме того, добавляется новый интерфейс и управляющая логика, позволяя использовать пакетный протокол для адресации ячеек памяти. SLDRAM передает данные так же как и RDRAM, по каждому такту системного таймера. SLDRAM в настоящее время находится в стадии разработки, а промышленное производство ожидается в 1999 году.

3.5RDRAM


RDRAM - многофункциональный протокол обмена данными между микросхемами, позволяющий передачу данных по упрощенной шине, работающей на высокой частоте. RDRAM представляет собой интегрированную на системном уровне технологию. Ключевыми элементами RDRAM являются:
  • модули DRAM, базирующиеся на Rambus;
  • ячейки Rambus ASIC (RACs);
  • схема соединения чипов, называемая Rambus Channel.

RamBus, впервые использованный в графических рабочих станциях в 1995 году, использует уникальную технологию RSL (Rambus Signal Logic - сигнальная логика Rambus), позволяющую использование частот передачи данных до 600MHz на обычных системах и материнских платах. Существует два вида Rambus - RDRAM и Concurrent RDRAM. Микросхемы RDRAM уже производятся, а Concurrent RDRAM будет запущена в производство в конце 1997 года. Третий вид RDRAM - Direct RDRAM, находится в стадии разработки, а его начало ее производства планируется в 1999 году.

Rambus использует низковольтовые сигналы и обеспечивает передачу данных по обоим уровням сигнала системного таймера. RDRAM использует 8-битовый интерфейс, в то время как EDO RAM и SDRAM используют 4-, 8- и 16-битовый интерфейс. RAMBUS запатентована 11 крупнейшими производителями DRAM, обеспечивающими 85% всего рынка памяти. Samsung в настоящее время проектирует 16/18-Mбитную и 64-Mбитную RDRAM. Toshiba же уже производит 16/18-Mбитную RDRAM и разрабатывает 64-Mбитную RDRAM.

В 1996 году консорциум RDRAM получил поддержку со стороны корпорации Intel, и новые чипсеты фирмы Intel будут поддерживать технологию RDRAM с 1999 года. В настоящее время игровые видеоприставки Nintendo 64 используют технологию Rambus для 3D-графики и звука высокого качества. Стандартные PC производства Gateway и Micron поддерживают карты фирмы Creative Labs c Rambus на борту.

3.6Concurrent Rambus


Concurrent Rambus использует улучшенный протокол, показывающий хорошее быстродействие даже на маленьких, случайно расположенных блоках данных. Concurrent Rambus применяется для 16/18/64/72-Mбитных модулей RDRAM. Это второе поколение RDRAM, отличается высокой эффективностью, необходимой для графических и мультимедийных приложений. По сравнению с RDRAM, применен новый синхронный параллельный протокол для чередующихся или перекрывающихся данных. Эта технология позволяет передавать данные со скоростью 600Мб/сек на канал и с частотой до 600MHz с синхронным параллельным протоколом, который еще повышает эффективность на 80%. Кроме того эта технология позволяет сохранить совместимость с RDRAM прошлого поколения. Планируется, что в 1998 году, благодаря дополнительным улучшениям, скорость передачи может достигнуть 800MHz.

3.7Direct Rambus


Технология Direct Rambus - еще одно расширение RDRAM. Direct RDRAM имеют те же уровни сигналов (RSL: Rambus Signaling Level - уровень сигналов Rambus), но более широкую шину (16 бит), более высокие частоты (выше 800MHz) и улучшенный протокол (эффективность выше на 90%). Однобанковый модуль RDRAM будет обеспечивать скорость передачи 1.6Гбайт/сек, двухбанковый - 3.2Гбайт/сек. Direcr Rambus использует два 8-битных канала для передачи 1.6Гбайт и 3 канала для получения 2.4Гбайт.

Сравнение архитектур




SDRAM

DDR SDRAM

SLDRAM

RDRAM

Concurrent RDRAM

Direct RDRAM

Скорость передачи данных

125 MB/sec

200 MB/sec

400 MB/sec

600 MB/sec

600 MB/sec

1.6 GB/sec

MHz

125 MHz

200 MHz

400 MHz

600 MHz

600 MHz

800 MHz

Стандарт

JEDEC

JEDEC

SLDRAM Consortium

RAMBUS

RAMBUS

RAMBUS

Время появления

1997

1998

1999

1995

1997

1999

Питание

3.3V

3.3V

2.5V

3.3V

3.3V

2.5V

14 - 15 Архитектура памяти в WIN32

3.8Работа с памятью в MS-DOS


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

Компьютер PC был крупным шагом вперед, поскольку использовал процессор Intel 8088, который мог адресовать 1 Мб памяти. Но очень скоро программам понадобилось больше 1Мб памяти. И в конце концов проблема стала настолько насущной, что несколько компаний предложили свои варианты решения.

Практически они сводились к одному: сделать так, чтобы разные объекты памяти занимали одни и те же участки физической памяти – но в разное время.

Первая из таких разработок, известная как спецификация расширенной памяти (Expanded Memory Specification, EMS), - плод совместных усилий трех фирм: Lotus, Intel и Microsoft. Эта спецификация давала возможность вставить в компьютер дополнительную память (например, 2Мб). Плата была способна обменивать различные области EMS-памяти с фиксированным (размеров в 64Кб) участком в доступном процессору пространстве.

В 1982 Intel выпустил новый процессор 286, способный адресовать 16Мб памяти К сожалению верхние 15Мб были доступны только в защищенном режиме процессора (Windows 3.1). Для обеспечения совместимости с предыдущими типами процессоров 286 работал в реальном режиме.

Вскоре Microsoft представляет новую технологию XMS (eXtended Memory Specifications), позволяющую выполнять приложения в реальном режиме процессора, но в тоже время пользоваться дополнительной памятью, устанавливаемой на 286-х машинах. Этот доступ осуществлялся при помощи специального драйвера HIMEM.SYS, который и по сей день используется в 16-битовых средах.

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

3.9Защищенный режим процессора 386


Процессор i386 (486, Pentium) имеет два режима работы - реальный (real mode) и защищенный (protected mode). В защищенном режиме процессор i386 может использовать все механизмы 32-х разрядной организации памяти, в том числе механизмы поддержки виртуальной памяти и механизмы переключения задач.

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

Средства поддержки сегментации памяти

Физическое адресное пространство процессора i386 составляет 4 Гбайта, что определяется 32-разрядной шиной адреса. Физическая память является линейной с адресами от 00000000 до FFFFFFFF в шестнадцатеричном представлении. Виртуальный адрес, используемый в программе, представляет собой пару - номер сегмента и смещение внутри сегмента. Смещение хранится в соответствующем поле команды, а номер сегмента - в одном из шести сегментных регистров процессора (CS, SS, DS, ES, FS или GS), каждый из которых является 16 -битным. Средства сегментации образуют верхний уровень средств управления виртуальной памятью процессора i386, а средства страничной организации - нижний уровень.


Организация виртуальной памяти

3.10Страничное преобразование


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

Процессоры Intel начиная с Pentium Pro позволяют операционным системам применять одно-, двух- и трехступенчатые схемы. И даже разрешается одновременное использование страниц различного размера. Эта возможность, конечно, повысила бы эффективность страничного преобразования, будь она внедрена в Windows NT. Увы, эта ОС возникла раньше и поддерживает только двухступенчатую схему преобразования с фиксированным размером страниц. Размер страниц для платформы Intel составляет 4 Кбайт, а для DEC Alpha - 8 Кбайт. Схема страничного преобразования выглядит так:

32-разрядный линейный адрес разбивается на три части. Старшие 10 разрядов адреса определяют номер одного из 1024 элементов в каталоге страниц, адрес которого находится в регистре процессора CR3. Этот элемент содержит физический адрес таблицы страниц. Следующие 10 разрядов линейного адреса определяют номер элемента таблицы. Элемент, в свою очередь, содержит физический адрес страницы виртуальной памяти. Размер страницы - 4 Кбайт, и младших 12 разрядов линейного адреса как раз хватает (212 = 4096), чтобы определить точный физический номер адресуемой ячейки памяти внутри этой страницы.

Рассмотрим отдельный элемент таблицы страниц (PTE - Page Table Element) более подробно, так как он содержит массу полезной информации (рис 2).

Старшие пять бит определяют тип страницы с точки зрения допустимых операций. Win32 API поддерживает три допустимых значения этого поля: PAGE_NOACCESS, PAGE_READONLY и PAGE_READWRITE.

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

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

Последние три бита определяют состояние страницы в системе. Старший из них (T-Transition) отмечает страницу как переходную, следующий (D-Dirty) - как страницу, в которую была произведена запись. Информация об изменениях в странице необходима системе для того, чтобы принять решение о сохранении страницы в файле подкачки при ее вытеснении (принудительном освобождении занятой памяти). Действительно, если страница не изменялась в памяти после загрузки, то ее можно просто стереть, ведь в файле подкачки сохранилась ее копия. И наконец, младший бит (P-Present) определяет, присутствует ли страница в оперативной памяти или же она находится в файле подкачки.

Для ускорения страничного преобразования в процессоре имеется специальная кэш-память, называемая TLB (Translation Lookaside Buffer). В ней хранятся наиболее часто используемые элементы каталога и таблиц страниц. Конечно, переключение процессов и даже потоков приводит к тому, что данные внутри этого буфера становятся неактуальными, т. е. недействительными. Это влечет за собой дополнительные потери производительности при переключении. К счастью, временной промежуток, выделяемый системой процессу, составляет 17 мс. Даже на машине с производительностью всего 20 MIPS за это время успеет выполниться непрерывный участок программы длиной (17 мс і 20 MIPS) 340 тыс. команд. Этого более чем достаточно, чтобы пренебречь потерями производительности при выполнении начального участка процесса.

Каждый процесс Windows NT имеет свой отдельный каталог страниц и свое собственное независимое адресное пространство, что очень хорошо с точки зрения защиты процессов друг от друга. Но за это удовольствие приходится платить ресурсами. Независимым процессам почти всегда приходится обмениваться информацией друг с другом. Windows NT предоставляет большое количество способов обмена, в том числе и при OLE. Но все они имеют в основе одно и то же действие: один процесс пишет нечто в некоторую ячейку памяти, а другой из нее читает. Это означает, что должны быть участки памяти, доступные разным процессам. На первый взгляд, это не проблема - могут же различные PTE ссылаться на одну и ту же страницу. Однако в каждом PTE хранятся атрибуты страницы, а ссылка на страницу со стороны PTE делается только в одну сторону. Это означает, что при изменении какого-либо атрибута в одном из PTE невозможно сделать то же самое для всех других PTE, ссылающихся на ту же страницу. Именно поэтому для совместно используемых страниц применяется механизм прототипов элементов таблицы страниц (Prototype Page Table Entry). Для совместно используемых страниц создается прототип PTE, который и содержит актуальные атрибуты страницы. Все PTE, принадлежащие различным процессам, ссылаются не на саму страницу, а на этот прототип, атрибуты которого и являются актуальными.

Сам прототип хранится в старших адресах каждого процесса. Общий размер памяти, отводимый для хранения прототипов, не превышает 8 Мбайт.

3.10.1Отложенное копирование


Все гениальное - просто. Многие программисты получили истинное наслаждение, впервые ознакомившись с тем, как изящно в Unix реализовано порождение процессов. В результате исполнения системного вызова fork(), призванного создавать новые процессы, два независимых процесса начинают совместно использовать одну и ту же область кода. Прошло немало времени, прежде чем пытливая инженерная мысль нашла возможность совместно использовать одну и ту же область данных. Действительно, нет необходимости каждому процессу иметь отдельный экземпляр данных, если эти данные только читаются. Проблема состоит в том, как определить, будут ли данные читаться в будущем или нет. Неважно, области кода или данных принадлежит совместно используемая память. Существенно лишь то, производится или нет изменение данных процессами. Если процесс производит запись, он должен иметь свою отдельную копию изменяемых данных. Если же в записи нет необходимости, то он может совместно использовать данные с остальными процессами. Подобный подход называется отложенным копированием (lazy evaluation): решение о необходимости копирования страницы откладывается до того момента, когда процесс попытается что-либо записать в нее. Все страницы порожденного процесса защищаются от записи. При попытке изменения защищенной страницы возникает процессорное исключение, страница копируется системой, и только после этого в нее разрешается запись.

Данный механизм, едва появившись, сразу же стал классическим и сегодня является составной частью многих систем Unix. Нет ничего удивительного, что он изначально присутствует в архитектуре и более молодой системы Microsoft Windows NT. Наиболее активно он используется при работе различных процессов с совместно используемыми динамически загружаемыми библиотеками (DLL), а также при запуске программ.

3.10.2Свопинг


Конечно, компьютер может и не иметь 4 Гбайт оперативной памяти, адресуемых процессорами Intel для того, чтобы обеспечить все линейное адресное пространство процесса физическими ячейками памяти. Windows NT, как и все другие операционные системы, применяет свопинг (swapping). Не используемые в конкретный момент страницы памяти могут быть вытеснены на диск в так называемый файл подкачки. В соответствующем элементе таблицы страниц эта страница помечается как отсутствующая, и при попытке обращения к ней возникает исключительная ситуация - "сбой" страницы. Обрабатывая ее, операционная система находит страницу на диске и переписывает ее в память, соответствующим образом подстраивая элемент таблицы страниц. После этого попытка выполнить команду, вызвавшую исключение, повторяется.

С понятием свопинга неразрывно связаны три стратегии: выборка (fetch), размещение (placement) и замещение (replacement).
  • Выборка определяет, в какой момент необходимо переписать страницу с диска в память. В Windows NT используется классическая схема выборки с упреждением: система переписывает в память не только выбранную страницу, но и несколько следующих по принципу пространственной локальности, гласящему: наиболее вероятным является обращение к тем ячейкам памяти, которые находятся в непосредственной близости от ячейки, к которой производится обращение в настоящий момент. Поэтому вероятность того, что будут востребованы последовательные страницы, достаточна высока. Их упреждающая подкачка позволяет снизить накладные расходы, связанные с обработкой прерываний.
  • Размещение определяет, в какое место оперативной памяти необходимо поместить подгружаемую страницу. Для систем со страничной организацией данная стратегия практически не имеет никакого значения, и поэтому Windows NT выбирает первую попавшуюся свободную страницу.
  • Замещение начинает действовать с того момента, когда в оперативной памяти компьютера не остается свободного места для размещения подгружаемой страницы. В этом случае необходимо решить, какую страницу вытеснить из физической памяти в файл подкачки. Можно было бы отделаться общими словами, сказав, что в данном случае Windows NT использует алгоритм FIFO: вытесняется страница, загруженная раньше всех, т. е. самая "старая". Однако механизм замещения настолько интересен, что заслуживает более пристального внимания, и мы еще расскажем о нем.

Часть ядра Windows NT, которая занимается управлением виртуальной памятью, называется VMM - Virtual Memory Manager. Это независимый привилегированный процесс, постоянно находящийся в оперативной памяти компьютера. VMM поддерживает специальную структуру, называемую базой данных страниц (page-frame database). В ней содержатся элементы для каждой страницы. Состояние каждой страницы описывается с помощью следующих категорий:
  • Valid - страница используется процессом. Она реально существует в памяти и помечена в PTE как присутствующая.
  • Modified - содержимое страницы было изменено. В PTE страница помечена как отсутствующая (P=0) и переходная (T=1).
  • Standby - содержимое страницы не изменялось. В PTE страница помечена как отсутствующая (P=0) и переходная (T=1).
  • Free - страница, на которую не ссылается ни один PTE. Страница свободна, но подлежит обнулению, прежде чем будет использована.
  • Zeroed - свободная и обнуленная страница, пригодная к непосредственному использованию любым процессом.
  • Bad - страница, которая вызывает аппаратные ошибки и не может быть использована ни одним процессом.

Все состояния, за исключением Modified и Standby, можно обнаружить в большинстве операционных систем. Страница, находящаяся в одном из этих состояний, реально располагается в памяти, в PTE содержится ее реальный адрес, но сама страница помечена как отсутствующая. При обращении к этой странице возникает аппаратное исключение, однако его обработка не вызывает больших временных затрат. Необходимо просто пометить страницу как присутствующую (Valid, P=1) и еще раз запустить последнюю команду.

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

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

Важнейшее понятие при организации свопинга - рабочее множество процесса (working set). В соответствии с принципом локальности процесс не использует всю память одновременно. Состав и количество страниц, с которыми процесс работает, меняется на протяжении его жизни. Страницы, с которыми процесс работает в течение фиксированного интервала времени, есть его рабочее множество на этом интервале. Переход от одного рабочего множества к другому осуществляется не равномерно, а скачками. Это вызвано семантикой процесса: переходами от обработки одного массива к обработке другого, от подпрограммы к подпрограмме, от цикла к циклу и т. д. Не нужно, чтобы в оперативной памяти размещались все страницы процесса, однако необходимо, чтобы в ней помещалось его рабочее множество. В противном случае возникает режим интенсивной подкачки, называемый трешингом (trashing), с которым сталкивается любой пользователь PC, запустивший одновременно слишком много приложений. В таком режиме затраты системы на переписывание страниц с диска в память и обратно значительно превышают время, выделяемое на полезную деятельность. Фактически система перестает заниматься чем-либо, кроме перемещения головок жесткого диска.

Теперь настало время разрешить интригу, которая возникла несколько абзацев назад, и подробно рассмотреть стратегию замещения страниц Windows NT. В классической теории операционных систем идеальной считается следующая стратегия: замещению подлежит страница, которая не будет использоваться в будущем дольше других. В той же классической теории эта стратегия признается неосуществимой, поскольку нет никакого разумного способа определить, какая из страниц подпадает под этот критерий. К счастью, в мире еще есть инженеры, готовые ломать голову над неосуществимыми идеями. Программистам Microsoft удалось приблизиться к этой стратегии на основе анализа рабочего множества процесса. В Windows NT используется весьма близкая стратегия: из памяти вытесняются страницы, вышедшие из рабочего множества процесса. Как же VMM узнает, какие страницы больше не принадлежат рабочему множеству? А очень просто! Периодически VMM просматривает список страниц с атрибутом Valid и пытается похитить их у процесса. Он помечает их как отсутствующие (P=0), но на самом деле оставляет их на месте, только переводит в разряд Modified или Standby в зависимости от значения бита D из PTE. Если похищенная страница принадлежит рабочему множеству, то к ней в ближайшее время произойдет обращение. Это, конечно, вызовет исключение - ведь страница-то помечена как отсутствующая. Но VMM очень быстро сделает эту страницу вновь доступной процессу, поскольку она реально находится в памяти. Если страница находится вне рабочего множества, то обращений к ней не будет и она со временем перейдет в разряд Free, а затем Zeroed и станет доступна другим процессам системы.

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


В Windows NT используется плоская (flat) модель памяти. Каждому процессу выделяется "личное" изолированное адресное пространство. На 32-разрядных компьютерах размер этого пространства составляет 4 Гбайт и может быть расширен до 32 Гбайт при работе Windows NT 5.0 на процессоре Alpha. Это пространство разбивается на регионы, различные для разных версий системы (рис. 5).

В Windows NT 4.0 младшие 2 Гбайт памяти выделяются процессу для произвольного использования, а старшие 2 Гбайт резервируются и используются операционной системой. В младшую часть адресного пространства помещаются и некоторые системные динамически связываемые библиотеки (DLL). Желание расширить доступное процессу адресное пространство привело к тому, что Windows NT 4.0 Enterprise процессу выделяется дополнительный 1 Гбайт за счет сокращения системной области (рис. 5).

Разработчики Windows NT 5.0 для платформы Alpha пошли дальше. Alpha - 64-разрядный процессор, но под управлением Windows NT версии до 4.0 включительно в его адресном пространстве используются только 2 Гбайт старших и 2 Гбайт младших адресов (рис. 5).

Дело в том, что в Win32 API для хранения адреса используются 32-разрядные переменные. Windows NT расширяет их до 64-разрядных с учетом знака. Спецификация VLM (Very Large Memory), которая будет реализована в Windows NT 5.0 для процессора Alpha, подразумевает использование 64-разрядных переменных для хранения адресов (рис. 5).

Если системе, которую вы разрабатываете, недостаточно для работы 32 Гбайт физической памяти, то, вероятно, вам стоит выбрать другую операционную систему. Если же вы готовы потесниться и произвести некоторую оптимизацию своего кода, то, возможно, вам подойдет и Windows NT.