
Вывод lsof
на моем RHEL7 показывает, что один файл с файловым дескриптором mem
используется 40 процессами. Означает ли это, что этот файл отображен в памяти 40 раз или что? Может ли кто-нибудь объяснить, что означает отображение файлов в памяти? Означает ли это, что он 40 раз в моей памяти?
# lsof /usr/lib/locale/locale-архив КОМАНДА PID ПОЛЬЗОВАТЕЛЬ ТИП FD РАЗМЕР УСТРОЙСТВА/ВЫКЛ ИМЯ УЗЛА vmtoolsd 605 корневая память REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive agetty 656 корневая память REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive настроено 963 root mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive iostat 1199 adm mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive chkMtaMem 1205 корневая память REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive snmpd 4704 корневая память REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive сон 5461 корневая память REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive cmsubagt 6487 root mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive сон 6649 корневая память REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc1 6803 корневая память REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc2 6835 корневая память REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc3 6836 корневая память REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc4 6856 корневая память REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc5 6884 корневая память REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc6 6889 usr mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc7 6893 usr1 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive cmfpagt 7704 корневая память REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc8 7943 корневая память REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive crond 8001 корневая память REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive sh 8005 adm mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive iostat 8014 adm mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive crond 20427 root mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc9 20648 корневая память REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc10 20649 корневая память REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc10 20760 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc9 20777 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc11 21353 корневая память REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc12 21354 корневая память REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc13 21355 корневая память REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc14 21356 корневая память REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc15 21357 корневая память REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc16 21358 корневая память REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc17 21554 корневая память REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc18 21569 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc19 21590 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc20 21647 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc21 22016 корневая память REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc22 22017 корневая память REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc23 22104 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc24 22122 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
решение1
Посмотрите на разницу между виртуальной и физической памятью.
Многие процессы могут отображать одну и ту же физическую память. Если 10 процессов отображают один и тот же файл, то максимум одна копия будет кэширована в ОЗУ.
Если память не является общей, то если один процесс изменяет ее, то эта страница (с изменением) дублируется перед фиксацией записи. (Таким образом, копируется не вся память. Это называется копированием при записи или COW).
Файл, отображенный в память, — это когда вы просите ОС отобразить файл в память. Она не загружает файл, пока вы не начнете читать/писать, а затем только то, что нужно. Отображение памяти — это просто другой интерфейс для чтения/записи/поиска и т. д. Вы также можете получить доступ к памяти через чтение/запись/поиск.
Так как же это делается?
Это делается путем осознания того, что некоторые вещи одинаковы: это swap и файлы; и оперативная память и файловый кэш одинаковы. Поэтому, когда вы открываете файл, он отображается как swap (не беспокойтесь, он не будет использоваться для подкачки других вещей). Когда вы начинаете читать, генерируется ошибка сегментации, и ОС подкачивает его из файла (исключение (seg-fault) обрабатывается ОС, поэтому не передается процессу) (на самом деле это не ошибка сегментации, это ошибка страницы). Неважно, какой интерфейс вы используете, память или файл. Это просто интерфейсы с одинаковой функциональностью.
решение2
Да, согласно руководству lsof
:
FD is the File Descriptor number of the file or:
cwd current working directory;
Lnn library references (AIX);
err FD information error (see NAME column);
jld jail directory (FreeBSD);
ltx shared library text (code and data);
Mxx hex memory-mapped type number xx.
m86 DOS Merge mapped file;
mem memory-mapped file;
mmap memory-mapped device;
pd parent directory;
rtd root directory;
tr kernel trace file (OpenBSD);
txt program text (code and data);
v86 VP/ix mapped file;
Только если он отображается в несовместном режиме и любой процесс записывает в виртуальную память, это потребует более одной копии файла в физической памяти. В противном случае, если запись не происходит (в чем я не думаю), данные даже не должны занимать физическую память, прежде чем какой-либо процесс прочитает память.