.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2001 David Gómez .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\" Based on comments from mm/filemap.c. Last modified on 10-06-2001 .\" Modified, 25 Feb 2002, Michael Kerrisk, .\" Added notes on MADV_DONTNEED .\" 2010-06-19, mtk, Added documentation of MADV_MERGEABLE and .\" MADV_UNMERGEABLE .\" 2010-06-15, Andi Kleen, Add documentation of MADV_HWPOISON. .\" 2010-06-19, Andi Kleen, Add documentation of MADV_SOFT_OFFLINE. .\" 2011-09-18, Doug Goldstein .\" Document MADV_HUGEPAGE and MADV_NOHUGEPAGE .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH MADVISE 2 "11 апреля 2020 г." Linux "Руководство программиста Linux" .SH ИМЯ madvise \- отсылает предложения по использованию памяти .SH СИНТАКСИС \fB#include \fP .PP \fBint madvise(void *\fP\fIaddr\fP\fB, size_t \fP\fIlength\fP\fB, int \fP\fIadvice\fP\fB);\fP .PP .RS -4 Требования макроса тестирования свойств для glibc (см. \fBfeature_test_macros\fP(7)): .RE .PP \fBmadvise\fP(): .PD 0 .RS 4 .TP 4 Начиная с glibc 2.19: _DEFAULT_SOURCE .TP Начиная с glibc 2.19: _BSD_SOURCE .RE .PD .SH ОПИСАНИЕ Системный вызов \fBmadvise\fP() используется, чтобы дать совет или указать направление ядру о диапазоне адресов, начинающемся с адреса \fIaddr\fP и имеющем размер \fIlength\fP байт. В большинстве случаев, целью такого совета является повышение производительности системы или приложения. .PP .\" .\" ====================================================================== .\" Первоначально, системный вызов поддерживал набор «стандартных» значений \fIadvice\fP, которые также доступны и в некоторых других реализациях (однако отметим, что \fBmadvise\fP() отсутствует в POSIX). В последствии было добавлено несколько значений \fIadvice\fP, имеющихся только в Linux. .SS "Стандартные значения предложений" Значения \fIadvice\fP, перечисленные далее, позволяют приложению указать ядру как оно будет использовать некоторые отображённые или общие области памяти, чтобы ядро могло выбрать подходящие методы упреждающего чтения и кэширования. Эти значения \fIadvice\fP не влияют на семантику приложения (за исключением \fBMADV_DONTNEED\fP), но могут повлиять на его производительность. Все перечисленные здесь значения \fIadvice\fP имеют аналоги в определённой POSIX функции \fBposix_madvise\fP(3) и имеют тот же смысл, за исключением \fBMADV_DONTNEED\fP. .PP В \fIadvice\fP помещается нужное предложения, одно из: .TP \fBMADV_NORMAL\fP Нет никаких специальных указаний. Используется по умолчанию. .TP \fBMADV_RANDOM\fP Ожидать обращение к страницам в случайном порядке (здесь упреждающее чтение может быть менее эффективным). .TP \fBMADV_SEQUENTIAL\fP Ожидать последовательного обращения к страницам (здесь к страницам в заданном диапазоне можно применить агрессивное упреждающее чтение и быстро высвободить их сразу после доступа). .TP \fBMADV_WILLNEED\fP Ожидать доступа в ближайшем будущем (здесь можно применить упреждающее чтение нескольких страниц). .TP \fBMADV_DONTNEED\fP В ближайшем будущем не ожидается доступ (в настоящее время приложение закончило работу с данным диапазоном, поэтому ядро может освободить ресурсы, связанные с приложением). .IP После успешного выполнения операции \fBMADV_DONTNEED\fP семантика доступа к памяти в заданной области изменяется: последующий доступ к страницам в области будет успешным, но будет приводить к или повторному заполнению памяти актуальным содержимым из нижележащего отображённого файла (для общих отображений файла, общих анонимных отображений и методов на основе shmem, таких как сегментов общей памяти System V) или к заполнению нулями страниц по требованию у частных анонимных отображений. .IP Заметим, что при применении к общим отображениям операция \fBMADV_DONTNEED\fP может не приводить к немедленному освобождению страниц области. Ядро может задержать освобождение до подходящего момента. Однако размер постоянно занимаемой памяти (RSS) вызывающего процесса будет сокращён сразу же. .IP .\" http://lwn.net/Articles/162860/ .\" .\" ====================================================================== .\" Операция \fBMADV_DONTNEED\fP не может применяться к заблокированным страницам, страницам Huge TLB или страницам \fBVM_PFNMAP\fP (страницы, помеченные внутренним флагом ядра \fBVM_PFNMAP\fP представляют собой специальные области памяти, которые не управляются из подсистемы виртуальной памяти; обычно, эти страницы создаются драйверами устройств, которые отображают страницы в пользовательское пространство). .SS "Значения предложений, имеющиеся только в Linux" Следующие значения \fIadvice\fP имеются только в Linux и не имеют аналога в определённой POSIX функции \fBposix_madvise\fP(3), а также могут не иметь аналога и в других реализациях интерфейса \fBmadvise\fP(). Заметим, что некоторые из этих операций изменяют семантику доступа к памяти. .TP \fBMADV_REMOVE\fP (начиная с Linux 2.6.16) .\" commit f6b3ec238d12c8cc6cc71490c6e3127988460349 .\" Databases want to use this feature to drop a section of their .\" bufferpool (shared memory segments) - without writing back to .\" disk/swap space. This feature is also useful for supporting .\" hot-plug memory on UML. Освободить указанный диапазон страниц и связанные с ним хранилища. Эквивалентен пробивке отверстия в соответствующем диапазоне байт хранилища (смотрите \fBfallocate\fP(2)). Последующий доступ к указанному адресному диапазону будет возвращать байты с нулями. .IP Указываемый адресный диапазон должен быть общим и доступным на запись отображением. Этот флаг не может применять к заблокированным страницам, страницам Huge TLB или страницам \fBVM_PFNMAP\fP. .IP .\" commit 3f31d07571eeea18a7d34db9af21d2285b807a17 В первоначальной реализации \fBMADV_REMOVE\fP поддерживался только в \fBtmpfs\fP(5), но начиная с Linux 3.5 все файловые системы, поддерживающие \fBfallocate\fP(2) с режимом \fBFALLOC_FL_PUNCH_HOLE\fP, также поддерживают \fBMADV_REMOVE\fP. Hugetlbfs возвращает ошибку \fBEINVAL\fP, а другие файловые системы возвращают ошибку \fBEOPNOTSUPP\fP. .TP \fBMADV_DONTFORK\fP (начиная с Linux 2.6.16) .\" commit f822566165dd46ff5de9bf895cfa6c51f53bb0c4 .\" See http://lwn.net/Articles/171941/ .\" [PATCH] madvise MADV_DONTFORK/MADV_DOFORK .\" Currently, copy-on-write may change the physical address of .\" a page even if the user requested that the page is pinned in .\" memory (either by mlock or by get_user_pages). This happens .\" if the process forks meanwhile, and the parent writes to that .\" page. As a result, the page is orphaned: in case of .\" get_user_pages, the application will never see any data hardware .\" DMA's into this page after the COW. In case of mlock'd memory, .\" the parent is not getting the realtime/security benefits of mlock. .\" .\" In particular, this affects the Infiniband modules which do DMA from .\" and into user pages all the time. .\" .\" This patch adds madvise options to control whether memory range is .\" inherited across fork. Useful e.g. for when hardware is doing DMA .\" from/into these pages. Could also be useful to an application .\" wanting to speed up its forks by cutting large areas out of .\" consideration. .\" .\" SEE ALSO: http://lwn.net/Articles/171941/ .\" "Tweaks to madvise() and posix_fadvise()", 14 Feb 2006 Сделать недоступными страницы в указанном диапазоне для потомка после \fBfork\fP(2). Это полезно для предотвращения изменения физического расположения страницы копирования\-при\-записи, если родитель будет изменять её после \fBfork\fP(2) (перемещение таких страниц вызывает проблемы для оборудования, обращающегося к страницам через DMA). .TP \fBMADV_DOFORK\fP (начиная с Linux 2.6.16) Отменить действие \fBMADV_DONTFORK\fP, восстановить поведение по умолчанию, в силу чего происходит наследование отображения после \fBfork\fP(2). .TP \fBMADV_HWPOISON\fP (начиная с Linux 2.6.32) .\" commit 9893e49d64a4874ea67849ee2cfbf3f3d6817573 Испортить страницы в диапазоне, заданном \fIaddr\fP и \fIlength\fP, и обрабатывать последующие ссылки на эти страницы как при аппаратном повреждении памяти. Данная операция доступна только для привилегированных (\fBCAP_SYS_ADMIN\fP) процессов. Она может привести к тому, что вызывающий процесс получит \fBSIGBUS\fP и отображение страницы удалится. .IP Это свойство предназначено для тестирования кода обработки ошибок памяти; оно доступно только, если ядро было собрано с параметром \fBCONFIG_MEMORY_FAILURE\fP. .TP \fBMADV_MERGEABLE\fP (начиная с Linux 2.6.32) .\" commit f8af4da3b4c14e7267c4ffb952079af3912c51c5 Включает слияние одинаковых страниц ядра (Kernel Samepage Merging, KSM) для страниц в диапазоне, указанном \fIaddr\fP и \fIlength\fP. Ядро периодически сканирует области пользовательской памяти, которые были помечены для слияния, разыскивая станицы с одинаковым содержимым. Такие страницы заменяются единственной страницей, защищённой от записи (которая автоматически копируется, если позднее процесс захочет изменить содержимое страницы). При KSM слияние выполняется только для частных анонимных страниц (смотрите \fBmmap\fP(2)). .IP Возможность KSM предназначена для приложений, которые генерируют много экземпляров одинаковых данных (например, для систем виртуализации, таких как KVM). Эта возможность может нагрузить процессор; используйте осторожно. Дополнительную информацию можно найти в файле исходного кода ядра \fIDocumentation/admin\-guide/mm/ksm.rst\fP. .IP Операции \fBMADV_MERGEABLE\fP и \fBMADV_UNMERGEABLE\fP доступны только, если ядро собрано с параметром \fBCONFIG_KSM\fP. .TP \fBMADV_UNMERGEABLE\fP (начиная с Linux 2.6.32) Отменить действие ранее применённой операции \fBMADV_MERGEABLE\fP для указанного диапазона; KSM разделяет ранее объединённые страницы в диапазоне, заданном \fIaddr\fP и \fIlength\fP. .TP \fBMADV_SOFT_OFFLINE\fP (начиная с Linux 2.6.33) .\" commit afcf938ee0aac4ef95b1a23bac704c6fbeb26de6 Программно отключить страницы в диапазоне, указанном \fIaddr\fP и \fIlength\fP. Память каждой страницы в указанном диапазоне сохраняется (т. е., при следующем доступе будет выдано то же содержимое, но в новых физических границах страницы) и первоначальная страница отключается (т. е., больше не используется и не участвует при обычном управлении памятью). Эффект операции \fBMADV_SOFT_OFFLINE\fP обычно незаметен (т. е., не изменяет семантику) для вызывающего процесса. .IP Это свойство предназначено для тестирования кода обработки ошибок памяти; оно доступно только, если ядро было собрано с параметром \fBCONFIG_MEMORY_FAILURE\fP. .TP \fBMADV_HUGEPAGE\fP (начиная с Linux 2.6.38) .\" commit 0af4e98b6b095c74588af04872f83d333c958c32 .\" http://lwn.net/Articles/358904/ .\" https://lwn.net/Articles/423584/ Включает прозрачность огромных страниц (Transparent Huge Pages, THP) для страниц в диапазоне, указанном \fIaddr\fP и \fIlength\fP. В настоящий момент, THP работает только для закрытых (private) анонимных страниц (смотрите \fBmmap\fP(2)). Ядро будет периодически сканировать области, помеченные как кандидаты в огромные страницы, для замены их огромными страницами. Ядро также будет непосредственно выделять огромные страницы, если область выравнена на аппаратный (naturally) размер огромной страницы при создании (смотрите \fBposix_memalign\fP(2)). .IP В основном, эта возможность предназначена для приложений, которые используют большие отображения данных и доступ к большим областям этой памяти за один приём (например, системы виртуализации, такие как QEMU). С её помощью можно очень легко занять память (например, на 2\ МБ отображение, из которого нужен только 1 байт, будет потрачено 2\ МБ реальной памяти вместо одной 4\ КБ страницы). Дополнительную информацию смотрите в файле \fIDocumentation/admin\-guide/mm/transhuge.rst\fP из исходного кода ядра. .IP Most common kernels configurations provide \fBMADV_HUGEPAGE\fP\-style behavior by default, and thus \fBMADV_HUGEPAGE\fP is normally not necessary. It is mostly intended for embedded systems, where \fBMADV_HUGEPAGE\fP\-style behavior may not be enabled by default in the kernel. On such systems, this flag can be used in order to selectively enable THP. Whenever \fBMADV_HUGEPAGE\fP is used, it should always be in regions of memory with an access pattern that the developer knows in advance won't risk to increase the memory footprint of the application when transparent hugepages are enabled. .IP Операции \fBMADV_HUGEPAGE\fP и \fBMADV_NOHUGEPAGE\fP доступны только, если ядро собрано с параметром \fBCONFIG_TRANSPARENT_HUGEPAGE\fP. .TP \fBMADV_NOHUGEPAGE\fP (начиная с Linux 2.6.38) Ensures that memory in the address range specified by \fIaddr\fP and \fIlength\fP will not be backed by transparent hugepages. .TP \fBMADV_DONTDUMP\fP (начиная с Linux 3.4) .\" commit 909af768e88867016f427264ae39d27a57b6a8ed .\" commit accb61fe7bb0f5c2a4102239e4981650f9048519 Исключить из дампа памяти страницы диапазона, задаваемого значениями \fIaddr\fP и \fIlength\fP. Это полезно в приложениях, которые занимают большие области в памяти, про которые известно, что они ничем не помогут будучи в дампе памяти. Действие \fBMADV_DONTDUMP\fP имеет преимущество над битовой маской, которая устанавливается в файле \fI/proc/[pid]/coredump_filter\fP (смотрите \fBcore\fP(5)). .TP \fBMADV_DODUMP\fP (начиная с Linux 3.4) Отменяет действие, установленное ранее \fBMADV_DONTDUMP\fP. .TP \fBMADV_FREE\fP (начиная с Linux 4.5) Приложению больше не требуются страницы в диапазоне, задаваемом \fIaddr\fP и \fIlen\fP, поэтому ядро может освободить эти страницы, но освобождение может быть отложено до тех пор, пока не понадобится память. Для каждой страницы, помеченной как свободная, но ещё не освобождённая, операция освобождения будет отменена, если вызывающий выполнит запись в эту страницу. После успешного выполнения операции \fBMADV_FREE\fP все повисшие данные (т. е., изменённые (dirty) и не записанные страницы) будут потеряны в момент освобождения страниц ядром. Однако последующая запись в страницы в этом диапазоне будет успешной и поэтому ядро не сможет освободить эти изменённые страницы и вызывающий всегда может видеть только что записанные данные. Если последующей записи не было, то ядро может освободить страницы в любой момент. После освобождения страниц диапазона при последующем доступе вызывающий может видеть страницы заполненные нулями по требованию. .IP .\" commit 93e06c7a645343d222c9a838834a51042eebbbf7 Операция \fBMADV_FREE\fP может применяться только при частным анонимным страницам (смотрите \fBmmap\fP(2)). В Linux до версии 4.12 страницы задаваемого диапазона в системе без подкачки освобождаются сразу, независимо от необходимости в памяти. .TP \fBMADV_WIPEONFORK\fP (начиная с Linux 4.14) .\" commit d2cd9ede6e193dd7d88b6d27399e96229a551b19 Выдать дочернему процессу заполненную нулями память в этом диапазоне после \fBfork\fP(2). Это позволяет при ветвлении (forking) серверов стереть важные данные процесса (например, начальные значения PRNG, данные шифрования и т. п.) у дочерних процессов. .IP Операция \fBMADV_WIPEONFORK\fP применима только к частным анонимным страницам (смотрите \fBmmap\fP(2)). .IP В потомке, созданном \fBfork\fP(2), значение \fBMADV_WIPEONFORK\fP остаётся у указанного адресного диапазона. Это значение стирается при \fBexecve\fP(2). .TP \fBMADV_KEEPONFORK\fP (начиная с Linux 4.14) .\" commit d2cd9ede6e193dd7d88b6d27399e96229a551b19 Отменяет действие, установленное ранее \fBMADV_WIPEONFORK\fP. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" При нормальном завершении работы \fBmadvise\fP() возвращает ноль. При ошибке возвращается \-1, а переменной \fIerrno\fP присваивается соответствующее значение. .SH ОШИБКИ .TP \fBEACCES\fP В \fIadvice\fP указан \fBMADV_REMOVE\fP, но описанный диапазон адресов не является общей памятью с разрешением на записи .TP \fBEAGAIN\fP Ресурс ядра временно недоступен. .TP \fBEBADF\fP Отображение существует, то область отображения не является файловой. .TP \fBEINVAL\fP .\" .I length .\" is zero, Значение параметра \fIaddr\fP не выровнено по границе страницы или параметр \fIlength\fP содержит отрицательное число. .TP \fBEINVAL\fP Значение \fIadvice\fP недопустимо. .TP \fBEINVAL\fP Значение \fIadvice\fP равно \fBMADV_DONTNEED\fP или \fBMADV_REMOVE\fP, а указанный адресный диапазон включает заблокированные, Huge TLB или \fBVM_PFNMAP\fP страницы. .TP \fBEINVAL\fP Значение \fIadvice\fP равно \fBMADV_MERGEABLE\fP или \fBMADV_UNMERGEABLE\fP, но ядро было собрано без параметра \fBCONFIG_KSM\fP. .TP \fBEINVAL\fP Значение \fIadvice\fP равно \fBMADV_FREE\fP или \fBMADV_WIPEONFORK\fP, но в указанном адресном диапазоне содержится файл, Huge TLB, диапазоны \fBMAP_SHARED\fP или \fBVM_PFNMAP\fP. .TP \fBEIO\fP (для \fBMADV_WILLNEED\fP) Выделение страницы в данной области превысило бы максимальный размер постоянно находящихся в памяти страниц для процесса (rss). .TP \fBENOMEM\fP (для \fBMADV_WILLNEED\fP) Недостаточно памяти: не удалось выделить страницу .TP \fBENOMEM\fP Адреса в указанном диапазоне в настоящее время не отображены, или лежит вне адресного пространства процесса. .TP \fBEPERM\fP В переменной \fIadvice\fP содержится \fBMADV_HWPOISON\fP, но вызывающий не имеет мандата \fBCAP_SYS_ADMIN\fP. .SH ВЕРСИИ .\" commit d3ac21cacc24790eb45d735769f35753f5b56ceb Начиная с Linux 3.18 поддержка данного системного вызова необязательна, она зависит от того, собрано ли ядро с параметром \fBCONFIG_ADVISE_SYSCALLS\fP. .SH "СООТВЕТСТВИЕ СТАНДАРТАМ" Вызов \fBmadvise\fP() не включён ни в один стандарт. Версии этого системного вызова, реализующие широкий набор значений \fIadvice\fP, существуют во многих других системах. В них, обычно, реализуются, как минимум, флаги перечисленные в \fIСтандартные значения предложений\fP, хотя и с некоторыми различиями в семантике. .PP В POSIX\-2001 описана функция \fBposix_madvise\fP(3) с константами \fBPOSIX_MADV_NORMAL\fP, \fBPOSIX_MADV_RANDOM\fP, \fBPOSIX_MADV_SEQUENTIAL\fP, \fBPOSIX_MADV_WILLNEED\fP и \fBPOSIX_MADV_DONTNEED\fP, и т. п., реализующая поведение близкое к флагам с именами, перечисленным выше. .SH ЗАМЕЧАНИЯ .SS "Замечания, касающиеся Linux" .\" .SH HISTORY .\" The .\" .BR madvise () .\" function first appeared in 4.4BSD. Для реализации Linux требуется, чтобы адрес \fIaddr\fP был выровнен на границу страницы, а значение \fIlength\fP может быть нулевым. Если какие\-то части указанного адресного диапазона не отображены, то версия Linux \fBmadvise\fP() игнорирует их и вызов применяется к оставшейся области (но возвращается значение \fBENOMEM\fP, как и должно). .SH "СМ. ТАКЖЕ" \fBgetrlimit\fP(2), \fBmincore\fP(2), \fBmmap\fP(2), \fBmprotect\fP(2), \fBmsync\fP(2), \fBmunmap\fP(2), \fBprctl\fP(2), \fBposix_madvise\fP(3), \fBcore\fP(5) .SH ЗАМЕЧАНИЯ Эта страница является частью проекта Linux \fIman\-pages\fP версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу \%https://www.kernel.org/doc/man\-pages/. .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан aereiae , Alexey , Azamat Hackimov , Dmitriy S. Seregin , Dmitry Bolkhovskikh , ITriskTI , Max Is , Yuri Kozlov , Иван Павлов и Малянов Евгений Викторович . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .