Глубокое понимание Page Cache
Глубокое понимание Page Cache

Долго работающие серверы Linux, обычно free Памяти становится все меньше и меньше, что заставляет людей чувствовать Linux Он настолько хорошо «поедает» память, что некоторые даже создали специально для него веб-сайт. LinuxAteMyRam.comобъясни это явление。на самом деле Linux Ядро будет кэшировать файлы, к которым осуществляется доступ, насколько это возможно, чтобы компенсировать огромный разрыв в задержке между диском и памятью. Память, используемая для кэширования содержимого файла, равна Page Cache

Google матоками Jeffrey DeanОбобщенный одинLatency numbers every programmer should know,который упоминает издискчитать 1MB Данные занимают в 80 раз больше времени, чем память, даже если они заменены SSD Это еще и задержка памяти 4 раз.

Чтобы убедиться в этом, я провел эксперимент на этой машине. Page Cache роль. Сначала сгенерируйте 1G Размер файла:

Язык кода:javascript
копировать
# dd if=/dev/zero of=/root/dd.out bs=4096 count=262144

Очистить кэш страниц:

Язык кода:javascript
копировать
# sync && echo 3 > /proc/sys/vm/drop_caches

Подсчитайте время, необходимое для первого чтения файла:

Язык кода:javascript
копировать
# time cat /root/dd.out &> /dev/null

real	0m2.097s
user	0m0.010s
sys	    0m0.638s

Прочтите тот же файл еще раз, поскольку система уже поместила содержимое прочитанного файла в Page Cache , на этот раз время значительно сокращено:

Язык кода:javascript
копировать
# time cat /root/dd.out &> /dev/null

real	0m0.186s
user	0m0.004s
sys	    0m0.182s

Page Cache Он не только может ускорить доступ к содержимому файла, но также может создавать общие библиотеки. 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 Несколько основных объектов:

  • file Хранит информацию об открытых файлах и использует интерфейс доступа к файлам;
  • dentry использовать dentry Организовать файлы в древовидную структуру каталогов;
  • inode Уникально идентифицирует файловую систему файла. Один и тот же файл будет только один в Ядро. inode структура.

Для каждого процесса открытый файл имеет файловый дескриптор — структуру данных процесса в ядре. task_struct Существует тип files_struct из files Поле,сохранитьпроцесс Открытьиз Все файлы。files_struct структураизfd_array Поля file множество, Массив из индекса и дескриптора файла, контент ориентирован на file структура,указывает на то, чтопроцесс Открытьиздокумент。file Что касается открытия файлов в исходном процессе: если несколько процессов открывают один и тот же файл, то каждый процесс будет иметь свой собственный исходный файл. file , но эти file указать на то же самое inode

Как показано на рисунке выше, процесс взаимодействует с дескриптором файла через VFS серединаиз file установить контакт, каждый file Объект связан с другим dentry соответствующее, согласно dentry можно найти inodeinode представляет сам файл. Процесс на картинке выше A и процесс B Тот же файл открывается и процесс A и процесс B Все они поддерживают свои собственные file , но они указывают на то же самое inode

inode проходить address_space Управлять содержимым файлов, загруженных в Память, то есть да Page Cacheaddress_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 Существует два различных способа производства:

  • Buffered I/O
  • Memory-Mapped file

использовать Эти два способа доступа к файлам на диске,Ядро будет основано на указанном файле и соответствующем смещении страницы.,суждениедокументсодержаниеда Это уже в 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 Будет ли ориентированный отображен из файловой структуры filefile Представляет процесс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_mmapaddress_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 использовать псевдофайловую систему, делая информацию о системе Ядро доступной в пространстве пользователя. использовать freevmstatждатькоманда для просмотраиз Памятьинформация,данныена самом делевсе из /proc/meminfo

Давайте посмотрим на пример:

Язык кода:javascript
копировать
$ 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 Нова :

Язык кода:javascript
копировать
Buffers + Cached = 5072756 kB

Как обсуждалось ранее, если vm_area_struct Связано с файлом, тогда эта область Память да File-backed Память. Нет связанных файлов из vm_area_struct Память область анонимно Память. Можем ли мы считать, что файлы идиска связаны между собой? File-backed Память в общем, надо ждать Page Cache Шерстяная ткань?

Язык кода:javascript
копировать
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)) Заказ. Например:

Язык кода:javascript
копировать
$ 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:

Язык кода:javascript
копировать
$ 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 Частота попаданий:

Язык кода:javascript
копировать
$ 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 Частота попаданий:

Язык кода:javascript
копировать
$ 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дасамое важноеиз Памятьуправлятьинтерфейс。использовать 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 Механизм окажет большую помощь в изучении Ядро.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose