Linux. Virtual memory: различия между версиями

Материал из Wiki
Перейти к навигации Перейти к поиску
 
(не показаны 2 промежуточные версии этого же участника)
Строка 1: Строка 1:
= Общая информация =
Любой запущенный процесс получает собственный выделенный участок памяти. Но этот участок не отображается на доступные физические адреса, а использует виртуальное адресное пространство, которое является дополнительным слоем абстракции между процессом и физической памятью. Для сопоставления адресов между виртуальной и физической памятью используются специальные структуры - таблицы страниц.
Любой запущенный процесс получает собственный выделенный участок памяти. Но этот участок не отображается на доступные физические адреса, а использует виртуальное адресное пространство, которое является дополнительным слоем абстракции между процессом и физической памятью. Для сопоставления адресов между виртуальной и физической памятью используются специальные структуры - таблицы страниц.


Строка 4: Строка 5:


Таким образом размер виртуальной памяти в системе теоретически ничем не ограничен и общий ее объем может существенно превышать имеющуюся в наличии физическую память. И в этом нет ничего плохого, например, мы запустили несколько графических приложений, для работы которым требуются библиотеки Qt или GTK, но нужно ли каждый раз загружать их в память? Нет, достаточно сделать это один раз, а затем просто транслировать адреса виртуальной памяти процессов на одни и те же участки физической памяти. Но при этом каждый процесс будет думать, что у него загружена собственная копия библиотек.
Таким образом размер виртуальной памяти в системе теоретически ничем не ограничен и общий ее объем может существенно превышать имеющуюся в наличии физическую память. И в этом нет ничего плохого, например, мы запустили несколько графических приложений, для работы которым требуются библиотеки Qt или GTK, но нужно ли каждый раз загружать их в память? Нет, достаточно сделать это один раз, а затем просто транслировать адреса виртуальной памяти процессов на одни и те же участки физической памяти. Но при этом каждый процесс будет думать, что у него загружена собственная копия библиотек.
= Виды кэша =
'''PageCache''' или '''страничный кэш''' - это место, куда ядро складывает все данные, которые были записаны или считаны из диска.
Кэш '''inode''' и '''dentrie''' - тоже относится к файловой системе. Только в него записываются не сами данные, а структура файловой системы, расположение файлов и папок.


= Работа с памятью =
= Работа с памятью =
Строка 44: Строка 50:
  shared — Shared memory или Разделяемая память, можно посмотреть командой ipcs;
  shared — Shared memory или Разделяемая память, можно посмотреть командой ipcs;
  buffers — буферы в памяти — страницы памяти, зарезервированные системой для выделения их процессам, когда они затребуют этого, так же известна как heap-memory;
  buffers — буферы в памяти — страницы памяти, зарезервированные системой для выделения их процессам, когда они затребуют этого, так же известна как heap-memory;
  cached — файлы, которые недавно были использованы системой/процессами и хранящиеся в памяти на случай если вскоре они снова потребуются.
  cached — файлы, которые недавно были использованы системой/процессами и хранящиеся в памяти на случай если вскоре они снова потребуются. '''(Страницы которые изменились в памяти но не изменились на диске помечаются грязными (Dirty). Грязные страницы записываются на диск по расписанию или утилитой sync)'''
[[Категория:Linux]]
[[Категория:Linux]]
[[Категория:Self-education]]
[[Категория:Self-education]]
__ОБЯЗАТЕЛЬНОЕ_ОГЛАВЛЕНИЕ__
__ОБЯЗАТЕЛЬНОЕ_ОГЛАВЛЕНИЕ__
__БЕЗ_РЕДАКТИРОВАНИЯ_РАЗДЕЛА__
__БЕЗ_РЕДАКТИРОВАНИЯ_РАЗДЕЛА__

Текущая версия на 23:46, 26 ноября 2024

Общая информация

Любой запущенный процесс получает собственный выделенный участок памяти. Но этот участок не отображается на доступные физические адреса, а использует виртуальное адресное пространство, которое является дополнительным слоем абстракции между процессом и физической памятью. Для сопоставления адресов между виртуальной и физической памятью используются специальные структуры - таблицы страниц.

Что это дает? Во-первых, изоляцию процессов друг от друга, каждый из них работает в собственном виртуальном адресном пространстве и не имеет доступа к памяти других процессов. Во-вторых, позволяет системе гибко управлять физической памятью, например, для неактивного процесса часть страниц может быть перенесено из оперативной памяти в пространства подкачки, но это никак не повлияет на работу самого процесса, его адресное пространство не изменится, поменяется лишь трансляция в таблице страниц. И, наконец, это позволяет экономить физическую память, так если несколько процессов используют одни и те же данные, то система может транслировать адреса виртуальных пространств на один и тот же участок физической памяти.

Таким образом размер виртуальной памяти в системе теоретически ничем не ограничен и общий ее объем может существенно превышать имеющуюся в наличии физическую память. И в этом нет ничего плохого, например, мы запустили несколько графических приложений, для работы которым требуются библиотеки Qt или GTK, но нужно ли каждый раз загружать их в память? Нет, достаточно сделать это один раз, а затем просто транслировать адреса виртуальной памяти процессов на одни и те же участки физической памяти. Но при этом каждый процесс будет думать, что у него загружена собственная копия библиотек.

Виды кэша

PageCache или страничный кэш - это место, куда ядро складывает все данные, которые были записаны или считаны из диска.

Кэш inode и dentrie - тоже относится к файловой системе. Только в него записываются не сами данные, а структура файловой системы, расположение файлов и папок.

Работа с памятью

cat /proc/meminfo Информация об объеме RAM, SWAP и другая информация
free -m Общий объем памяти (RAM, SWAP), количество использованной, свободной памяти в МБайтах [1]
free -m -s 5 Вывод в других единицах — с ключами:-b байтах; -m мегабайтах; -g гигабайтах, -s запустить с заданным периодом обновления информации
free -m | awk 'NR==2{printf "Memory Usage: %s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2} Расчет использования оперативной памяти
Очистка кэша памяти
free -h Посмотреть размер страничного кэша можно в последней колонке - cached
cat /proc/slabinfo | egrep dentry\|inode Просмотр кэша inode и dentrie, относящихся к файловой системе.

В него записываются не сами данные, а структура файловой системы, расположение файлов и папок.

sync; echo 1 > /proc/sys/vm/drop_caches Очистка кэша PageCache
sync; echo 2 > /proc/sys/vm/drop_caches Очистка inode и dentrie
sync; echo 3 > /proc/sys/vm/drop_caches Очистка inode и dentrie и PageCache

Описание колонок в выводе команды free

total — общее количество памяти;
used — реально использующая в данный момент и зарезервированная системой память;
free — свободная память (total минус used);
shared — Shared memory или Разделяемая память, можно посмотреть командой ipcs;
buffers — буферы в памяти — страницы памяти, зарезервированные системой для выделения их процессам, когда они затребуют этого, так же известна как heap-memory;
cached — файлы, которые недавно были использованы системой/процессами и хранящиеся в памяти на случай если вскоре они снова потребуются. (Страницы которые изменились в памяти но не изменились на диске помечаются грязными (Dirty). Грязные страницы записываются на диск по расписанию или утилитой sync)