Взаимодействие с оперативной памятью

Эмуляторы, которые используются для демонстрации и практических занятий (RARS, QtRvSim или Ripes), не поддерживают имитацию работы контроллера шины, реализацию различных типов оперативной памяти и т. д. Как следствие, рассказ на эти темы останется чисто описательным, без возможности опробовать что-то на практике. Тем не менее механизмы одновременного доступа устройств к оперативной памяти и разделение реализаций памяти на динамическую и статическую используются в архитектурах ЭВМ повсеместно и, следовательно, требуют обоснования.

Доступ к оперативной памяти со стороны устройств

Эволюция термина «шина».

1. Классическая «фон-неймановская» ЭВМ не предусматривала дополнительной схемотехники для управлении внешними устройствами. Логически команды внешним устройствам отдавал центральный процессор, на котором для каждого устройства должны быть предусмотрены отдельные контакты. Пачки подключённых к ним проводов или наборы отпечатанных проводников и получили название «шины». Во времена первых ЭВМ внешние устройства производились если не поштучно, то уж точно малыми сериями и различными производителями. При этом все основные проблемы взаимодействия приходилось решать аппаратно на стороне процессора:

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

Что из этих протоколов стоит реализовать:

Попытка «распилить» такой переусложнённый центральный процессор приводила к созданию т. н. «канальных процессоров» (например, отдельный процессор ввода-вывода на диск) со своими системами команд и канальными программами.

2. Когда различных внешних устройств стало достаточно много, появилась необходимость выбора: как задать сколько и каких именно подключено к компьютеру? «Шина» помимо комплекта проводов обзавелась схемотехникой: появилось понятие «номер» (или «адрес») устройства. Для взаимодействия с таким устройством сначала надо было выставить адрес на управляющих входах микросхемы, после чего обмениваться данными с указанным устройством посредством единого канала

3. Отдельно старались решить проблему унификации доступа к разнообразным устройствам:

Общая шина в различных вариациях (например, МПИ / Unibus) применялась на микро ЭВМ:

4. Проблема «каравана» решилась так: разделили общий поток данных на взаимодействие с «быстрой» оперативной памятью (и впоследствии — видеопамятью; т. н. «северный мост»), и с «медленными» внешними устройствами («Южный_мост_(компьютер)). При этом:

5. Проблема «протокола на все случаи жизни» решилась введением протоколов более высокого уровня, наподобие USB, I²C и других

Кстати, происхождение термина «шина» не вполне очевидно. Русское «шина», скорее всего, восходит к шине — металлической обивке тележного колеса (которая в виде заготовки выглядела как железная или медная полоска); затем шинами стали называть всякие металлические полосы, в том числе электрические проводники, а уж за ними и пачки компьютерных проводов. Английское же «bus» принято объяснять «омнибусом», то есть «доставкой всего повсюду», однако, кажется, это анахронизм: первые шины назывались «bus» задолго до того, как стали доставлять всё и повсюду. Нам кажется более вероятной гипотезой происхождение «bus» от «Busbar» — то есть того же самого электрического проводника — и далее по накатанной дорожке к колёсной обивке, где и всплывает ожидаемый омнибус (буквально bus bar — шина для омнибуса).

Возможности шины

Проблема синхронизации: когда можно передавать / получать данные по шине?

Проблема ожидания: что делать процессору, когда (пока) устройство не готово к взаимодействию?

Проблема пересылки больших объёмов данных: надо ли процессору самому делать обмен данными между памятью и внешним устройством (это много и небыстро!)

⇒ Проблема разделения доступа к памяти между устройствами

ОЗУ как внешнее устройство

Отступление: виды оперативной памяти

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

Специфика работы с ОЗУ, даже по одной отдельной шине, состоит в том, что на каждое чтение/запись ячейки приходится ещё по одной команде записи — передача адреса этой ячейки.

Такт работы с ОЗУ

