编程接口指南

地址组关联

为线程创建轻量级进程 (Lightweight Process, LWP) 时,内核会将此线程指定给一个地址组。此 lgroup 称为线程的主 lgroup。内核在线程的主 lgroup 中的 CPU 上运行线程,并尽量从此 lgroup 中分配内存。如果主 lgroup 中的资源不可用,则内核将从其他 lgroup 中分配资源。如果一个线程与多个 lgroup 关联,则操作系统将按关联强度选择 lgroup 并从中分配资源。lgroup 可以具有以下三个不同关联级别之一:

  1. LGRP_AFF_STRONG 指示强关联。如果此 lgroup 是线程的主 lgroup,则操作系统将尽可能避免将其他 lgroup 重新指定为此线程的主 lgroup。有些事件(如动态重新配置、处理器脱机、处理器绑定以及处理器集绑定和处理)仍然可能导致为线程重新指定主 lgroup。

  2. LGRP_AFF_WEAK 指示弱关联。如果此 lgroup 是线程的主 lgroup,则操作系统将在必要时为此线程重新指定主 lgroup 以便平衡负载。

  3. LGRP_AFF_NONE 指示无关联。如果线程与任何 lgroup 均无关联,则操作系统将为此线程指定一个主 lgroup。

为给定线程分配资源时,操作系统将使用 lgroup 关联作为建议。将同时考虑此建议与其他系统约束。处理器绑定和处理器集不会更改 lgroup 关联,但是可能会限制能够运行线程的 lgroup。

使用 lgrp_affinity_get()

lgrp_affinity_get(3LGRP) 函数返回 LWP 与给定 lgroup 的关联。

#include <sys/lgrp_user.h>

lgrp_affinity_t lgrp_affinity_get(idtype_t idtype, id_t id, lgrp_id_t lgrp);

idtypeid 参数指定 lgrp_affinity_get() 函数检查的 LWP。如果 idtype 的值为 P_PID,则 lgrp_affinity_get() 函数将获取进程 ID 与 id 参数值匹配的进程中某个 LWP 的 lgroup 关联。如果 idtype 的值为 P_LWPID,则 lgrp_affinity_get() 函数将获取 LWP ID 与 id 参数值匹配的当前进程的 LWP 的 lgroup 关联。如果 idtype 的值为 P_MYID,则 lgrp_affinity_get() 函数将获取当前 LWP 的 lgroup 关联。

如果给定的 lgroup 或 ID 类型无效,则 lgrp_affinity_get() 函数将返回 EINVAL。如果调用进程的有效用户不是超级用户,并且调用进程的 ID 与某个 LWP 的实际用户 ID 或有效用户 ID 不匹配,则 lgrp_affinity_get() 函数将返回 EPERM。如果未找到给定的 lgroup 或 LWP,则 lgrp_affinity_get() 函数将返回 ESRCH

使用 lgrp_affinity_set()

lgrp_affinity_set(3LGRP) 函数设置 LWP 或 LWP 集合与给定 lgroup 的关联。

#include <sys/lgrp_user.h>

int lgrp_affinity_set(idtype_t idtype, id_t id, lgrp_id_t lgrp,

                      lgrp_affinity_t affinity);

idtypeid 参数指定 lgrp_affinity_set() 函数检查的 LWP 或 LWP 集合。如果 idtype 的值为 P_PID,则 lgrp_affinity_set() 函数会将进程 ID 与 id 参数值匹配的进程中所有 LWP 的 lgroup 关联设置为 affinity 参数中指定的关联级别。如果 idtype 的值为 P_LWPID,则 lgrp_affinity_set() 函数会将 LWP ID 与 id 参数值匹配的当前进程的 LWP 的 lgroup 关联设置为 affinity 参数中指定的关联级别。如果 idtype 的值为 P_MYID,则 lgrp_affinity_set() 函数会将当前 LWP 或进程的 lgroup 关联设置为 affinity 参数中指定的关联级别。

如果给定的 lgroup、关联或 ID 类型无效,则 lgrp_affinity_set() 函数将返回 EINVAL。如果调用进程的有效用户不是超级用户,并且调用进程的 ID 与某个 LWP 的实际用户 ID 或有效用户 ID 不匹配,则 lgrp_affinity_set() 函数将返回 EPERM。如果未找到给定的 lgroup 或 LWP,则 lgrp_affinity_set() 函数将返回 ESRCH