Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

Вопрос об устройстве ОЗУ ЭВМ

#железо #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, и т.д.), что говорит о чисто физической природе происходящего.

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

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