vmgetinfo 子例程
用途
检索虚拟内存管理器 (VMM) 信息。
库
标准 C 库 (libc.a)
语法
#include <sys/vminfo.h>
int vmgetinfo(void *out, int command, int arg)描述
Vmgetinfo 子例程返回某些 VMM 参数的当前值。
参数
- arg
- 其他参数,这取决于命令参数。
- 命令
- 指定返回的信息。 命令 参数的有效值如下所示:
- VMINFO
- 返回 vminfo 结构的内容 (在 sys/vminfo.h 文件中描述)。 出 参数指向 文福 结构,而 阿尔格 参数则是 文福 结构的大小。 阿尔格 参数和 大小 (struct vminfo) 的较小值将被复制。
- VMINFO64
- 返回 vminfo64 结构的内容 (在 sys/vminfo.h 文件中描述)。 out 参数指向 vminfo64 结构, arg 参数是 vminfo64 结构的大小。 将复制 arg 参数和 sizeof (struct vminfo64) 的较小值。
- VMINFO_ABRICHED
- 返回 vminfo 结构的内容 (在 sys/vminfo.h 文件中描述)。 VMINFO_ABRICHED 命令仅更新非耗用时间的统计信息,因此您必须在性能关键型应用程序中使用 VMINFO_ABRICHED 命令而不是 VMINFO 命令。 出 参数指向 文福 结构,而 阿尔格 参数则是 文福 结构的大小。 将复制 阿尔格 和 大小 (struct vminfo) 参数之间的较小值。
- VM_PAGE_INFO
- 返回支持 vm_page_info 结构的 addr 字段中指定的地址的页面大小 (以字节计) (如 sys/vminfo.h中所述)。 出 参数指向一个 vm_page_info 结构,其中 地址 字段设置为要查询其页面大小的期望地址。 阿尔格 参数表示 vm_page_info 结构的大小。
- vm_new_heap_psize
- 为调用进程的专用数据堆的将来 斯决裂 分配设置新的首选页面大小。 此页面大小设置是咨询信息。 出 参数是一个指向 psize_t 结构的指针,该结构包含用于支持调用进程将来任何 斯决裂 分配的首选页面大小 (以字节为单位)。 目前,仅支持 16M (0x1000000) 和 4K (0x1000)。 阿尔格 参数是 大小的参数 (psize_t)。
- vm_srad_meminfo
- 报告有关调度程序资源分配域 (SRAD) 的内存统计信息。 阿尔格 参数必须包含要查询的 SRAD 标识。 出 参数必须是指向 vm_srad_meminfo 结构的指针,该结构的第一个字段 vmsrad_in_size必须包含该结构的大小。此命令的输出将存储在 vm_srad_meminfo 结构的下列字段中:
- vmsrad_out_size
- 在缓冲区中返回的字节数。
- vmsrad_total_pg
- SRAD 中包含的可分页内存的总字节数。 此值排除永久保留用于低级别内存管理的内存。注: 此字段先前被称为 vmsrad_total。
- vmsrad_free_pg
- SRAD 中显示的可用可分页内存量 (以字节为单位)。注: 此字段先前被称为 vmsrad_free。
- vmsrad_total_nonpg
- 包含在 SRAD 中的不可分页内存的总字节数。
- vmsrad_free_nonpg
- SRAD 中以字节为单位显示的不可分页的可用内存量。
- vmsrad_file
- 文件所占用的字节数。
- vmsrad_aff_priv_pct
- 这是根据可调参数 enhanced_affinity_private, SRAD 的计算使用情况和 SRAD 的内存到 CPU 容量比率,通过缺省页面放置算法从指定的 SRAD 分配的专用内存的最大百分比。
- vmsrad_aff_avail_pct
- 根据可调参数 enhanced_affinity_vmpool_limit 和平均系统计算百分比,在 虚拟池 参数中剩余的可用计算内存的百分比。
- vm_stagger_data
- 将调用进程的当前 斯决裂 值与每个 MCM 的累积交错值进行交错。 必须通过 弗莫 选项 data_stager_interval来设置此交错值。 出 参数的值为 NULL ,并且 阿尔格 参数的值为 0。
- IPC_LIMITS
- 返回 ipc_limits 结构的内容 (在 sys/vminfo.h 文件中描述)。 出 参数指向 ipc_limits 结构,而 阿尔格 是此结构的大小。 复制了较小的 阿尔格 和 大小 (struct ipc_limits) 参数值。 ipc_limits struct 包含针对系统的进程间通信 (IPC) 限制。
- vminfo_getpsizes
- 报告系统支持的页面大小。 当 阿尔格 的值设置为 0 时,将忽略 出 参数,并返回受支持的页面大小的数目。 当 阿尔格 的值大于 0 时, 阿尔格 参数值指示要报告的页面大小的数目,并且 出 参数必须是指向具有 阿尔格 参数指定的 psize_t 结构数的数组的指针。 psize_t 结构的数组将使用系统支持的页大小进行更新,以从支持的最小页大小开始的排序顺序。 将返回使用页大小更新的数组条目数。
- VMINFO_PSIZE
- 报告指定页大小的详细 VMM 统计信息。 出 参数指向将 psize 字段设置为要返回其统计信息的页面大小 (以字节为单位) 的 vminfo_psize 结构。 请将 阿尔格 参数的值设置为 vminfo_psize 结构的大小。
- VM_PROC_PF_INFO 或 VM_THREAD_PF_INFO
- 返回处理进程或线程所导致的缺页故障所花费的时间。 还会返回总缺页故障数。 arg 参数必须包含
vm_pf_info结构的大小, out 参数必须包含指向vm_pf_info结构的指针。vm_pf_info结构的前三个字段 (版本,标志和标识) 是由调用进程填充的输入字段。 此命令的输出由vmgetinfo存储在vm_pf_info结构的输出字段中。vm_pf_info结构在sys/vminfo.h中定义如下:struct vm_pf_info { /* INPUT */ uint32_t version; uint32_t flags; /* currently unused */ id64_t id; /* pid or tid */ /* OUTPUT */ struct timestruc64_t text_major_pf_time; struct timestruc64_t data_major_pf_time; struct timestruc64_t kernel_major_pf_time; struct timestruc64_t text_minor_pf_time; struct timestruc64_t data_minor_pf_time; struct timestruc64_t kernel_minor_pf_time; uint64_t minor_pf_count; uint64_t major_pf_count; }vm_pf_info结构的字段如下所示:- 版本 (version)
- 必须设置为
VM_PF_INFO_VER值 (在sys/vminfo.h头文件中定义)。 - 标志
- 未使用。 必须设置为 0。
- 标识
- 必须包含一个有效的线程或进程标识符(取决于命令),或者一个-1 的值。 如果值为-1,则会请求调用线程或进程的信息。
- 扩展
- 指定在其中返回 VMM 信息的地址。
返回值
对于除 VMINFO_GETPSIZES以外的所有命令,如果 Vmgetinfo 子例程成功,那么返回 0。 当 VMINFO_GETPSIZES 被指定为命令时,如果 Vmgetinfo 子例程成功,那么会返回许多页大小。
如果vmgetinfo子例程不成功,则返回值为-1,并设置errno全局变量来指示错误。
错误代码
如果满足以下条件,那么 Vmgetinfo 子例程不会成功:
- EFAULT
- 对缓冲区执行的复制操作未成功。
- EFAULT
- 尝试读取 出 参数所指向的页大小不成功。
- EINVAL
- 当命令为 VM_PAGE_INFO 时, vm_page_info 结构的 地址 字段是无效的地址。
- EINVAL
- 当 VM_NEW_HEAP_PSIZE 是命令时, 阿尔格 参数不会设置为 psize_t的大小。
- EINVAL
- 当命令为 VM_STAGGER_DATA 时, 出 参数未设置为 NULL ,或者 阿尔格 参数未设置为 0。
- EINVAL
- 当 VMINFO_PSIZE 是命令时, vminfo_psize 结构的 psize 字段是不受支持的页面大小, 阿尔格 参数小于 psize_t的大小,或者 出 参数为 NULL。
- EINVAL
- 当命令为 VMINFO_GETPSIZES 时, 阿尔格 参数小于 0 ,或者当 阿尔格 参数为非零时, 出 参数为 NULL。
- ENOMEM
- 当 VM_STAGGER_DATA 是命令时,由于对进程数据大小的资源限制,调用进程的数据无法错开。 (使用 ulimit 数据 可增加此进程的允许数据。 请参阅 ulimit 子例程。)
- ENOMEM
- 当 VM_NEW_HEAP_PSIZE 是命令时,由于资源限制而无法调整进程的中断值。 (请参阅 ulimit 子例程。)
- ENOSYS
- 命令 参数无效 (或还未实现)。
- ENOSYS
- 未在当前版本的AIX(或 32 位内核)中实施。
- ENOTSUP
- 当 VM_NEW_HEAP_PSIZE 为命令时,调用进程不是 64 位。
- ENOTSUP
- 当 VM_STAGGER_DATA 为命令时,调用进程不是 64 位。
- EPERM
- 当 VM_NEW_HEAP_PSIZE 为命令时,用户无权使用所请求的页面大小。
- ESRCH
- 当 VM_PROC_PF_INFO 或 VM_THREAD_PF_INFO 是命令时,线程或进程标识与任何活动线程或进程都不匹配。
- EPERM
- 当您使用 VM_PROC_PF_INFO 或 VM_THREAD_PF_INFO 命令时,用户没有足够的基于角色的访问控制 (RBAC) 特权来检索有关目标进程或线程的信息。
- EINVAL
- 使用 VM_PROC_PF_INFO 或 VM_THREAD_PF_INFO 时,
vm_pf_info结构中指定的版本与vmgetinfo子例程所显示的 VM_PF_INFO_VER 值不匹配,或者标志字段未设置为 0。
示例
以下示例演示了应用程序如何使用 vmgetinfo () 子例程来确定系统的受支持页大小:
int num_psizes;
psize_t *psizes;
/* Determine the number of supported page sizes */
num_psizes = vmgetinfo(NULL, VMINFO_GETPSIZES, 0);
if ((psizes = malloc(num_psizes*sizeof(psize_t))) == NULL)
return(1);
/* Get the page sizes */
if (vmgetinfo(psizes, VMINFO_GETPSIZES, num_psizes)!= num_psizes)
{
perror("vmgetinfo() unexpectedly failed");
return(2);
}
/* psize[0] = smallest page size
* psize[1] = next smallest page size...
* psize[num_psizes-1] = largest supported page size
*/