Компьютеры зависят от памяти — центральный процессор и графический процессор — это просто устройства для обработки данных, и худшее, что может случиться, — это потеря тактового цикла из-за задержки при ожидании данных.
Но быстрая память стоит дорого и потребляет много энергии, поэтому мы выстраиваем ее в иерархию: чем ближе к центральному процессору, тем быстрее должна работать память в ущерб объему, а чем дальше от процессора, тем больше объем в ущерб скорости.
Самая быстрая память за пределами регистров центрального процессора — это кэш-память L1 Cache4, которая очень маленькая, всего около 64 килобайт, но очень быстрая, со скоростью доступа около 1 нс. В кэше L1 хранятся как инструкции, так и данные, к которым есть прямой доступ у центрального процессора, поэтому его тактовая частота должна быть максимально приближена к тактовой частоте процессора. В свою очередь, они питаются от более крупных и медленных кэшей, которые поддерживают их заполненность.
Кэш-память — это разновидность памяти, которая называется статическая оперативная память (SRAM), а за пределами кэша находятся блоки гораздо более крупной динамической оперативной памяти (DRAM). DRAM имеет гораздо больший объем — десятки гигабайт, но за счет этого снижается скорость — около 60 нс. Разница в том, что статическая память хранит данные до тех пор, пока на блок подается питание, а динамическую память необходимо постоянно обновлять, чтобы данные не терялись.
Помимо встроенной памяти в виде кэша и оперативной памяти, существует внешняя память, например жесткий диск или твердотельный накопитель. Опять же, чем ниже скорость, тем больше объем, поэтому эти накопители имеют огромный объем — в терабайтах, но работают очень медленно по сравнению с внутренней памятью. Главное преимущество внешней памяти в том, что она может хранить данные без источника питания, что позволяет сохранять информацию годами и даже десятилетиями.
Поскольку каждое из этих решений в области памяти имеет свои компромиссы в отношении емкости и скорости чтения/записи, лежащие в их основе технологии на самом деле сильно различаются.
Статическая оперативная память
SRAM — самая быстрая память, во многом потому, что она самая простая. В то время как в других типах памяти, о которых мы расскажем позже, используются сложные способы хранения электрического или магнитного заряда, в SRAM для хранения одного бита используется набор простых транзисторов.
Транзисторы бывают разных типов, но в целом их можно представить как переключатели. У них есть три вывода: исток, сток и затвор. Если подать небольшое напряжение между затвором и истоком, между истоком и стоком потечет большой ток. Мы можем использовать это как переключатель, чтобы управлять прохождением тока через транзистор.
Из этих переключателей мы можем собрать логические элементы, а именно логический элемент, который нам нужен для создания памяти, — это инвертор, или элемент НЕ, который инвертирует подаваемый на него сигнал. Если на инвертор подается напряжение, он возвращает 0 В, а если напряжения нет, то возвращает напряжение. Понимаю, звучит запутанно.
Для нашей ячейки памяти нам понадобятся два инвертора, A и B. Мы соединяем выход инвертора A с входом инвертора B, а выход инвертора B — с входом инвертора A. Это называется перекрестным соединением, и оно создает стабильную петлю обратной связи: если инвертор A выдает 1, то сигнал поступает на вход инвертора B, который инвертирует его и выдает 0. Затем сигнал поступает на вход инвертора A, который подтверждает, что на выходе должна быть 1.
Вот как мы храним данные: пока на этот инверторный каскад подается питание, на выходе A будет 1. Эта ячейка памяти изолирована от остальной памяти еще двумя транзисторами, подключенными к так называемой строке адреса. Эти транзисторы строки адреса управляют доступом к битовым линиям, по одной с каждой стороны. Когда мы открываем транзисторы доступа, ток проходит по битовым линиям и считывается процессором.
Технически нам нужно передать сигнал только по одной битовой линии, но мы передаем и сам сигнал, и его инверсию, чтобы подавить возможные шумы в системе. Если в контуре присутствует единица, напряжение на битовой линии немного повысится, а если ноль — немного понизится. В конце битовой линии расположены усилители, которые усиливают сигнал, который может немного ослабевать, если битовые линии очень длинные.
Чтобы записать данные в ячейку, мы открываем транзисторы доступа и подаем напряжение на две битовые линии: на одну подаем высокое напряжение, а на другую — низкое. Это подавляет сигнал в контуре обратной связи и меняет полярность инверторов. Мы можем управлять состоянием инверторов, выбирая, на какие битовые линии подавать высокое, а на какие — низкое напряжение. Затем мы перестаем подавать напряжение на битовые линии, и новое состояние сохраняется в контуре.
Такая ячейка называется 6T-ячейкой, потому что в ней всего шесть транзисторов, но есть и другие типы с четырьмя транзисторами. Эти ячейки образуют массивы, в которых столбцы соединены вертикальными битовыми линиями, а строки — горизонтальными адресными линиями.
Чтобы получить доступ к ячейке памяти, мы определяем по адресу, на какую адресную линию она приходится, и повышаем напряжение на этой линии, одновременно снижая напряжение на остальных. Таким образом, каждая ячейка, подключенная к этой адресной линии, посылает свой сигнал по битовым линиям на усилители.
В нижней части все битовые линии подключены к мультиплексору столбцов, который выполняет функцию коммутатора, отфильтровывающего столбцы, нужные процессору, и передающего эти данные в процессор.
Изготовить SRAM таким образом гораздо проще, но в результате мы тратим много энергии на получение данных, которые нам не нужны. Чтобы решить эту проблему, можно разделить кэши, использующие SRAM, на блоки меньшего размера. Например, кэш объемом 1024 КБ можно разделить на 8 блоков по 128 КБ, чтобы снизить энергопотребление.
SRAM — очень быстрая память, и самым узким местом в ее работе является длина битовых и адресных линий, которая увеличивается с ростом емкости. Поэтому кэш-память первого уровня, которая должна работать максимально быстро, имеет небольшой объем, в то время как кэш-память более высоких уровней может быть больше.
Динамическая оперативная память
Если память на транзисторах, такая как статическая оперативная память, так хороша, почему бы не использовать ее для всей оперативной памяти? Что ж, мы могли бы это сделать, но тогда компьютеры стоили бы в десять раз дороже, были бы в два раза больше и потребляли бы столько же энергии, сколько обычная духовка. Память на транзисторах очень быстрая, но она невероятно громоздкая и дорогая в производстве.
Нам нужен какой-то другой тип памяти, который был бы компромиссным решением между скоростью статической оперативной памяти и объемом долговременного хранилища. На помощь приходит динамическая оперативная память (DRAM). Она динамическая в том смысле, что для хранения данных ее необходимо постоянно обновлять, в то время как статическая оперативная память хранит данные до тех пор, пока есть питание. Вместо транзисторов в DRAM используются крошечные конденсаторы, которые хранят электрический заряд, считываемый как бит.
Обычно каждая ячейка динамической оперативной памяти состоит из одного конденсатора, соединенного с транзистором, и называется ячейкой 1T1C. Конденсатор — это пассивный электронный компонент, который накапливает электростатический заряд. Его можно сравнить с крошечной батарейкой, хотя это совершенно разные устройства, которые могут очень быстро накапливать и отдавать заряд. Транзистор действует как своего рода переключатель, который позволяет заряжать и разряжать конденсатор.
К транзистору подключены две линии: линия адреса, которая соединена с затвором, и линия данных, которая соединена с другой стороной. Когда мы подаем напряжение на линию адреса, транзистор открывается и позволяет электронам проходить по линии данных в конденсатор, что позволяет нам записывать данные в ячейку, заряжая или разряжая ее. Мы также можем считывать напряжение на линии данных, чтобы узнать значение.
Когда на линию подачи напряжения не подается ток, транзистор закрывается, и ячейка оказывается изолирована от остальной схемы. Поскольку все элементы здесь очень маленькие, даже когда транзистор закрыт, заряд медленно уходит из конденсатора через транзистор. Поэтому такая память называется динамической: нам приходится постоянно пополнять заряд конденсатора, чтобы не потерять хранящиеся в нем данные.
Вы можете подумать, что мы можем изменять уровень заряда, чтобы хранить несколько битов в одной ячейке, но из-за высокой утечки заряда мы можем использовать каждую ячейку только для хранения одного бита данных. В DDR5, более или менее современном стандарте, уровень заряда конденсатора 1.1v считывается как двоичная 1 и 0v как двоичный 0, а максимальный заряд конденсатора составляет около 1.4v с учётом утечки заряда.
Эти отдельные ячейки памяти 1T1C расположены в ряд, а адресные линии проходят через весь ряд, соединяя все ячейки между собой. Ряды располагаются друг над другом, а битовые линии проходят через каждый столбец, соединяя все ячейки. Адресные и битовые линии разделены по вертикали и никогда не соприкасаются.
Помните, что когда на адресную линию подается напряжение, подключенный к ней транзистор открывается и соединяет конденсатор с битовой линией. Таким образом, каждый конденсатор в определенной строке одновременно подключается к соответствующей битовой линии в столбце, что позволяет считывать или записывать данные. В любой момент времени мы можем активировать только одну строку, чтобы избежать одновременного подключения нескольких конденсаторов к одной битовой линии, что может привести к взаимным помехам.
Эти массивы памяти образуют банк, в котором строк гораздо больше, чем столбцов. У нас может быть более 8000 столбцов и более 65 000 строк. Эти банки расположены на чипе по обе стороны от шины памяти. Когда мы обращаемся к оперативной памяти, мы указываем 32-битный адрес, который содержит всю информацию, необходимую для доступа к 8 ячейкам.
Первые 5 бит адреса указывают на банк памяти, а следующие 16 бит — на строку в этом банке, которую мы хотим активировать, включив линию адреса. Последние 10 бит адреса указывают на интересующие нас столбцы. Все битовые линии в банке подключены снизу к так называемому мультиплексору столбцов, который считывает адрес столбца и подключает к выходу только эти 8 битовых линий. С помощью этой системы мы можем получить доступ к любой 8-битной строке в банке.
DRAM выполняет три операции: чтение, запись и обновление. Когда мы считываем данные из банка, нам сначала нужно отключить все адресные линии, или строки, и предварительно зарядить все битовые линии, или столбцы, до уровня около 0,5 В. Это необходимо сделать, потому что битовые линии очень длинные, а конденсаторы сами по себе заряжены недостаточно, чтобы мы могли определить уровень их напряжения. После того как на каждой битовой линии установится напряжение 0,5 В, мы отключаем их и начинаем подключать нужную строку.
В нижней части каждой битовой линии, перед мультиплексором столбцов, находится усилитель, который предназначен для определения разницы в напряжении, а не абсолютных значений. Когда битовая линия подключена к ячейке, содержащей ~1.0v, напряжение на ней повышается до 0.55v, а когда она подключена к ячейке с 0v, напряжение на ней понижается до 0.45v. Усилители определяют разницу в напряжении по сравнению с предварительно заряженным уровнем и усиливают сигнал на битовой линии до 0v или 1v.
Итак, теперь все битовые линии в нашей строке усилены, строка «открыта», и мультиплексор столбцов использует адрес столбца, чтобы подключить нужные 8 столбцов к выходу драйвера чтения и передать данные в центральный процессор.
При записи данных в динамическую оперативную память мы используем тот же 32-битный адрес, но также отправляем 8 бит, которые хотим записать в память, на драйвер записи, подключенный к мультиплексору столбцов. Процесс в целом такой же, как и при чтении: все битовые линии предварительно заряжаются перед открытием строки, но на этот раз мультиплексор столбцов подключает 8 битовых линий к драйверу записи, на котором находятся 8 бит, которые мы хотим записать.
Драйвер записи обладает большей мощностью, чем чувствительные усилители, подключенные к каждой битовой линии, поэтому он может подавлять их, изменяя напряжение на каждой битовой линии на 0v или 1v независимо от того, каким оно было до этого. Это новое напряжение заменяет то, что хранилось в этих 8 соединенных конденсаторных ячейках, и записывает данные по этому адресу.
Как мы уже упоминали, крошечные транзисторы позволяют заряду в каждой ячейке постепенно расходоваться, поэтому нам нужно периодически обновлять каждую ячейку. Для этого мы закрываем все строки в блоке и предварительно заряжаем битовые линии, как и раньше, а затем открываем одну строку. Чувствительные усилители измеряют напряжение и управляют каждой битовой линией во всей строке, восстанавливая правильный заряд в каждой ячейке.
Мы повторяем этот процесс для каждой строки в банке, пока весь банк не будет полностью перезаряжен. Это нужно делать примерно каждые 64 мс, иначе заряд в каждой ячейке станет слишком низким, и мы не сможем достоверно определить, была ли в ячейке единица. Весь процесс обновления банка занимает несколько миллисекунд, и, конечно, во время этого процесса мы не можем использовать весь банк.
Если процессору нужны какие-то данные из банка, который обновляется, ему приходится ждать, что не очень удобно. Чтобы этого избежать, контроллер памяти ищет промежутки, чтобы при возможности обновить банк, когда процессор ничего от него не запрашивает. При необходимости обновление может быть более коротким: вместо того чтобы обновлять весь банк, контроллер может обновить несколько строк, отправить запрос и продолжить процесс обновления.
Все этапы чтения и записи, такие как предварительная зарядка линий, открытие строк и считывание столбцов, требуют определенного времени. Процесс проходит гораздо быстрее, если нужные нам данные находятся в уже открытой строке, поэтому важно располагать данные так, чтобы связанные элементы находились в одной строке.
Обычно имеется 32 банка, каждый из которых оснащен собственными мультиплексорами столбцов, драйверами и усилителями сигналов, что позволяет использовать банки параллельно. Это означает, что в любой момент времени доступны 32 строки, и мы можем организовать память таким образом, чтобы использовать это преимущество, расположив связанные элементы в одной строке в нескольких банках.
Твердотельные накопители
Конденсаторы с утечкой, используемые в динамической оперативной памяти, требуют постоянной подзарядки, что, разумеется, требует постоянного источника питания, но нам нужен более надежный способ хранения данных, чтобы они сохранялись при выключении и включении питания. Кроме того, нам нужна большая емкость, чем та, которую обеспечивает конденсатор, что дорого из-за сложной схемы его подключения.
Введите твердотельный накопитель (SSD), который решает эти проблемы, но опять же за счет скорости чтения и записи. Основным блоком в центре твердотельных накопителей является ячейка флэш-памяти с улавливанием заряда, которая представляет собой крошечную ячейку, способную улавливать электроны, и мы можем использовать количество захваченных электронов для хранения данных.
⁂ Существуют и другие типы ячеек флэш-памяти, такие как плавающие ворота и туннельный барьер, но мы не будем их здесь рассматривать.⁂
Ячейка с ловушкой заряда состоит из трех основных компонентов: затвора, ловушки заряда и канала. Каждый из этих компонентов отделен диэлектрическим барьером, который препятствует прохождению электронов между ними, но пропускает электрические поля. Если на секунду забыть о ловушке заряда, то можно сказать, что это что-то вроде обычного транзистора, где затвор действует как переключатель, пропускающий электроны через канал.
Это происходит за счет подачи положительного напряжения на затвор, который создает электрическое поле и индуцирует ток в канале. Напряжение должно быть достаточно высоким, чтобы преодолеть изоляцию между ними, — это называется пороговым напряжением. Если в ловушке заряда есть отрицательно заряженные электроны, они отталкиваются от этого электрического поля, а значит, чтобы преодолеть их сопротивление, потребуется более высокое напряжение.
Проще говоря, чем больше электронов в ловушке заряда, тем выше должно быть пороговое напряжение на затворе, чтобы вызвать ток в канале. Поскольку мы знаем, какое напряжение подаем на затвор, и можем определить, какой ток проходит через канал, мы можем вычислить, сколько заряда удерживается в ячейке.
В одноуровневых ячейках (Single-Level Cell, SLC) мы храним по одному биту на ячейку, поэтому количество заряда в ловушке указывает либо на 1, либо на 0. В наши дни мы в основном используем трехуровневые ячейки (Triple-Level Cell, TLC) для хранения 3 битов на ячейку, используя 8 различных уровней заряда электронов в ловушке. Но если ловушка изолирована от канала, то как туда попадают электроны?
Вот тут-то и начинается самое сложное. Ширина барьера между каналом и ловушкой заряда рассчитана таким образом, чтобы он был достаточно тонким, чтобы электроны могли «перепрыгивать» через него, но при этом достаточно толстым, чтобы их нужно было «заставить» это сделать. Если подать на затвор достаточно высокое положительное напряжение, оно создаст положительное электрическое поле, которое притянет отрицательно заряженные электроны и заставит их туннелировать через барьер.
Технически это квантовое туннелирование в действии: электроны — это не одна точка в пространстве, а скорее облако вероятностей. Электрическое поле достаточно сильное, чтобы электроны с большей вероятностью находились на стороне зарядовой ловушки, и электроны застревают там. Да, ваш телефон использует квантовую механику, чтобы сохранить фотографию вашей кошки.
По этой же причине срок службы твердотельных накопителей ограничен: эти очень тонкие барьеры немного разрушаются каждый раз, когда мы пропускаем через них электроны, поэтому со временем их способность удерживать электроны в ловушках заряда снижается. К счастью, это очень большое количество операций, но именно поэтому твердотельные накопители не подходят для долгосрочного хранения данных.
До сих пор мы рассматривали типы памяти, в которых ячейки располагались в один слой, но для повышения плотности хранения данных в твердотельных накопителях ячейки с ловушками заряда располагаются вертикальными столбцами, поэтому они имеют цилиндрическую форму. Такой вертикальный столбец соединенных ячеек называется цепочкой, и вся цепочка имеет общий центральный канал, который соединяется с битовой линией сверху.
Каждая ячейка в этом вертикальном столбце имеет отдельный управляющий вентиль, расположенный горизонтально. Для считывания данных из ячейки необходимо активировать строку управляющего вентиля и подключиться к соответствующей битовой линии. Идея заключается в том, что одновременно можно считывать или записывать данные только в одну ячейку в строке (столбце), как в динамической оперативной памяти.
Теперь представьте, что у нас есть несколько таких вертикальных цепочек, соединенных вместе. Каждая цепочка — это столбец, но ячейки в каждой строке имеют общий управляющий элемент, который проходит горизонтально через все цепочки. Такие ячейки называются страницами. Когда управляющий элемент активен, активна каждая ячейка на этой странице, и ток проходит по каналу к каждой битовой линии, позволяя считывать всю страницу целиком.
Именно поэтому эта технология получила такое название — флэш-память NAND, ведь она напоминает последовательное соединение транзисторов с логикой «И-НЕ». Этот тип памяти технически называется 3D-флэш-памятью NAND, потому что, как мы сейчас увидим, она имеет трехмерную структуру.
До сих пор мы сохраняли двумерную структуру, но расположение ячеек, о котором мы говорили, — это одна строка, а у нас есть несколько строк, соединенных одной и той же битовой линией, и мы объединяем эти строки в блоки.
Вот тут-то и начинается путаница: мы повысили уровень абстракции, и теперь в нашей структуре есть строки, столбцы и слои. Строка — это структура, о которой мы говорили, где каждый столбец — это строка, а каждая строка — это страница. Столбец — это вертикальный срез этой структуры, который группирует все строки, подключенные к одной и той же битовой линии. Слой — это горизонтальный срез, который выбирает все страницы на одном уровне.
Когда твердотельный накопитель получает запрос на получение каких-либо данных, в адресе указывается номер блока и номер страницы. Сначала ему нужно найти блок и определить, в какую строку попадает эта страница, чтобы активировать селектор битовых линий для этой строки. Затем он активирует управляющие элементы для этой конкретной страницы, которые передают пороговое напряжение через ток, протекающий по каналу к битовой линии, и считывают всю страницу.
До сих пор мы изображали эти страницы довольно маленькими, но на самом деле их ширина составляет около 16 КБ, то есть на одной странице помещается около 50 000 ячеек. Это большой объем данных для чтения одной страницы, поэтому твердотельные накопители должны быть оснащены оперативной памятью, которая выступает в качестве буферной памяти и помогает ускорить выполнение последующих запросов.
Еще одна особенность заключается в том, что, как и в случае с DRAM, одновременно активным может быть только один блок, поэтому нам нужно распределять данные по нескольким блокам, обычно на нескольких чипах. Представьте, что мы пытаемся передать большой видеофайл с твердотельного накопителя. Если бы все данные хранились последовательно в одном блоке, скорость чтения стала бы узким местом.
Если распределить файл по нескольким чипам, мы сможем считывать данные параллельно, а также использовать так называемую суперстраницу, которая использует одну и ту же физическую страницу для хранения данных на нескольких чипах, то есть они имеют один и тот же адрес. За управление памятью и распределение нагрузки между ячейками для продления срока службы отвечает контроллер твердотельного накопителя. Помните, что, хотя твердотельные накопители могут хранить данные годами, у них есть ограничение на количество операций чтения и записи, из-за чего со временем их характеристики ухудшаются.
Жесткие диски
Может показаться, что дисковый накопитель — устаревшая технология, учитывая, насколько широко за последнее десятилетие распространились твердотельные накопители, но на самом деле это по-прежнему один из самых дешевых и надежных способов долговременного хранения данных. Как и в случае со многими технологиями того времени, трудно поверить, что это сочетание невероятных достижений материаловедения и продуманной инженерии когда-либо покинуло пределы исследовательской лаборатории.
Основой жёсткого диска (HDD) является магнитный диск, или пластина, на которой данные хранятся с помощью магнитной ориентации. Обычно несколько пластин располагаются вертикально друг над другом с небольшим зазором между ними. Эти диски вращаются вокруг центрального шпинделя, соединённого с двигателем, который обеспечивает очень точную скорость вращения диска, обычно 7200 об/мин в потребительских устройствах.
Эти пластины обычно имеют ту же толщину, что и компакт-диски, — чуть больше миллиметра, но магнитный слой сверху и снизу невероятно тонкий — около 120 нанометров. Диск считывается головкой для чтения и записи с обеих сторон, которая перемещается по диску с помощью рычага.
Допуски здесь просто невероятные. Головка для чтения и записи находится внутри слайдера, который сконструирован таким образом, чтобы за счет сопротивления воздуха, создаваемого вращающимися дисками, поднимать головку на 15 нанометров над поверхностью диска. Из-за таких жестких допусков манипулятор может перемещаться над дисками только после того, как они полностью наберут скорость.
Кронштейн соединен с приводом с неодимовым двигателем, который может точно регулировать угол наклона кронштейна и, следовательно, положение головки чтения/записи. Таких кронштейнов несколько, по два на каждый диск, и все они соединены с одним узлом, то есть двигаются синхронно, что важно для распределения данных по разным дискам.
Я не могу в полной мере передать, насколько точны эти допуски: ширина человеческого волоса составляет от 50 000 до 100 000 нанометров, так что 15 нанометров — это микроскопический размер. При таком размере крошечная частица пыли могла бы полностью закрыть головку чтения/записи, поэтому весь накопитель герметичен, чтобы внутрь ничего не попало.
Так как же мы храним данные на этих дисках? Дело в том, что они покрыты очень тонким магнитным слоем, который разделен на сотни тысяч концентрических окружностей по всей поверхности, называемых дорожками. Каждая дорожка разделена на сектора с определенной структурой, при этом первый фрагмент данных используется в качестве преамбулы, чтобы головка чтения/записи знала, с какой скоростью вращается диск и, следовательно, как часто нужно считывать магнитный сигнал.
Следующий фрагмент данных — это адрес конкретной дорожки и сектора, состоящий из 48 бит. Технически это означает, что существует 281 триллион уникальных адресов, что намного больше, чем нам нужно для нынешних накопителей. После адреса идут данные размером около 4 КБ, а за ними — код коррекции ошибок (ECC) бит, которые позволяют накопителю определить, правильно ли считаны данные.
Головка чтения и записи на самом деле представляют собой отдельные механизмы. Головка записи — это крошечная катушка из медной проволоки, намотанной на магнитный сердечник. Когда мы записываем данные на диск, по медной проволоке проходит ток, создающий концентрированное магнитное поле на кончике головки. Магнитная поверхность диска на самом деле неоднородна и состоит из крошечных магнитных частиц, расположенных так, что их магнитные поля направлены перпендикулярно поверхности.
Пока диск вращается, записывающая головка очень точно регулирует магнитное поле, изменяя полярность магнитных частиц, по сути переворачивая их. Если ток течет в прямом направлении, магнитное поле заставляет северный полюс частиц указывать вниз, а если в обратном направлении — северный полюс указывает вверх.
Возникает соблазн присвоить каждому зерну значение 0 или 1 в зависимости от его полярности, но из-за особенностей работы считывающей головки это невозможно. Когда два зерна с противоположной полярностью находятся рядом, они создают гораздо более сильное магнитное поле, а считывающая головка предназначена для обнаружения таких полей.
Считывающая головка представляет собой «сэндвич» из магнитных и немагнитных полей, которые изменяют свое электрическое сопротивление в присутствии магнитного поля. Когда головка вращается над диском, она передает изменения сопротивления в виде сигнала, похожего на звуковую волну, причем самые сильные всплески возникают при смене полярности между соседними зернами.
При записи данных на диск мы присваиваем значение 1 изменению полярности, а значение 0 — отсутствию изменения. Если у нас есть последовательность из нулей или период без изменения сопротивления, может быть сложно точно определить, сколько в ней битов. Вот почему так важна преамбула: она позволяет синхронизировать скорость считывания с частотой вращения диска и определить, сколько у нас нулей.
У жестких дисков сравнительно низкая скорость чтения и записи, поэтому, как и в случае с твердотельными накопителями, они оснащены встроенной динамической оперативной памятью, которая позволяет считывать данные в буфер, что значительно ускоряет последующее чтение. Основным узким местом жесткого диска является время, необходимое для перемещения считывающей головки в новое положение, поэтому в идеале данные должны располагаться как можно ближе друг к другу. Для этого и нужна дефрагментация: со временем после удаления данных могут оставаться пустые участки, из-за чего головке приходится перемещаться на большее расстояние без необходимости. При дефрагментации данные перемещаются таким образом, чтобы между ними было как можно меньше пробелов.
В отличие от твердотельных накопителей с флэш-памятью, жесткие диски не имеют ограничения по количеству циклов записи, но их ресурс зависит от механического износа привода и подшипников шпинделя. После записи на жесткий диск данные могут храниться в магнитном слое десятилетиями, что делает его одним из лучших вариантов для резервного копирования критически важных данных.
╌╌╌╌
Святой Грааль в области памяти — это устройство, которое было бы таким же быстрым, как статическая оперативная память, но при этом обладало бы плотностью хранения данных, как у твердотельных накопителей, и сроком службы, как у жестких дисков. К сожалению, мы постоянно сталкиваемся с надоедливыми законами физики, поэтому пока нам приходится довольствоваться сложным процессом перемещения данных между различными уровнями иерархии по мере необходимости.
-----------------ПОДДЕРЖАТЬ АВТОРА ДОНАТОМ -------------------
- Много интересного - в телеграм "Математика не для всех"
- Взгляд на философию со стороны технаря - телеграм "Философия не для всех"