Устройство памяти процесса: стек, куча и сегменты данных
less_15__memory__deep_copy/theory_01__memory_organisation.md
Схема адресного пространства процесса — code segment, data segment, heap и stack — с указанием, в какую сторону растёт каждый сегмент. Ключевая мысль для Python-разработчика вынесена в отдельный блок: call stack (системный стек вызовов функций) и структура данных «стек» (list или deque в программе) — это два разных понятия, совпадающие только по имени; программный стек физически хранится в куче, как и все остальные объекты Python.
- Схема памяти: kernel space, stack, heap, data segment, code segment
- Heap растёт вверх — здесь живут все пользовательские объекты Python
- Stack (call stack) растёт вниз — кадры вызовов функций
- Различие call stack (системный) и list/deque как «стек» (в куче)
Показать начало файла (78 строк всего)
## Общая структура распределения памяти процесса
Обычно (в ОС Linux, Windows, macOS, и для Python в частности) процесс получает адресное пространство,
которое делится на **сегменты**. Схематично это можно изобразить так:
```
Высокие адреса памяти
─────────────────────────────────────
| Kernel space (ядро ОС) | ← процесс сюда напрямую не лезет
─────────────────────────────────────
| Stack (стек вызовов) | ← растёт вниз (к меньшим адресам)
──────────────── ↕ ──────────────────
| |
| (свободная память) |
| |
──────────────── ↕ ──────────────────
| | ← растёт вверх (к большим адресам)
| Heap (куча) | в Python (в отличии от других языков программирования),
| | все объекты, созданные пользователем, живут именно здесь.
─────────────────────────────────────
| | ← глобальные и статические данные
| Data segment | У Python-процесса здесь живут переменные
| | самого интерпретатора
─────────────────────────────────────
| Code segment (text segment) | ← машинный код программы
─────────────────────────────────────
Низкие адреса памяти
```
---
## Основные сегменты
1. **Code segment (текстовый сегмент)**
* хранит скомпилированный код программы (в Python это логика интерпретатора и исполняемый байт-код).
* обычно только для чтения.
2. **Data segment**
* глобальные и статические переменные.
* делится на `.data` (инициализированные) и `.bss` (неинициализированные).
3. **Heap (куча)**
* выделяется динамически во время работы программы.
* хранит объекты, которые создаются «на лету» (в Python это **все объекты: int, list, dict, class и т.д.**).
* растёт **вверх** (к большим адресам).
* управляется сборщиком мусора (GC) или вручную (в C).
4. **Stack (стек вызовов)**
* хранит **кадры вызовов функций (stack frames)**.
* в каждом кадре: локальные переменные, аргументы функции, адрес возврата.
* растёт **вниз** (к меньшим адресам).
* автоматически очищается при выходе из функции.
---
## Важное уточнение
…