Так как же это делается?

Так как же это делается?

Вывод 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;

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

Связанный контент