Долго работающие серверы Linux, обычно free Памяти становится все меньше и меньше, что заставляет людей чувствовать Linux Он настолько хорошо «поедает» память, что некоторые даже создали специально для него веб-сайт. LinuxAteMyRam.comобъясни это явление。на самом деле Linux Ядро будет кэшировать файлы, к которым осуществляется доступ, насколько это возможно, чтобы компенсировать огромный разрыв в задержке между диском и памятью. Память, используемая для кэширования содержимого файла, равна Page Cache。
Google матоками Jeffrey DeanОбобщенный одинLatency numbers every programmer should know,который упоминает издискчитать 1MB Данные занимают в 80 раз больше времени, чем память, даже если они заменены SSD Это еще и задержка памяти 4 раз.
Чтобы убедиться в этом, я провел эксперимент на этой машине. Page Cache роль. Сначала сгенерируйте 1G Размер файла:
# dd if=/dev/zero of=/root/dd.out bs=4096 count=262144
Очистить кэш страниц:
# sync && echo 3 > /proc/sys/vm/drop_caches
Подсчитайте время, необходимое для первого чтения файла:
# time cat /root/dd.out &> /dev/null
real 0m2.097s
user 0m0.010s
sys 0m0.638s
Прочтите тот же файл еще раз, поскольку система уже поместила содержимое прочитанного файла в Page Cache , на этот раз время значительно сокращено:
# time cat /root/dd.out &> /dev/null
real 0m0.186s
user 0m0.004s
sys 0m0.182s
Page Cache Он не только может ускорить доступ к содержимому файла, но также может создавать общие библиотеки. Page Cache,Может использоваться несколькими процессами,Избегайте загрузки всех процессов отдельно,В результате бесполезная трата драгоценных ресурсов.
Page Cache это память, управляемая ядром и расположенная в VFS(Virtual File System) уровень и конкретный уровень файловой системы (например, ext4, ext3). Процесс подачи заявки использует read
/write
Дождитесь файловых операций и войдите через системные вызовы. VFS слой, согласно O_DIRECT логотип, можно использовать Page Cache Поскольку это кэш содержимого файла, его также можно пропустить. Page Cache Не используйте функцию кэширования, предоставляемую ядром.
Альтернативно приложение может использовать mmap , сопоставляет содержимое файла с виртуальным адресным пространством процесса и может напрямую читать и записывать файлы на жестком диске так же, как чтение и запись в память. Виртуальная память процесса напрямую связана с Page Cache картографирование.
Чтобы понять, как управляется ядро Page Cache Да, давайте сначала посмотрим VFS Несколько основных объектов:
dentry
Организовать файлы в древовидную структуру каталогов;Для каждого процесса открытый файл имеет файловый дескриптор — структуру данных процесса в ядре. task_struct Существует тип files_struct из files Поле,сохранитьпроцесс Открытьиз Все файлы。files_struct структураизfd_array Поля file множество, Массив из индекса и дескриптора файла, контент ориентирован на file структура,указывает на то, чтопроцесс Открытьиздокумент。file Что касается открытия файлов в исходном процессе: если несколько процессов открывают один и тот же файл, то каждый процесс будет иметь свой собственный исходный файл. file , но эти file указать на то же самое inode。
Как показано на рисунке выше, процесс взаимодействует с дескриптором файла через VFS
серединаиз file
установить контакт, каждый file
Объект связан с другим dentry
соответствующее, согласно dentry
можно найти inode
,и inode
представляет сам файл. Процесс на картинке выше A и процесс B Тот же файл открывается и процесс A и процесс B Все они поддерживают свои собственные file
, но они указывают на то же самое inode
。
inode проходить address_space Управлять содержимым файлов, загруженных в Память, то есть да Page Cache。address_space из поля i_pages
Укажите на дерево xarray дерево, связанное с этим файлом из Page Cache Страницы висят на этом дереве. Когда мы получаем доступ к содержимому файла, мы можем использовать соответствующее смещение страницы указанного файла. xarray дерево, чтобы быстро определить, находится ли страница уже в Page Cache середина. Если страница существует, это означает, что содержимое файла прочитано в память, то есть оно существует в Page Cache in, если страница не существует, значит, контента нет; Page Cache , его нужно прочитать с диска.
Благодаря документации и inode Мы можем думать, что переписка один на один inode да Page Cache из Хозяин(host
),Ядропроходить inode->imapping->i_pages
ориентированныйиз дерева, управляемый и поддерживаемый Page Cache。
Page Cache Как да производится и выпускается, и как да связано с процессиз Шерстяная Ткань? Сначала нам нужно понять, как обработать. виртуальное адресное пространство。
Linux да Многозадачная система, поддерживающая одновременное выполнение нескольких процессизиз. Системы управления CPU Работая вместе, чтобы создать иллюзию:каждыйпроцесс Все эксклюзивно и непрерывноизвиртуальный Памятькосмос,И адресное пространство каждого процесса полностью изолировано от,Таким образом, процессы не будут знать о существовании друг друга. С точки зрения процессиза,Он будет считать себя единственным в дасистеме процесса.
Процесс Смотреть изда виртуального адресного пространства Памятьиз,Он также не может напрямую получить доступ к физическому адресу. Когда процесс обращается к виртуальному адресу из,Ядро отвечает за преобразование этого виртуального адреса в физический адрес Память.,То есть полное изкартографирование виртуального адреса по физическому адресу. Это отличается от выполнения этого процесса.,Даже доступ к одному и тому же виртуальному адресу,Но Ядро сопоставит их с разными физическими адресами.,Поэтому никакого конфликта не произойдет.
Этот процесс Linux Ядро состоит из task_struct описано. оценивать task_struct да Когда вы изучаете Ядро, вам следует сначала ознакомиться со структурой данных, потому что это очень важно. task_structописалпроцесс Связанныйиз Вся информация,Включает статус процесса,Статистика времени выполнения,процессродство,Информация о расписании прогресса,обработка сигналов,процесс Памятьуправлять,процесс Открытьиздокументждатьждать。Вот мы здесьсосредоточиться наизпроцесс виртуальной Памяти пространства, да task_struct серединаиз mm Полеориентированныйиз mm_struct Как описано, это процесс Память сводной информации о времени выполнения.
Обрабатывать виртуальный адрес линейно, использовать структуру vm_area_struct описать. Ядро рассматривает каждую область с теми же атрибутами «Из Память», что и vm_area_struct Чтобы управлять, каждый vm_area_struct да Непрерывный диапазон виртуальных адресов, не перекрывающих друг друга. mm_struct В нем есть односвязный список mmap
,привыкший vm_area_struct В серии есть еще одно красно-черное дерево. mm_rb
,vm_area_struct Повесьте на это дерево по начальному адресу. Используйте красно-черное дерево, чтобы быстро найти область памяти по адресу.
vm_area_struct Его можно сопоставить непосредственно с физической памятью или связать с файлами. если vm_area_struct да сопоставление файлов, по участникам vm_file
ориентированный соответствует указателю файла. Несвязанный файл из vm_area_struct даанонимный Память。
Использование разработчиком malloc ждать glibc Когда библиотечная функция выделяет Память, да не выделяет физическую Память напрямую, а применяет виртуальную Память в пространстве обработки виртуальной Памяти для генерации соответствующей структуры данных. vm_area_struct , а затем вставьте его в mm_struct из связанного списка mmap
,Висит одновременно на красном и черном дереве. mm_rb
начальство,Даже если работа сделана,Никакого физического распределения вообще не требуется. Только при первом чтении и написании виртуальной Память.,Обнаружено, что регион Память не соответствует физическому региону Память.,Это вызовет прерывание ошибки страницы.,Тогда заполните форму страницы от Ядро,Заканчиватьвиртуальный Памятьфизике Памятьизкартографирование.
когда Использование разработчиком mmap При сопоставлении файлов ядро использует vm_area_struct представляет отношение сопоставления файлов vm_file
,Загрузить содержимое файла с диска на физическую Память,То естьда Page Cache , и, наконец, создайте этот виртуальный адрес для физического адреса изкартографирования.
кроме того,Непрерывное из страниц в виртуальной Память,В физике Память не обязательно должна быть последовательной. Просто поддерживайте связь между виртуальной страницей «Память» и физической страницей «Память».,ты можешь правильноиспользовать Память。потому каждыйпроцесс имеет независимое адресное пространство. Чтобы завершить сопоставление виртуального адреса с физическим адресом, каждый процесс должен иметь независимую таблицу страниц исходного процесса. В реальном процессе виртуальная Память занимает адресное пространство, обычно два последовательных пространства, а не полностью разбросано по случайным адресам и з Память. Благодаря этой функции Ядроиспользовать многоуровневую таблицу страниц сохраняет отношения сопоставления, что может значительно уменьшить пространство, занимаемое самой таблицей страниц. Таблица страниц верхнего уровня хранится в mm_struct из pgd
в поле.
Хорошо, мы приступили к обработке виртуальное адресное пространство Теперь, когда у вас есть базовое понимание, взгляните ниже. Page Cache из генерирует и выпускает, и как это связано с пространством процессов.
Page Cache Существует два различных способа производства:
использовать Эти два способа доступа к файлам на диске,Ядро будет основано на указанном файле и соответствующем смещении страницы.,суждениедокументсодержаниеда Это уже в Page Cache , если контента не существует, его нужно прочитать с диска и создать Page Cache Страница.
Разница между этими двумя методами заключается в том, что используйте Buffered I/O
,Чтобы сначала преобразовать данные из Page Cache Скопируйте в пользовательский буфер, прежде чем приложение сможет прочитать данные из пользовательского буфера. И для Memory-Mapped file
Если говорить о , то да непосредственно Page Cache Страница сопоставлена с обработкой виртуальное адресное пространство, пользователи могут читать и писать напрямую Page Cache серединаизсодержание。потому чего не хватает однажды копировать, использовать Memory-Mapped file
Чем Buffered I/O
Это более эффективно.
По мере увеличения времени безотказной работы сервера,Свободного времени в системе будет все меньше,Чтосерединабольшойчасть Все были Page Cache занят. Все файлы, к которым был получен доступ, были Page Cache Кэш, память со временем исчерпаются, когда же их переработают? Page Cache Шерстяная ткань? Ядро считает, что Пейдж Cache да можно переработать Память. Когда приложение подает заявку на Память, и если свободной Память недостаточно, она будет переработана в первую очередь. Page Кэш, попробуйте подать заявку еще раз. Существует два основных метода переработки: прямая переработка и фоновая переработка.
использовать Buffered I/O
час,Page Cache и нет процессизвиртуальный Памятькосмоспроизводить прямойизассоциация,идапроходитьпользовательский буфер каксерединаизменять。Более эффективныйизMemory-Mapped file
Способ,Выглядит относительно просто,Но реализация, стоящая за этим, немного сложна. Давайте посмотрим, как реализована Ядрода. Memory-Mapped file
из。
Мы представили его ранее, inode да Page Cache из Хозяин(host
),Ядропроходить inode->imapping->i_pages
ориентированныйиз дерева, управляемый и поддерживаемый Page Cache。Так Ядродакак это сделатьотображение файлов памяти, напрямую кэшируйте содержимое файла. Page Cache Карта для обработки виртуального Память пространства и з Шерстяная ткань?
Мы знаем, что структура процесса task_struct серединаиз поля mm
ориентированный Процессиз виртуального адресного пространства mm_struct , а раздел виртуальной памяти состоит из структуры vm_area_struct описано, будет vm_area_struct связать вместе из связанного списка mmap
Это означает, что вы подали заявку на выделение виртуальной Память.
Если да файлов памяти, то файл из области виртуальной Памяти отображается vm_area_struct ,этоиз vm_file
Будет ли ориентированный отображен из файловой структуры file。file Представляет процессopen из файла и его члена. f_mapping
ориентированный address_space,Вот и всеиуправлятьдокумент С Page Cache из address_space связанный.
При первом доступе к отображению файлов из области виртуальной Память,Эта виртуальная Память не отображается на физическую Память.,Это вызовет прерывание ошибки страницы.。Ядров обработке не хватает Страницасерединаперерывчас,Найден для обозначения этого абзацавиртуальный Памятьиз vm_area_struct Есть связанные файлы, а именно vm_file
Полевая ориентированная файловая структура file。Ядрополучитьдокументиз address_space,В соответствии со смещением страницы содержимого, к которому осуществляется доступ.,верно address_space->i_pages
ориентированныйиз xarray дерево для поиска. Смещение страницы да в этом дереве соответствует странице из Память. Если оно не найдено, это означает, что содержимое файла не было загружено в Память, и страница Память будет выделена, Загрузите. содержимое файла в Памятьсередина,тогда поставь Память Страница висит xarray На дереве. В следующий раз, когда вы получите доступ к тому же смещению страницы, содержимое файла уже будет в дереве, и вы сможете вернуться напрямую. address_space->i_pages
ориентированныйиздеревода Ядроуправлятьиз Page Cache。
Загрузите содержимое файла в Page Cache После этого Ядро может заполнить записи таблицы страниц, связанные с процессом, сопоставить этот файл с областью виртуального адреса и сопоставить его непосредственно с Page Cache страницу, чтобы завершить обработку прерывания ошибки страницы.
Когда памяти мало и ее нужно перезапустить Page Cache , ядру необходимо знать эти Page Cache Какому процессу сопоставлена страница?,Таким образом, таблица страниц обработки может быть изменена.,Разблокировка виртуальных Памяти физических Памяти зкартографирование Мы знаем.,Один и тот же файл может быть сопоставлен с несколькими пространствами процессов.,Так что надо сохранятьобратное сопоставление отношений,Это основано на Page Cache Процесс обнаружения страницы.
Page Cache Страницаизобратное сопоставление отношения сохранены в address_space Поддерживать другое дерево i_mmap
。address_space->i_mmap
да Приоритетное дерево поиска (Приоритет Search Дерево), связанное с этим файлом Page Cache Страницаиз vm_area_struct висят на этом дереве, и эти vm_area_structОбщийориентированныйсоответствующийизпроцесскосмосдескриптор mm_struct,оти Учредил Page Cache Страница для обработки контактов.
Когда необходимо освободить Page Cache При сопоставлении страниц используйте address_space->i_mmap
ориентированныйиз Дерево,Находить Page Cache Сопоставление страниц, на какой процессиз какой vm_area_struct,Таким образом, определяется, что содержимое записи таблицы страниц необходимо изменить.
Кратко подведем итог,одиндокумент Переписка address_space основнойуправлять С两颗Дерево:i_pages
ориентированныйиз xarray Дерево сохраняет все Page Cache Страница;i_mmap
ориентированныйиз PST дерево, которое поддерживает сопоставление файлов, сформированное vm_area_struct Область виртуальной памяти, используемая для освобождения Page Cache Страница, найдите сопоставленный файл исходного процесса. Если файл не отображается в пространство процесса, то i_mmap
Переписка PST Дерево пусто.
Можно посмотреть по ходу /proc/meminfo
Изученные документы Page Cache Различные сопутствующие индикаторы.
/proc
дапсевдофайлсистема (Pseudo filesystems )。Linux использовать псевдофайловую систему, делая информацию о системе Ядро доступной в пространстве пользователя. использовать free
、vmstat
ждатькоманда для просмотраиз Памятьинформация,данныена самом делевсе из /proc/meminfo
。
Давайте посмотрим на пример:
$ cat /proc/meminfo
MemTotal: 8052564 kB
MemFree: 129804 kB
MemAvailable: 4956164 kB
Buffers: 175932 kB
Cached: 4896824 kB
SwapCached: 40 kB
Active: 2748728 kB <- Active(anon) + Active(file)
Inactive: 4676540 kB <- Inactive(anon) +Inactive(file)
Active(anon): 3432 kB
Inactive(anon): 2513172 kB
Active(file): 2745296 kB
Inactive(file): 2163368 kB
Unevictable: 65496 kB
Mlocked: 0 kB
SwapTotal: 2097148 kB
SwapFree: 2095868 kB
Dirty: 12 kB
Writeback: 0 kB
AnonPages: 2411440 kB
Mapped: 761076 kB
Shmem: 170868 kB
...
о /proc/meminfo
Подробное объяснение каждого пункта см. [Linux Документация ядра - The /proc Filesystem](The /proc Filesystem — The Linux Kernel documentation)。Давайте сосредоточимся на Page Cache Связанныйиз поля。
Текущая система Page Cache ждать В Buffers + Cached Нова :
Buffers + Cached = 5072756 kB
Как обсуждалось ранее, если vm_area_struct Связано с файлом, тогда эта область Память да File-backed Память. Нет связанных файлов из vm_area_struct Память область анонимно Память. Можем ли мы считать, что файлы идиска связаны между собой? File-backed Память в общем, надо ждать Page Cache Шерстяная ткань?
Active(file) + Inactive(file) = 4908664 kB
Это кажется немного неправильным,Все еще немного хуже,Разницаизэта частьдаобщий Память(Shmem)。
Linux Для реализации «общей памяти» (shared память) функция, то есть содержимое нескольких файлов в одном файле, для чего требуется виртуальная файловая система. Виртуальный файл на самом деле не существует на компьютере, он лишь моделируется компьютером. Но виртуальные файлы тоже имеют свои собственные inode и address_spaceструктура.Ядро Создание Общее анонимное область обсуждения, будет создан виртуальный файл, который будет vm_area_structассоциациявставать,так многопроцессиз vm_area_struct встречаассоциация到такой жеодинвиртуальныйдокумент,В конечном итоге отображается на той же странице изфизики Память.,оти Осуществленныйобщий Память Функция。Вот и вседаобщий Память(Shmem)из Принцип реализации。
потому что Shmem Нет связанного файла диска, поэтому он не принадлежит File-backed Память,идабыл записан ванонимный Память(Active(anon) или Inactive(anon))часть。Но потому что Shmem Имей себя inode ,inode->address_sapce
Обслуживание Page Cache Страница висит address_space->i_pages
ориентированныйиз xarray на дереве, поэтому Shmem Часть из Память тоже следует учитывать Page Cache внутри.
также File-backed Еще есть память Active и Inactive из разницы. Только что было использовано из данных из Память пространства считается да Active из-за того, что пространство, которое давно не проходилось, считается да. Inactive из. Когда физической Память недостаточно и ее необходимо высвободить, она будет высвобождена первой. Inactive из Память。
Page Cache и Анонимная память и File-backed Памятьждатьмеждуизсвязь,Как показано на рисунке ниже. хотя ошибки неизбежны,Но, вообще говоря, имеет место следующее соотношение да:
Примечательное изда,AnonPages != Active(anon) + Inactive(anon)。Active(anon) и Inactive(anon) да используется для обозначения того, что оно не подлежит вторичной переработке, но да можно обменять на swap Раздел из Память, пока AnonPages Тогда да означает, что соответствующего файла из Память нет, и два угла разные. Shmem Хотя оно принадлежит ВActive(anon) или ВОЗ Inactive(anon),Да Shmem иметь Переписка Памятьвиртуальныйдокумент,Местокэто Не принадлежит В AnonPages。
Суммируя,Page Cache подтверждатьассоциация Понятнодокумент,Независимо от реального существования файла с диска,возвращатьсядавиртуальный Памятьдокумент。AnonPages Нетиметьассоциациялюбойдокумент。Shmem Виртуальный файл связан и принадлежит Active(anon) или ВОЗ Inactive(anon),такой жечас Также расчет Page Cache середина.
Если мы хотим знать, какой объем содержимого файла кэшируется в Page Cache ,Можетиспользовать [fincore](fincore(1) - Linux справочная страница (man7.org)) Заказ. Например:
$ fincore /usr/lib/x86_64-linux-gnu/libc.so.6
RES PAGES SIZE FILE
2.1M 542 2.1M /usr/lib/x86_64-linux-gnu/libc.so.6
RES
дадокументсодержаниепогрузился в физику Памятьзаниматьиз Памятькосмосразмер。PAGES
да конвертируется в количество Память Страница, занимаемое содержимым файла. В приведенном выше примере файл /usr/lib/x86_64-linux-gnu/libc.so.6
из Весь контент загружен в Page Cache。
объединить lsof
командой мы можем проверить, сколько места занимает определенный процессopen из файла Page Cache:
$ sudo lsof -p 1270 | grep REG | awk '{print $9}' | xargs sudo fincore
RES PAGES SIZE FILE
64.8M 16580 89.9M /usr/bin/dockerd
32K 8 32K /var/lib/docker/buildkit/cache.db
16K 4 16K /var/lib/docker/buildkit/metadata_v2.db
16K 4 16K /var/lib/docker/buildkit/snapshots.db
16K 4 16K /var/lib/docker/buildkit/containerdmeta.db
284K 71 282.4K /usr/lib/x86_64-linux-gnu/libnss_systemd.so.2
244K 61 594.7K /usr/lib/x86_64-linux-gnu/libpcre2-8.so.0.10.2
156K 39 154.2K /usr/lib/x86_64-linux-gnu/libgpg-error.so.0.29.0
24K 6 20.6K /usr/lib/x86_64-linux-gnu/libpthread.so.0
908K 227 906.5K /usr/lib/x86_64-linux-gnu/libm.so.6
...
кроме того,Для всех типов кэша,Конец жизнисередина Шудудаочень важныйизиндекс。нас Можетиспользовать bcc Встроенные инструменты cachestat Отслеживать всю системуиз Page Cache Частота попаданий:
$ sudo cachestat-bpfcc
HITS MISSES DIRTIES HITRATIO BUFFERS_MB CACHED_MB
2059 0 32 100.00% 74 1492
522 0 0 100.00% 74 1492
32 0 7 100.00% 74 1492
135 0 69 100.00% 74 1492
97 1 3 98.98% 74 1492
512 0 82 100.00% 74 1492
303 0 86 100.00% 74 1492
2474 7 1028 99.72% 74 1494
815 0 964 100.00% 74 1497
2786 0 1 100.00% 74 1497
1051 0 0 100.00% 74 1497
^C 502 0 0 100.00% 74 1497
Detaching...
использовать cachetop Можно отслеживать по процессам Page Cache Частота попаданий:
$ sudo cachetop-bpfcc
14:20:41 Buffers MB: 86 / Cached MB: 2834 / Sort: HITS / Order: descending
PID UID CMD HITS MISSES DIRTIES READ_HIT% WRITE_HIT%
14237 mazhen java 12823 4594 3653 52.6% 13.2%
14370 mazhen ldd 869 0 0 100.0% 0.0%
14371 mazhen grep 596 0 0 100.0% 0.0%
14376 mazhen ldd 536 0 0 100.0% 0.0%
14369 mazhen env 468 0 0 100.0% 0.0%
14377 mazhen ldd 467 0 0 100.0% 0.0%
14551 mazhen grpc-default-ex 466 0 0 100.0% 0.0%
14375 mazhen ldd 435 0 0 100.0% 0.0%
14479 mazhen ldconfig 421 0 0 100.0% 0.0%
14475 mazhen BookieJournal-3 417 58 132 60.0% 6.1%
...
системный вызов mmapдасамое важноеиз Памятьуправлятьинтерфейс。использовать mmap Могут быть созданы сопоставления файлов, в результате чего Page Cache。использовать mmap Его также можно использовать для применения кучи памяти. glibc Предоставить из malloc,внутреннийиспользоватьиз Сразуда mmap системный вызов。 потому что mmap системный распределение вызовов Памятьиз относительно неэффективно, malloc Вечеринкаиспользовать mmap Примените к операционной системе относительно большое из Память, а затем используйте различные методы оптимизации, чтобы максимизировать эффективность распределения Память.
mmap В зависимости от параметров,Может быть отображено из файлов,И не стоит объединять два разных измерения:
звоню mmap(MAP_ANON | MAP_PRIVATE)
час,Просто нужно выделить кусочек Память в виртуальном пространстве процесса Память.,Тогда создайте этот кусочек Память от Переписки. vm_area_struct структура, этот вызов заканчивается при доступе к этой виртуальной Память, потому что. что Эта виртуальная Память не сопоставлена с физической Память, и произойдет ошибка страницы. vm_area_structассоциациядокумент Недвижимость пуста,Так да анонимное картографирование.Ядро будет присвоено физическое Память,Затем в таблице страниц устанавливается связь между виртуальным адресом и физическим адресом.
процесспроходить mmap(MAP_FILE | MAP_PRIVATE)
Такой способ применения из Память, например процесс будет общей библиотекой (Shared библиотеки) и исполняемый файл из сегмента кода (текстовый Сегмент) таким образом отображается в собственное адресное пространство.
Если файл доступен только для чтения,Тогда этодокументпо физике Страницаизуровеньначальство Что实даобщийиз。То естьдапроцесс A и процесс B Существует страница виртуальной Памяти, сопоставленная с той же физической страницей. Но если вы хотите записать файл, поскольку эта область памяти имеет атрибут частный, Ядро выделит время записи и создаст отдельную копию для записи файла в процессе. Таким образом, этот Когда процесс записывает файл, это не влияет на чтение других процессов.
частное сопоставление файловизтолько чтение Страницадамногопроцессмеждуобщийиз,Записываемые страницы дакаждыйпроцесс имеют независимую копию.,Время для создания копии еще есть, когда писать копировать.
процесспроходить mmap(MAP_FILE | MAP_SHARED)
Этот способ применения из Память. В частном сопоставление файловиз Базаначальство,Общее сопоставление Файлы очень просты: для записываемых страниц просто не копируйте при записи. Таким образом, независимо от того, когда происходит чтение или запись, можно записать несколько страниц. Процесс При доступе к одному и тому же файлу с одной и той же страницы осуществляется доступ к одной и той же физической странице.
процесспроходить mmap(MAP_ANON | MAP_SHARED)
Этот способ применения из Память. С помощью системы виртуальных файлов можно выполнить несколько процессов vm_area_struct встречаассоциация到такой жеодинвиртуальныйдокумент,В конечном итоге отображается на той же странице изфизики Память.,Реализовать функцию разделения Памятьиз между процессами.
mmap
из четырех типов отображения, представленных выше, из /proc/meminfo
Связь между показателями Память:
Частные сопоставления принадлежат AnonPages,общий Отобразить вседа Page cache。обсуждалось ранее,общийизанонимныйкартографирование Shmem,Хотя и не связан с реальным файлом издиска.,Но да связано с виртуальным файлом Память,Месток也род В Page Cache。
частное сопоставление файлы, если файл да доступен только для чтения, то этот кусок Память принадлежит Page Cache。еслииметьпроцесс Писатьдокумент,Потому что в этом разделе Память области из атрибута да частного из,Так что Ядро сделает это один раз, когда напишу копировать,Создайте отдельную копию файла записи исходного процесса.,эта копия Сразурод В AnonPages .
Page Cache Механизм включает в себя пространство процесса, файловую систему, управление памятью, несколько функций Ядро, страницу Cache Это как нить, соединяющая эти части вместе. Поэтому Глубокое понимание Page Cache Механизм окажет большую помощь в изучении Ядро.