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 和平均系统计算百分比,在 虚拟池 参数中剩余的可用计算内存的百分比。
SRAD 中可用的计算内存总字节数是 vmsrad_total 参数中的值减去 vmsrad_freevmsrad_file 参数中的值之和。
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_INFOVM_THREAD_PF_INFO 是命令时,线程或进程标识与任何活动线程或进程都不匹配。
EPERM
当您使用 VM_PROC_PF_INFOVM_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
 */