编程接口指南

地址组分层结构

使用本节介绍的 API,调用线程可以导航 lgroup 分层结构。 lgroup 分层结构是一种类似于树结构的有向无环图,只不过一个节点可能具有多个父级。根 lgroup 表示整个计算机,其中包含此计算机的所有资源。根 lgroup 是系统中具有最大延迟值的 lgroup。每个子 lgroup 均包含根 lgroup 中的硬件子集,并且由一个较小的延迟值限定。越接近根的地址组具有的资源越多,延迟也越大。越接近叶的地址组具有的资源越少,延迟也越小。lgroup 可以包含直接位于其延迟界限内的资源,还可以包含具有其自己的资源集合的叶 lgroup。叶 lgroup 的资源可供封装这些叶 lgroup 的 lgroup 使用。

使用 lgrp_cookie_stale()

lgrp_cookie_stale(3LGRP) 函数确定给定 cookie 所表示的 lgroup 分层结构快照是否最新。

#include <sys/lgrp_user.h>

int lgrp_cookie_stale(lgrp_cookie_t cookie);

lgrp_init() 函数返回的 cookie 可能会因为多种原因而过时,具体取决于快照所表示的视图。当视图设置为 LGRP_VIEW_OS 时,调用 lgrp_init() 函数所返回的 cookie 可能会过时,原因包括 lgroup 分层结构的更改(如动态重新配置)或CPU 联机状态的更改。当视图设置为 LGRP_VIEW_CALLER 时,调用 lgrp_init() 函数所返回的 cookie 可能会过时,原因是调用线程处理器集的更改或 lgroup 分层结构的更改。要刷新过时的 cookie,可以使用旧 cookie 调用 lgrp_fini() 函数,然后调用 lgrp_init() 函数生成一个新 cookie。

如果给定的 cookie 无效,则 lgrp_cookie_stale() 函数将返回 EINVAL

使用 lgrp_view()

lgrp_view(3LGRP) 函数确定用于获取给定 lgroup 分层结构快照的视图。

#include <sys/lgrp_user.h>

lgrp_view_t lgrp_view(lgrp_cookie_t cookie);

lgrp_view() 函数使用表示 lgroup 分层结构快照的 cookie 作为参数,并返回该 lgroup 分层结构的快照视图。使用视图 LGRP_VIEW_CALLER 获取的快照仅包含可供调用线程使用的资源。使用视图 LGRP_VIEW_OS 获取的快照包含可供操作系统使用的所有资源。

如果给定的 cookie 无效,则 lgrp_view() 函数将返回 EINVAL

使用 lgrp_nlgrps()

lgrp_nlgrps(3LGRP) 函数返回系统中的地址组数。如果系统中只有一个地址组,则内存位置优化没有任何效果。

#include <sys/lgrp_user.h>

int lgrp_nlgrps(lgrp_cookie_t cookie);

lgrp_nlgrps() 函数使用表示 lgroup 分层结构快照的 cookie,并返回此分层结构中的可用 lgroup 数。

如果此 cookie 无效,则 lgrp_nlgrps() 函数将返回 EINVAL

使用 lgrp_root()

lgrp_root(3LGRP) 函数返回根 lgroup ID。

#include <sys/lgrp_user.h>

lgrp_id_t lgrp_root(lgrp_cookie_t cookie);

lgrp_root() 函数使用表示 lgroup 分层结构快照的 cookie,并返回根 lgroup ID。

使用 lgrp_parents()

lgrp_parents(3LGRP) 函数使用表示 lgroup 分层结构快照的 cookie,并返回指定 lgroup 的父 lgroup 数。

#include <sys/lgrp_user.h>

int lgrp_parents(lgrp_cookie_t cookie, lgrp_id_t child,

                 lgrp_id_t *lgrp_array, uint_t lgrp_array_size);

如果 lgrp_array 不为 NULL 并且 lgrp_array_size 的值不为零,则 lgrp_parents() 函数将使用父 lgroup ID 填充数组,直到填满数组或者所有父 lgroup ID 均在数组中为止。根 lgroup 没有父级。如果针对根 lgroup 调用 lgrp_parents() 函数,则不会填充 lgrp_array

如果此 cookie 无效,则 lgrp_parents() 函数将返回 EINVAL。如果未找到指定的 lgroup ID,则 lgrp_parents() 函数将返回 ESRCH

使用 lgrp_children()

lgrp_children(3LGRP) 函数使用表示调用线程的 lgroup 分层结构快照的 cookie,并返回指定 lgroup 的子 lgroup 数。

#include <sys/lgrp_user.h>

int lgrp_children(lgrp_cookie_t cookie, lgrp_id_t parent,

                  lgrp_id_t *lgrp_array, uint_t lgrp_array_size);

如果 lgrp_array 不为 NULL 并且 lgrp_array_size 的值不为零,则 lgrp_children() 函数将使用子 lgroup ID 填充数组,直到填满数组或者所有子 lgroup ID 均在数组中为止。

如果此 cookie 无效,则 lgrp_children() 函数将返回 EINVAL。如果未找到指定的 lgroup ID,则 lgrp_children() 函数将返回 ESRCH