8.1 Оперативная память
Оперативная память (RAM, ОЗУ) компьютера представляет собой массив ячеек памяти, каждая из которых имеет уникальный адрес. Эти ячейки могут хранить данные различного типа, такие как числа, символы и указатели. Когда программа выполняется, она размещает свои данные и инструкции в этой памяти для быстрого доступа.
Пример ячеек памяти:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
| 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 |
| 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 |
| 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 |
| 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 |
У каждой ячейки есть её порядковый номер, его ещё называют адресом ячейки в памяти или просто адресом. Если у вашего компьютера 8 Гб памяти, то у него 8 миллиардов таких ячеек, в которых можно хранить что-нибудь полезное.
Биты и байты
Каждая ячейка может хранить один байт информации. Каждый байт состоит из 8 битов, а каждый бит может содержать только 0 или 1. Пример (для целых положительных чисел):
| Число | Битовое представление | Округленное до байта |
|---|---|---|
| 0 | 0 | 00000000 |
| 1 | 1 | 00000001 |
| 100 | 1100100 | 01100100 |
| 1000 | 1111101000 | 00000011-11101000 |
| 1000 000 000 | 111011100110101100101000000000 | 00111011-10011010-11001010-00000000 |
Чем больше байт занимает переменная, тем больше значений в ней можно хранить. Пример:
- 1 байт — 256 уникальных значений
- 2 байта — 65 тыс. уникальных значений
- 3 байта — 16 миллионов
- 4 байта — 4 миллиарда
8.2 Как данные представляются в памяти
Типы данных и их представление
Числовые данные внутри процессора и в памяти
- Целые числа: хранятся в двоичной форме. Размер может варьироваться (1 байт, 2 байта, 4 байта).
- Вещественные числа: хранятся в формате с плавающей точкой (например, формат
IEEE 754для 4-байтных и 8-байтных чисел).
x = 42 # Целое число
y = 3.14 # Вещественное число
Важно! В Python встроенные типы int и float — это полноценные классы, которые могут реализовать сложные вычисления с числами бесконечной длины. Однако если вы будете использовать библиотеки для научных вычислений или ИИ, то столкнётесь именно с тем форматом данных, о котором я рассказал выше.
Символьные данные в памяти компьютера
Символы и строки хранятся в памяти в виде последовательностей байтов. Например, в кодировке ASCII каждый символ занимает 1 байт, в кодировке UTF-8 может занимать от 1 до 4 байтов.
В Python 3.x по умолчанию для строк используется кодировка UTF-8, но вы можете читать файлы, где текст хранится в других форматах, или пересылать данные по сети не в кодировке UTF-8.
Пример:
char = 'A' # Символ
string = "Hello, world!" # Строка
Отдельные символы в Python не имеют своего типа — для них также используется тип str. Однако в памяти эти строки хранятся посимвольно. Один символ обычно занимает 1—4 байта.
Указатели
Указатели хранят адреса других ячеек памяти. Они позволяют программам работать с динамическими структурами данных и эффективнее управлять памятью.
Пример:
list = [1, 2, 3, 4] # Список
list_pointer = id(list) # Указатель на начало списка
8.3 Примеры представления данных в оперативной памяти
1. Представление целых чисел
Целые числа хранятся в памяти в виде двоичных чисел (битов). В зависимости от типа данных они могут занимать различное количество байтов. Например, int обычно занимает 4 байта (32 бита).
Вот так в памяти будет представлено число 42:
| 00000000 | 00000000 | 00000000 | 00101010 |
2. Представление вещественных чисел (с плавающей точкой)
Вещественные числа (например, тип float) хранятся в памяти в формате с плавающей точкой, обычно по стандарту IEEE 754. float обычно занимает 4 байта (32 бита), а double — 8 байтов (64 бита).
Важно! Это стандартные типы данных, привязанных к памяти и процессору. Тип float в Python соответствует общеупотребимому типу double и занимает 8 байт.
Вот так в памяти будет представлено число 3.14:
| 01000000 | 01001000 | 11110110 | 01100110 |
3. Представление символов и строк
Символы (например, тип char) хранятся в памяти в виде последовательности байтов. Строки представляют собой массив символов. В языках C/C++ строки оканчиваются нулевым байтом (\0), но в Python это не так.
Вот так в памяти будет представлена строка Hello:
| 'H' | 'e' | 'l' | 'l' | 'o' |
Что в свою очередь будет представлено в виде 0 и 1:
| 01001000 | 01100101 | 01101100 | 01101100 | 01101111 |
8.4 Адресация динамической памяти
Динамическая память выделяется и освобождается во время выполнения программы, по мере необходимости. Все объекты, которые вы создаёте в Python, создаются в этой памяти.
Она делится на 2 типа:
Куча (Heap): Область памяти, из которой выделяются динамические объекты. Управление этой памятью осуществляется через функции выделения (например, malloc в C) и освобождения (например, free в C).
Стек (Stack): Область памяти, используемая для хранения локальных переменных и данных вызова функций. Память автоматически выделяется и освобождается при входе и выходе из функции.
Опять-таки, я не могу привести пример на языке Python, так как он слишком высокоуровневый для таких действий. Могу опять дать пример на языке С:
// Динамическое выделение памяти для массива из 10 целых чисел
int *dynamic_var = (int *)malloc(sizeof(int) * 10);
// Освобождение памяти
free(dynamic_var);
Адресация памяти — это процесс определения уникального адреса для каждой ячейки памяти. Каждый адрес указывает на конкретное местоположение в памяти, которое может содержать данные или инструкции.
Типы адресации
Физическая адресация: прямой доступ к физическим адресам ячеек памяти. Управляется аппаратным обеспечением (например, контроллером памяти).
Виртуальная адресация: использует механизм управления памятью, такой как страничная память или сегментная память, чтобы предоставить процессам изолированное и защищённое пространство адресов.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