Запись:

  1. Выставить адрес на адресной шине
  2. Выставить записываемое слово на шине данных
  3. Дать команду записи
  4. Дождаться окончания операции

Чтение:

  1. Выставить адрес на адресной шине
  2. Дать команду чтения
  3. Дождаться конца операции
  4. Скопировать прочитанное слово с шины данных

Статическая и динамическая память

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

Дело в том, что регистры процессора и ячейки оперативной памяти как правило отличаются на уровне физической реализации

Статическая память

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

Раньше в электронике использовались лампы, теперь — полупроводники. Диод проводит электричество только «в одну сторону». Два последовательно соединённые диода не проводят электричества. Однако если собрать их в одном корпусе (транзистор) и подать «отпирающее» напряжение (на контакт «управление»), между входом и выходом потечёт ток.

Обратное управление (отсутствие тока на выходе при наличии сигнала) обеспечивается инвертором:

Здесь при отсутствии сигнала ток течёт через выход (считается 1), а при наличии отпирается транзистор, и из-за разности сопротивлений на втором контакте транзистора и на выходе сигнал падает (считается 0).

Из двух инверторов можно собрать триггер — схему, которая способна хранить состояние.

Схема работы триггера:

На базе триггера легко уже организовать ячейку памяти, хранящую один бит, присоединив ко входам и одному выходу по «ключу». Ключ — это транзистор, который «отпирает» проход сигнал, если на его управляющий контакт подаётся напряжение. Второй выход триггера не используется.

Достоинства и недостатки статической памяти:

Динамическая память

Смоделируем ячейку для хранения одного бита конденсатором.

Прототип ячейки памяти на базе конденсатора:

Для разрешения операций чтения и записи оборудуем ячейку двумя ключами:

Немного конспирологии: тиристорная память, и почему её нет?

Адресация

Для организации массива ячеек памяти нам понадобятся два типа устройств:

Рассмотрим массив емкостью в 2m+n однобитных ячеек памяти. Чтобы избежать создания 2m+n каналов к каждой ячейке, расположим их в виде матрицы. Часть адреса (номера ячейки) будет дешифровываться в общую для m ячеек строку, а другая часть — в общий для n ячеек столбец. Таким образом, чтение будет происходить сразу из всех ячеек строки, после чего потребуется повторная запись в каждую из них.

При операции записи в ячейку специальный мультиплексор каждого столбца выбирает, что записывать в неё — только что прочитанное значение или только что записанное (сигнал инвертируется, потому что, как мы помним, заряд конденсатора означает запись 0). Этот же механизм обеспечивает запись после чтения. Наконец, из значений, прочитанных из каждого столбца, отдельный мультиплексор выбирает требуемое для операции чтения.

Конденсаторы довольно быстро разряжаются сами собой — с учётом того, что в действительности специального конденсатора в динамической ячейке нет, используется собственная ёмкость транзистора. Так что время от времени приходится «вхолостую» перезаписывать содержимое всех ячеек памяти (это называется «цикл регенрерации»). Регенерация нужна не так часто, как запись после чтения, но операция с памятью — причём как минимум со всей строкой! — во время регенерации невозможна.

Без своевременной регенерации ячейка раскует неожиданно разрядиться и начать показывать 1 вместо 0. Любители т. н. «разгона» компьютеров знают: если понизить частоту регенерации памяти в аппаратных настройках, система станет работать чуть-чуть быстрее, но оперативная память может начать сбоить — это и есть те самые единицы.

Выше описана организация массива динамической памяти. Динамические ячейки памяти требуют массовой операции — перезарядки — поэтому использовать их поодиночке особого смысла нет.

Почему «память медленная»?

Массив динамической памяти существенно медленнее статической ячейки:

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

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

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

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

LecturesCMC/ArchitectureAssemblerProject/22_BusMemory (последним исправлял пользователь FrBrGeorge 2025-01-16 15:44:13)