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

Что такое анонимная страница, как она относится к swap?

2.0 Middle🔥 141 комментариев
#Другое

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

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

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

Ответ: Анонимные страницы и их связь с swap

Что такое анонимная страница?

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

  • Стек и куча процесса (heap и stack).
  • Динамически выделяемая память (например, через malloc() в C или new в C++).
  • Анонимные отображения памяти (mmap с флагом MAP_ANONYMOUS).

Когда процесс запускается, ядро ОС выделяет ему виртуальное адресное пространство. Изначально страницы этого пространства не связаны с физической памятью (RAM). При первой попытке записи в такую страницу (или чтения, если это разрешено) возникает page fault (страничное прерывание). Ядро в обработчике этого прерывания находит свободную физическую страницу (frame), заполняет её данными (обычно нулями для вновь выделяемой памяти) и создаёт запись в page table процесса, которая связывает виртуальный адрес с этой физической страницей. Эта страница и становится анонимной — у неё нет «источника» на диске.

Отношение анонимных страниц к swap

Связь анонимных страниц с swap (подкачкой) является фундаментальной для управления памятью в современных ОС и напрямую вытекает из их природы.

  1. Необходимость резервного хранилища.
    Поскольку анонимные страницы не имеют файла-источника, при нехватке физической памяти (RAM) ОС не может просто «выбросить» их и потом прочитать из файла (как это делается с файловыми кэш-страницами). Чтобы освободить RAM, содержимое анонимной страницы должно быть куда-то сохранено. Этим местом и является **swap-пространство** (раздел на диске или специальный файл).

  1. Механизм работы (swapping out и swapping in).
    *   **Swap Out (Выгрузка на диск):** Когда системе требуется больше физической памяти, ядро (в частности, **kswapd** — демон подкачки в Linux) выбирает редко используемые анонимные страницы. Их содержимое копируется в заранее выделенное **swap-пространство** на диске (HDD или SSD). Физический кадр (frame) в RAM помечается как свободный и может быть использован для других целей. При этом в таблице страниц процесса запись изменяется: она теперь указывает не на физический адрес, а на **номер слота** (swap slot) в swap-пространстве. Страница становится **swapped out**.
    *   **Swap In (Загрузка с диска):** Если процесс позже попытается обратиться к виртуальному адресу, страница которого была выгружена, снова произойдёт **page fault**. Обработчик этого fault (уже другого типа — major fault) определит, что страница находится в swap. Ядро найдёт свободный физический кадр, прочитает данные из swap-слота обратно в RAM, обновит таблицу страниц, и выполнение процесса продолжится.

Практический пример и команды

Рассмотрим простую программу на C, которая выделяет анонимную память:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main() {
    // Выделяем 1 GiB анонимной памяти (используется heap)
    size_t size = 1024 * 1024 * 1024;
    char *buffer = (char *)malloc(size);
    if (buffer == NULL) {
        perror("malloc failed");
        return 1;
    }

    // При первой записи ядро выделяет физические страницы (anonymous pages)
    memset(buffer, 'A', size);

    printf("1 GiB of anonymous memory allocated and touched. Press Enter to exit...\n");
    getchar();

    free(buffer);
    return 0;
}

В Linux можно наблюдать за использованием анонимной памяти и swap с помощью инструментов:

# Следим за использованием swap (Si/So - swap in/out в kb/s)
vmstat 1

# Или смотрим общую статистику по процессам и swap
top

# Более детальная информация по страницам процесса
# (показывает, среди прочего, анонимные RSS-страницы)
cat /proc/<PID>/smaps

Ключевые выводы

  • Анонимные страницы — это «чистая» оперативная память процесса, не имеющая файлового эквивалента.
  • Swap — это механизм виртуализации памяти, предоставляющий резервное хранилище исключительно для анонимных страниц, позволяя системе работать с объёмом виртуальной памяти, превышающим физический RAM.
  • Без swap (или при его переполнении) система не сможет освобождать анонимные страницы, что при нехватке RAM приведёт к жёсткой ситуации — OOM Killer в Linux начнёт принудительно завершать процессы.
  • Процесс swapping (подкачка) — это постоянный диалог между быстрой, но ограниченной RAM и медленным, но ёмким диском, управляемый ядром ОС для обеспечения изоляции и стабильности работы множества процессов.