28 января 2013 г.

Разберемся в памяти

Решил написать о современных технологиях памяти. Желание появилось сразу после того, как я понял, что ни черта не разбираюсь в том, какая память какая и когда ее нужно ставить и куда вообще.
Начнем без особых вступлений, ибо памятей много, а времени мало.
Итак, наиболее часто память с произвольным доступом(более известна как RAM) представляется в виде матрицы.
Тут все просто. Если мы хотим прочитать или записать что-то по определенному адресу, то мы передаем этот самый адрес, шевелим нужными пинами и на выходе получаем данные (ну или подаем данные, если вы больше предпочитаете записывать). В память как правило встроены декодеры адреса, которые по заданному адресу выбирают определенную колонку или столбец (об этом будет дальше).
Для начала перечислим основные параметры памяти, на которые ориентируются производители.
Во-первых, память должна предоставлять быстрый доступ к определенным своим битам.
Во-вторых, память должна достаточно быстро отвечать процессору (параметр, называемый latency).
В-третьих, память должна быть дешевой (ага, конечно).
В-четвертых, память должна потреблять мало энергии.
В-пятых, память должна быть предназначена для работы на определенном уровне в иерархии. Здесь имеется в виду тот факт, что, чем ближе к процессору находится память (не физически, хотя и это тоже), тем быстрее она должна работать.
Забегая вперед, рассмотрим архитектуру типичного компьютера с точки зрения памяти.
Как правило, NOR-память содержит команды инициализации процессора. На это есть свои причины, которые мы рассмотрим позже. Обычно мы работаем с жестким диском. Процессор не может напрямую с ним работать, ему нужна некоторая помощь. В памяти NOR хранится управляющая процессором программа, которая, говорит ему, что делать дальше. Память NOR энергонезависима и довольно быстра (среди энергонезависимых), поэтому программу инициализации процессора лучше всего хранить в NOR-памяти. Однако в качестве буфера она использоваться вряд ли может. Самая главная причина заключается в том, что отношение стоимости памяти к ее размеру крайне велико. Да и скорость ее не так велика по сравнению с DRAM.
Можно заметить маленький зеленый квадратик на жестком диске. Тут тоже все просто. Жесткий диск - тоже устройство и имеет право иметь собственный контроллер, который тоже надо инициализировать.
С видеоадаптером ситуация аналогична. Можно отметить, что иногда у него DRAM не совсем собственная, а разделена с DRAM CPU.
Еще один тип памяти не отмечен на схеме. Этот тип EEPROM. Это крайне медленная дешевая энергонезависимая память, предназначенная специально для хранения серийников и прочего хлама.
А теперь небольшое дополнение к схеме, которое позволит системе работать быстрее.
Это дополнение - так называемый дисковый кэш. Он позволяет значительно ускорить доступ к  информации на жестком диске (а заодно и выполнить пятое условие для памяти - это тот, что про иерархию памяти в системах).
На самом деле NAND память не общается напрямую с DRAM, и жесткий диск не пишет напрямую в NAND. Все это кроется за довольно сложными схемами. Но с точки зрения потоков информации нам этого вполне достаточно.
Теперь рассмотрим, как дела обстоят с серверами.
Здесь добавляется кэш процессора. Он необходима для очень быстрого доступа к данным. Мы знаем, что у процессора уже имеются собственные кэши (L1 и L2). Они по своей сути тоже являются SRAM-памятью.
Теперь посмотрим, что внутри плееров и камер.
В ROM хранится прошивка, которую можно менять (поэтому она не совсем ROM и может быть NOR). SRAM здесь нужна в качестве площадки для "памятезатратных" операций процессора. Таковыми являются кодирование видео и звука или изображений. Основным элементом является NAND память. Она выбрана из-за того что она энергонезависимая, быстрая для целей устройства и относительно недорогая.

Ну а теперь подробно про каждый тип.

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

Нижняя пара транзисторов образует триггер с перекрестными обратными связями (cross-coupled flip-flop). Верхние транзисторы выполняют роль активной подтяжки. Транзисторы по бокам выставляют на прямой и инвертированной линии битов значения, хранящиеся в триггере при подаче сигнала на линию слов.
Для чтения подаем на Word line единицу и смотрим, что на bit line. Для записи зануляем необходимую bit line и подаем на word line единицу. Но это неинтересно.
Сильными сторонами этого типа памяти являются ее высокая скорость (благодаря применению дифференциальных линий и самой методики хранения) и низкое потребление в режиме неактивности (энергия потребляется только для изменения состояния триггера).
А вот слабыми сторонами является крайняя дороговизна памяти (6 или 4 транзистора на один бит - это много).

Перейдем к DRAM.
Здесь каждый бит представлен конденсатором и транзистором. Это значительно сокращает стоимость памяти по сравнению с SRAM.

Как следствие наличия токов утечки кондесатора, DRAM память необходимо периодически обновлять (подзаряжать). Сама подзарядка является сложным процессом. Необходимо выбрать время сканирования битов и вкачивать заряд только туда, где была (или остается) единица. На самом деле схема оказывается еще сложнее, и как она устроена точно знают только производители памяти. Да и неважно это, как внутри происходит поддержание состояний битов, а важно следствие из этого факта. А следствие такое: на все это расходуется энергия, причем довольно большая.
Чтение и запись производится открытием и закрытием транзистора. Чтобы записать значение, нужно закрыть транзистор, и выставить потенциал на линии битов. Сопротивление сток-исток стремится к бесконечности, и конденсатор зарядится (разрядится). Для чтения нужно открыть транзистор и посмотреть, что на линии битов. После чтения необходимо провести принудительную процедуру обновления состояния бита (мы же не просто так получаем инфу о состоянии бита, а путем слития с конденсатора заряда). Эта процедура опять добавляет расход энергии.
Преимуществами DRAM являются ее дешевизна и скорость (здесь не сравниваем с SRAM).
Недостатками будут ее энергозависимость, необходимость обновления и высокое энергопотребление.

