Устройство оперативной памяти компьютера

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

Физически оперативная память выглядит как небольшая плата с микросхемами, которая вставляется в специально отведенный для нее разъем на материнской плате.

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

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

Теперь, прежде чем начать рассматривать устройство оперативной памяти компьютера, давайте вспомним, что минимальной единицей информации как при хранении, так и при передаче, является один бит. У бита может быть только лишь два состояния: включен или выключен, в цифрах это будет 1 и 0, соответственно. Переходим к устройству: оперативная память компьютера состоит из ячеек, размером в один бит и расположены эти ячейки в виде матрицы (матрица - это двумерный массив). Для того, чтобы память компьютера смогла запомнить информацию в размере 1 байт, ей потребуется 8 бит (т.к. 1 байт = 8 бит), т.е. 8 ячеек памяти. Общее устройство оперативной памяти я попытаюсь вам донести с помощью рисунка

Устройство оперативной памяти компьютера

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

#include <iostream>

using namespace std;

int main()
{
    int var = 1000;

    cout << "Size: " << sizeof(var) << endl;
    cout << "Value: " << var << endl;
    cout << "Adress: " << &var << endl;

    return 0;
}

В этой программе мы резервируем (выделяем) память для переменной типа int (имеет возможность хранить целые числа в интервале от -2147483648 до 2147483647) и присваиваем ей начальное значение - число 1000. Далее мы сделаем вот что:

  1. Узнаем опытным путем размер памяти, выделяемый для переменных такого типа (int).
  2. Выведем саму переменную.
  3. Выведем адрес в памяти (оперативной памяти компьютера), по которому находится данная переменная.

Вот такие строки кода нам нужны для решения поставленной задачи:

  1. cout << "Size: " << sizeof(var) << endl;
    (sizeof - оператор языка С++, позволяет получать размер объекта в байтах).
  2. cout << "Value: " << var << endl;
  3. cout << "Adress: " << &var << endl;
    (& - амперсанд, оператор получения адреса, по которому расположен объект)

Запустим программу и посмотрим результат работы этих строк:

Результат работы программы

Как мы видим, для переменной типа int было выделено 4 байта в памяти компьютера. Можете поэкспериментировать и с другими типами данных, благодаря чему вы себе "набьете руку" и запомните эти цифры, программист должен их знать. Во второй строке все понятно - мы просто вывели значение переменной. А вот третья строка - это самое интересное, здесь мы действительно убедились в том, что наши переменные располагаются в оперативной памяти во время работы программы.

У вас может последовать логический вопрос: почему переменная, которая занимает в оперативной памяти компьютера 4 байта (это в будет 8 * 4 = 32 бита), т.е. занимает 32 ячейки памяти, а адресом является только одно значение. Смотрим самый первый рисунок, где зарисованы ячейки оперативной памяти компьютера и выделен один байт красным. Для самой первой ячейки указан на рисунке адрес (адреса указываются в шестнадцатеричном формате исчисления). Вот теперь визуально добавьте к этим выделенным красным цветом восьми ячейкам еще столько, чтобы было в итоге 32 (4 байта). Теперь ответ на поставленный выше вопрос: адресом переменной в памяти является адрес первой ячейки памяти, по которому она расположена. Т.е. получается вот как: зная адрес первой ячейки (в обиходе его называют просто адресом, по которому расположена переменная, хотя на самом деле ее расположение только там начинается) и зная размер переменной (в нашем случае для int это 32 бита или 4 байта) процессор знает сколько нужно считать ячеек памяти для того, чтобы определить значение переменной. Для встроенных типов данных - эти размеры заранее известны процессору.

Данные в оперативной памяти хранятся в двоичной системе счисления, т.е. наше число 1000 будет выглядеть как 11 1110 1000 и реально будет занимать только лишь 10 ячеек памяти из доступных 32. В таком случае, если вы заранее знаете, что размер вашей переменной не изменится и не выйдет за пределы -32768 ... 32767, можете использовать тип данных short, который занимает в памяти компьютера ровно 2 байта, что в 2 раза меньше.

Распределение ячеек оперативной памяти