ra_attach 子例程

用途

将工作组件连接到资源。

标准 C 库 (libc.a)

语法

#include <sys/rset.h>
int ra_attach(rstype1, rsid1, rstype2, rsid2, flags)
rstype_t rstype1, rstype2;
rsid_t rsid1, rsid2;
unsigned int flags;

描述

ra_attach 子例程将由 rstype1rsid1 参数指定的工作组件连接到由 rstype2rsid2 参数指定的资源。

参数

描述
rstype1 指定要连接到 rstype2/rsid2指定的资源的工作组件的类型。 rstype1 参数必须是 rset.h中定义的下列其中一个参数。
R_PROCESS
现有流程
R_THREAD
现有内核线程
R_FILDES
由打开的文件描述符标识的文件
R_SHM
由共享内存标识标识的共享内存段
R_SUBRANGE
连接到工作组件中的内存范围
rsid1 指定与 rstype1 参数关联的工作组件。 rsid1 参数必须为以下某个值:
进程标识 (对于 R_PROCESS 的 rstype1 )
将 rsid_t at_pid 字段设置为期望的进程标识。
内核线程标识 (对于 R_THREAD 的 rstype1 )
将 rsid_t.at_tid 字段设置为期望的内核线程标识。
打开文件描述符 (对于 R_FILDES 的 rstype1 )
将 rsid_t at_fd 字段设置为期望的文件描述符。
共享内存段 (对于 R_SHM 的 rstype)
将 rsid_t at_shmid 字段设置为所需的共享内存标识。
指向 subrange_t 结构的指针 (对于 R_SUBRANGE 的 rstrype)
将 rsid_t at_subbrange 字段设置为 subrange_t struct 的地址。 设置 subrange_t struct su_offset , su_length , su_rstype 和 su_rsid 字段。 将忽略 subrange_t 结构中的其他字段。 内存分配策略是从 flags 参数获取的,而不是从 su_policy 字段获取的。

将 subrange_t su_rstype 字段设置为 R_PROCMEM ,将 su_rsid.at_pid 字段设置为RS_我以附加到用户进程中的内存范围。 将 subrange_t su_offset 字段设置为进程中范围的起始地址。 将 subrange_t su_length 字段设置为该过程中范围的长度。

注: subrange_t su_offset 和 su_length 字段必须是 4 KB 的 4。 为了获得最佳性能,这些字段必须是支持内存范围的页大小的倍数。 可以使用指定 VM_page_INFO 命令参数的 Vmgetinfo 子例程来获取用于备份内存范围的页大小。
rstype2 指定要附加到工作组件的资源的类型。 rstype2 参数必须是 rset.h中定义的以下参数之一。
R_RSET
资源集连接
R_SRADID
SRADID 附件
rsid2 指定与 rstype2 参数关联的资源。 rsid2 参数必须为以下某个值:
资源集 (对于 R_RSET 的 rstype2 )
将 rsid_t at_rset 字段设置为期望的资源集。
SRADID (R_SRADID 的 rstype2 的调度程序资源分配域标识)
将 rsid_t at_sradid 字段设置为期望的 sradid。 SRADID 可能仅连接到线程或内存范围。 可以在内存范围连接上指定 at_sradid 值 SRADID_ANY ,以指示分区中所有内存的内存亲缘关系首选项。
标志 指定内存分配和其他连接选项:
缺省值
缺省内存分配策略
P_FIRST_TOUCH
第一个访问内存分配策略
P_BALANCED
均衡内存分配策略
r_migrate_async
异步迁移地址范围内的物理内存 (对于 R_SHM 或 R_subrange 的 rstype1 )
R_MIGRATE_SYNC
同步迁移地址范围内的物理内存 (对于 R_SHM 或 R_subrange 的 rstype1 )
连接 (_ATTACH_STRSET)
将使用单线程策略来调度进程,每个物理处理器仅在一个硬件线程上 (对于 R_PROCESS 的 rstype1 )。

返回值

如果成功,那么将返回值 0。 如果不成功,将返回 -1 的值,并设置 errno 全局变量来指示错误。

错误代码

描述
EINVAL 发生了下列其中一种情况:
  • 标志 参数包含无效的值。
  • rstype1rstype2 参数包含无效的类型标识。
ENODEV 发生了下列其中一种情况:
  • rstype2rsid2 参数指定的资源集不包含任何可用的处理器。
  • 指定了无效的 rsid2 SRADID。
ENOTSUP 发生了下列其中一种情况:
  • 已尝试连接 SRADID ,并且已禁用 ENHANCED_AFFINITY。
  • 已尝试将 SRADID 附加到文件。
  • 发出了带有 su_rstype R_PROCMEM 的 R_SUBRANGE 请求,并且 su_rsid.at_pid 字段不是RS_着。
ESRCH 不存在由 rstype1rsid1 参数指定的工作组件。
EPERM 发生了下列其中一种情况:
  • rstype2 指定的 R_RSET 和调用进程既不具有 root 用户权限,也不具有 CAP_NUMA_ATTACH 连接特权。 j
  • rstype2 指定的 R_RSET 和调用进程既没有 root 用户权限,也没有与 rstype1rsid1 参数所标识的进程相同的有效用户标识。
  • rstype2 指定的 R_RSET 或 R_SRADID 以及 rstype1rsid1 参数指定的进程或线程工作组件具有一个或多个具有 bindprocessor 绑定的线程。
  • rstype1rsid1 参数指定了进程, rstype2rsid2 参数指定了资源集。 该 rset 中的处理器未包括在进程的分区资源集内,或者指定进程中的线程具有不是 rstype1/rsid1 资源集的子集的资源集连接。
  • rstype2 对具有资源集连接的内存范围指定了 R_SRADID 连接。