А теперь перейдем к энергонезависмым типам.

Самой первой разработанной и применяемой энергонезависимой памятью являлась mask ROM. Каждый бит в ней состоял только из транзистора.

Она очень похожа на DRAM, только в ней нет конденсатора. Mask ROM программируется преимущественно на фабрике и больше не может быть изменена. Само программирование производится путем металлизации одного из контактактов транзистора. Скажем, убираем у транзистора затвор (пережигается "проволочка" на схеме). И в результате на линии битов мы не сможем наблюдать 0.
Стоит еще раз отметить, что такая память изготавливается на фабриках. Это значит, что ее производство будет происходить только в крупных сериях, при которых окупятся затраты на изготовление масок и прочую подготовку микросхем к производству.
Преимуществами Mask ROM являются ее энергонезависимость, произвольный доступ, и дешевизна (при больших партиях).
Недостатками являются ее одноразовость и возможность программирования только на фабрике.

Однако люди хотят сохранять свои изображения, музыку в память, стирать все это и чувствовать себя абсолютно независимыми. На помощь пришло изобретение, называемое "плавающий затвор", разработанное в BellLabs задолго до того, как люди стали думать о необходимости энергонезависимой памяти.
Эх! Какая же это классная компания, где было разработано почти все, что мы сейчас знаем, где трудилось множество Нобелевских лауреатов... И почему она распалась, а остались теперь только патентные говнари... Ну да ладно...
Посмотрим, что это за зверь, плавающий затвор.

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

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

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

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

Теперь рассмотрим эффект Фаулера-Нордхейма. Это по сути туннелирование электронов за счет изменения потенциала между затвором и истоком.

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

Есть у плавающего затвора серьезный недостаток.
Дело в том, что оксид это структура, в которой наличествует множество дефектов кристаллической решетки. Эти дефекты называются ловушками. в этих ловушках могут оседать электроны, так и не туннелировавшись в плавающий затвор. Все эти электроны могут проявляться как ложный накопившийся заряд. И теперь становится понятно, почему количество циклов перезаписи ограничено. Все потому что электроны в ловушках все копятся и копятся с каждым циклом.
В большинстве случаев ограниченное количество циклов не является проблемой. Их хоть конечное число, но их много. Для SLC NAND их порядка 500 000, а для MLC NAND их десятки тысяч.

Теперь перейдем к конкретным типам памяти.

EEPROM.

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

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

Начнем обзор Flash памяти с NOR.

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

В NAND Flash нашли способ еще уменьшить размер чипа. Для этого сократили количество линий истоков. Чип памяти уже не имел свойства произвольного доступа к каждой ячейке, но зато значительно сокращался в размере. На изображении представлена одна строка в NAND-памяти.

Помимо потери произвольного доступа появилась еще одна проблема. Дело в том, что чем меньше количество линий в чипе, тем они длиннее, а чем они длиннее, тем больше шумов. Так что в NAND велика вероятность словить ошибку чтения. Чтобы устранить этот недостаток применяется помехоустойчивое кодирование информации. После блока памяти оставляется несколько бит для ECC - error correction code. Он является неким хэшем от данных, записанных в блоке. Для имплементации этой защиты требуется довольно сложная логика, которая будет контролировать потоки данных.

Итак, после того как были описаны все распространенные типы памяти, самое время свести их в итоговую таблицу.

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

Smallest Write Smallest Read Write Speed Read Speed Active Power Sleep Power Price Applications
SRAM Байт Байт Очень быстро Очень быстро Высокое Очень низкое Очень высокая Мало быстрой памяти
DRAM Байт Страница Быстро Быстро Среднее Высокое Низкая Основное ОЗУ

А теперь такая же таблица для энергозависимой памяти.

Smallest Write Smallest Read Write Speed Read Speed Active Power Sleep Power Price Applications
ROM ? Байт ? Быстро Среднее 0 Очень низкая Исполняемый код
EEPROM Байт Байт Медленно Быстро Среднее 0 Высокая Серийники
NOR Байт Байт Медленно Быстро Среднее 0 Низкая Исполняемый код
NAND Страница Страница Медленно Медленно Среднее 0 Очень низкая Много данных

Как бы это все не было круто Flash память испытывает своеобразный кризис. Как мы знаем, чтобы увеличить плотность информации на чипе памяти, необходимо уменьшить техпроцесс, который обычно характеризуется размером какого-нибудь элемента транзистора (обычно затвора). Сейчас этот размер около 30 нм (можно и меньше, и больше). Так вот, чем меньше этот размер, тем меньше электронов может накапливаться в плавающем затворе. Для размеров около 30 нм число этих электронов примерно 100 - колоссально малое значение! Детектировать потенциал такого количества электронов - целая наука. Поэтому сейчас активно разрабатываются новые типы памяти: MRAM, FRAM, PCM (она же PRAM).

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

Комментариев нет:

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