← Назад к вопросам

Какие знаешь виды памяти процесса?

2.0 Middle🔥 112 комментариев
#Linux и операционные системы

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Какие знаешь виды памяти процесса?

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

Структура памяти процесса (low to high addresses)

┌─────────────────────────────────────┐ High addresses
│         Kernel Space                │ (ядро ОС)
├─────────────────────────────────────┤
│         (unmapped)                  │
├─────────────────────────────────────┤
│         Stack                       │ Растёт вниз
├─────────────────────────────────────┤
│         (free memory)                │
├─────────────────────────────────────┤
│         Heap                        │ Растёт вверх
├─────────────────────────────────────┤
│         Data Segment (initialized)  │
├─────────────────────────────────────┤
│         BSS Segment (uninitialized) │
├─────────────────────────────────────┤
│         Text Segment (code)         │
└─────────────────────────────────────┘ Low addresses

1. Сегмент кода (Text Segment)

Чтение, без записи; загружается с диска

Содержит машинный код программы — инструкции CPU.

int globalVar = 10;  // Не в text segment
const int PI = 314;  // Может быть в text segment

void function() {     // Код функции в text segment
    int local = 5;    // Переменная может быть на stack
}

Характеристики:

  • Неизменяемый (read-only)
  • Может быть общим для нескольких копий программы (sharing)
  • Размер известен во время компиляции

2. Инициализированный сегмент данных (Data Segment)

Чтение и запись; инициализировано в исходном коде

Глобальные и статические переменные с явной инициализацией.

int globalVar = 42;          // Data segment
static std::string s = "hi"; // Data segment
const int MAX = 100;         // Data или text segment (в зависимости от компилятора)

int main() {
    // ...
}

В памяти:

Data segment:
[42] [hi (адрес строки)]

3. Неинициализированный сегмент данных (BSS — Block Started by Symbol)

Чтение и запись; инициализировано нулями ОС

Глобальные и статические переменные без явной инициализации.

int uninitializedGlobal;           // BSS (значение 0)
static std::vector<int> vec;       // BSS (пусто)
thread_local int threadVar;        // BSS

int main() {
    // ...
}

Оптимизация: BSS не хранится в исполняемом файле (занимает 0 байт), ОС инициализирует его нулями при загрузке.

4. Стек (Stack)

Автоматическое управление; растёт вниз (к меньшим адресам)

Локальные переменные, параметры функций, возвращаемые адреса.

void function(int param) {
    int local1 = 10;              // На stack
    double local2 = 3.14;         // На stack
    std::string str = "hello";    // Объект на stack
}

Характеристики:

  • Очень быстро (просто сдвиг указателя stack pointer)
  • Ограниченный размер (обычно 1-8 MB)
  • LIFO (Last In First Out)
  • Переполнение вызывает stack overflow

5. Куча (Heap)

Динамическое управление; растёт вверх (к большим адресам)

Память, выделяемая явно через new, malloc() или контейнеры STL.

int main() {
    int* ptr = new int[1000];      // Array на heap
    std::vector<int> vec(1000);    // Данные на heap
    delete[] ptr;
}

Характеристики:

  • Медленнее stack
  • Большой размер (гигабайты)
  • Требует явного управления
  • Утечки памяти если не освобождать

Правила лучшей практики

  • Stack: локальные переменные, небольшие объекты
  • Heap: большие структуры, контейнеры, объекты с неизвестным размером
  • Глобальные: избегай мутабельного глобального состояния
  • Smart pointers: используй std::unique_ptr, std::shared_ptr