#железо #ram
Вопрос получился немного абстрактным, но я постараюсь максимально конкретизировать.
Начну немного из далека, если позволите.
Все мы знаем, что ОЗУ состоит из некоторой совокупности регистров, а те, в свою очередь,
представляют собой набор триггеров (простейшее электронное устройство, которое может
принимать одно из двух устойчивых состояний). И тут сразу же возникает вопрос. Поскольку
оперативная память является строго энергозависимой, то при каждом включении компьютера
триггеры будут каждый раз принимать какое-то состояние, которое предусмотрено по умолчанию.
Какое это состояние?
Если переходить от конкретного к абстрактному, то мы можем представить себе любой
триггер в виде обычного двоичного разряда. Каждое из устойчивых состояний мы можем
соотнести с еденицей или нулём. Так вот, какое положение понимают тригерры изначально?
Они все обнуляются? Или же наоборот принимают значение 1? А может быть и вовсе всё
происходит по какому-то псевдослучайному алгоритму? Очень хотелось бы знать!
Ответы
Ответ 1
Иногда делают отдельную линию сброса для всех триггеров. И, немного погодя после
включения питания, на эту линию подают сигнал, и все триггеры сбрасываются в ноль.
А иногда так не делают, и тогда все ОЗУ действительно заполняется случайными значениями.
Для динамического ОЗУ, которое стоит сейчас в персоналках так и есть, то есть аппаратного
сброса ОЗУ в ПК не предусмотрено. Но в персоналках после старта процессор программно
очищает ОЗУ (чаще всего заполняет нулями). Для отладки ОЗУ иногда заполняется каким-то
значением, отличным от нуля, чтобы отличить места, куда прошла запись. Но это уже забота
конкретного отладчика.
UPD1:
В общем, откуда берётся значение по умолчанию? Срабатывает обычное
присваивание значения по умолчанию нашей переменной? Или же просто
берётся участок памяти с изначально обнулёнными двоичными значениями и
этот ноль, который идёт вроде бы "по умолчанию", берётся именно
отсюда?
Не знаю как в Java, а в языке С/C++ статические переменные могут иметь и ненулевое
значение. И в языке С/C++ статические переменные инициализируются либо при загрузке
программы путем прописывания инициализирующих значений в специальный раздел программы.
Либо (в случае старта программы из ROM) специальная инициализирующая подпрограмма (которая
запускается до main) переносит из ROM в RAM инициализирующие значения для статических
переменных.
К тому же в языке С++ статической переменной может быть объект класса с нетривиальным
конструктором, который (например) может захватывать память в куче. И все эти конструкторы
запускаются операционной системой до main. И они инициализируют свои области памяти
явно ненулевыми значениями.
То есть в языке С/C++ не полагаются на изначальное обнуление части памяти, а процессор
принудительно инициализирует память при загрузке программы.
Кроме того надо понимать, что физическая память в ПК общего назначения используется
многократно разными программами. Например, Вы поработали с браузером, а потом запустили
транслятор Visual Studio. Так как после работы браузера в RAM лежат какие-то числа,
перед запуском Visual Studio RAM надо снова очистить. То есть если даже в начале работы
компьютера память была инициализирована нулями, то в процессе работы память надо многократно
переинициализировать для работы других программ.
UPD2:
Правильно ли я понимаю, что во всех современных ЭВМ используется
именно DRAM?
В персоналках и мобильниках в качестве RAM используется DRAM. В компьютерах для специальных
применений в качестве RAM может использоваться и статическая память. Она и быстрее
и меньше потребляет мощности. Вплоть до того, что можно парковать компьютер и RAM будет
сохранять все значения, питаясь от батарейки. И при включении питания работа начнется
не с начальной загрузки, а с места останова. Например, многие системы защит в разных
отраслях должны быть готовы к работе практически мгновенно после подачи питания. Тогда
там применяют статическую память в качестве RAM.
UPD3:
К примеру, у нас имеется следующая запись: public static int var = 5;
Что именно здесь происходит? Я слышал такое интересное мнение, что
сначала полю var должно быть присвоено значение по умолчанию, то бишь
0, а затем уже будет присвоено значение 5, непосредственно как
результат операции присваивания. Это происходит по той причине, что
ноль присваивается ещё на этапе объявления переменной, а присваивание
через инициализатор идёт следующей операцией. А как оно происходит на
самом деле? Есть ли какое-то мнение по данному вопросу?
Если речь идет о персоналках и конкретно о системе Windows и трансляторе Visual Studio,
то там при загрузке программы в память отведенную под var будет положено значение 5.
Возможно, что перед загрузкой программы RAM дополнительно обнуляется системой, но для
пользователя это недоступно и не имеет значения. Важно только то, что когда управление
получает пользовательский main в переменной var лежит значение 5.
Чтобы разобраться в этом вопросе советую Вам написать простую программу на языке Си типа:
int var = 5;
int main(){
return var+1;
}
После этого оттранслировать эту программу на Вашем любимом трансляторе с ключом,
который выводит ассемблерный листинг. И поглядеть, какие секции ассемблера формирует
транслятор для статических переменных.
UPD4:
В то же время, я получил ответ о том, что триггеры в структуре
динамической памяти с произвольным доступом не используются. В этом
случае возникает вполне резонный вопрос. Где же тогда физически
хранится вся информация? Как реализована бинарная концепция на
физическом уровне в данном случае? Благодарю!
Конденсаторы с динамическим обновлением ведут себя как триггеры. Так что Вы вполне
можете считать, что DRAM построена на триггерах.
UPD5:
@pepsicoca1 Да, но ведь конденсаторы с динамическим обновлением хоть и
ведут себя аналогичным с триггерами образом, но это всё равно не одно
и то же. Я так понимаю, что триггеры, как таковые, используется
непосредственно в SRAM? Я прав? – Lexoid 59 минут назад
Физически процессы в "честном" триггере и в конденсаторе с динамическим обновлением,
конечно, разные. Но для программиста и DRAM и SRAM выглядят и ведут себя одинаково.
Поэтому можно считать, что в DRAM организованы триггеры на конденсаторах, которые периодически
перезаписываются незаметно для программиста. В конце концов триггер должен хранить
свое значение и изменять его при записи, что с успехом делает конденсатор в DRAM. А
как при этом физически организован триггер это совсем не важно. Например, кроме DRAM
и SRAM существуют память на ЦМД. Также существует еще и Flash-память. Ячейки там ведут
себя как триггеры, хотя физические процессы там кардинально отличаются от физических
процессов и в DRAM и в SRAM и между собой.
Ответ 2
Я бы не стал сравнивать DRAM c тригером, там просто транзистор и конденсатор, т.е.
при включении вся память содержит только нулевые значения, в разделе WIKI по DRAM это
всё хорошо описанно.
Ответ 3
Поскольку оперативная память является строго энергозависимой, то при каждом включении
компьютера триггеры будут каждый раз принимать какое-то состояние, которое предусмотрено
по умолчанию. Какое это состояние?
Поставлен конкретный вопрос о конкретном электронном устройстве.
Ответ так же конкретен, хотя он вас и вряд ли устроит - неопределенное.
Триггеры - это полупроводниковые устройства. Чтобы определить, какое из двух полупроводниковых
устройств работает быстрее другого (чисто физически), необходимо произвести соответствующие
замеры. Очевидно, что сделать это не представляется возможным (да и не является нужным),
учитывая размеры современных п/п приборов.
Быстродействие одного транзистора может отличаться от быстродействия другого всего
на доли наносекунд. И именно эти доли и являются определяющим фактором. Разумеется,
что внешние условия могут также оказывать влияние, однако если этим фактором пренебречь,
а также сократить количество самих транзисторов (чтобы еще сильнее снизить вероятность
случайного поведения), то случайность становится вовсе не случайностью, и если вы возьмете
10 триггеров (в виде дискретных элементов), то с наибольшей вероятностью они всегда
будут принимать одни и те же состояния при включении (например из транзисторов A и
B первым сработает B; из C и D - C, и т.д.), что говорит о чисто физической природе
происходящего.