madv.so.1 共享对象允许为已启动的进程及其后代有选择性地配置虚拟内存建议。要使用该共享对象,环境中必须存在以下字符串:
LD_PRELOAD=$LD_PRELOAD:madv.so.1
madv.so.1 共享对象应用由 MADV 环境变量的值指定的内存建议。MADV 环境变量指定用于进程地址空间中的所有堆、共享内存和 mmap 区域的虚拟内存建议。此建议应用于所有已创建的进程。MADV 环境变量的以下值影响 lgroup 之间的资源分配:
此值将内核的预期访问模式重置为缺省设置。
此值通知内核,移近地址范围的下一个 LWP 就是将要访问此范围次数最多的 LWP。内核将相应地为此范围和 LWP 分配内存和其他资源。
此值建议内核,许多进程或 LWP 将在系统内随机访问内存。内核将相应地分配内存和其他资源。
MADVCFGFILE 环境变量的值是一个文本文件的名称,此文件中包含一个或多个形式为 exec-name:advice-opts 的内存建议配置项。
exec-name 的值是应用程序或可执行文件的名称。exec-name 的值可以是完整路径名、基本名称或模式字符串。
advice-opts 值的形式为 region=advice。advice 的值与 MADV 环境变量的值相同。可将 region 替换为以下任一合法值:
建议应用于进程地址空间中的所有堆、共享内存和 mmap(2) 区域。
堆被定义为 brk(2) 区域。建议应用于现有堆以及将来分配的任何其他堆内存。
建议应用于共享内存段。有关共享内存操作的更多信息,请参见 shmat(2)。
建议应用于使用 SHM_SHARE_MMU 标志的共享内存段。ism 选项优先于 shm。
建议应用于使用 SHM_PAGEABLE 标志的共享内存段。dsm 选项优先于 shm。
建议应用于由 mmap() 系统调用使用 MAP_SHARED 标志建立的映射。
建议应用于由 mmap() 系统调用使用 MAP_PRIVATE 标志建立的映射。
建议应用于由 mmap() 系统调用使用 MAP_ANON 标志建立的映射。当多个选项都适用时,mapanon 选项优先。
MADVERRFILE 环境变量的值是在其中记录错误消息的路径的名称。如果缺少 MADVERRFILE 位置,则 madv.so.1 共享对象将使用 syslog(3C) 记录错误,而使用 LOG_ERR 作为严重级别,使用 LOG_USER 作为功能描述符。
内存建议将被继承。子进程与其父级具有相同的建议。调用 exec(2) 之后,会将此建议重置为系统缺省建议,除非使用 madv.so.1 共享对象配置了不同级别的建议。建议仅应用于用户程序显式创建的 mmap() 区域。由运行时链接程序或执行直接系统调用的系统库建立的区域不受影响。
以下示例说明了 madv.so.1 共享对象的特定方面。
此配置将建议应用于 exec 名称以 foo 开头的应用程序的所有 ISM 段。
$ LD_PRELOAD=$LD_PRELOAD:madv.so.1 $ MADVCFGFILE=madvcfg $ export LD_PRELOAD MADVCFGFILE $ cat $MADVCFGFILE foo*:ism=access_lwp
此配置为除 ls 之外的所有应用程序设置建议。
$ LD_PRELOAD=$LD_PRELOAD:madv.so.1 $ MADV=access_many $ MADVCFGFILE=madvcfg $ export LD_PRELOAD MADV MADVCFGFILE $ cat $MADVCFGFILE ls:
由于 MADVCFGFILE 中指定的配置优先于 MADV 中设置的值,因此指定 * 作为最后一个配置项的 exec-name 相当于设置 MADV。本示例与上一个示例等效。
$ LD_PRELOAD=$LD_PRELOAD:madv.so.1 $ MADVCFGFILE=madvcfg $ export LD_PRELOAD MADVCFGFILE $ cat $MADVCFGFILE ls: *:madv=access_many
此配置为 mmap() 区域应用一类建议,为 exec() 名称以 foo 开头的应用程序的堆和共享内存区域应用不同的建议。
$ LD_PRELOAD=$LD_PRELOAD:madv.so.1 $ MADVCFGFILE=madvcfg $ export LD_PRELOAD MADVCFGFILE $ cat $MADVCFGFILE foo*:madv=access_many,heap=sequential,shm=access_lwp