Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1299842
  • 博文数量: 554
  • 博客积分: 10425
  • 博客等级: 上将
  • 技术积分: 7555
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-09 09:49
文章分类

全部博文(554)

文章存档

2012年(1)

2011年(1)

2009年(8)

2008年(544)

分类:

2008-04-15 11:30:22


动态资源池约束和目标
第6 章• 动态资源池75
pset.escapable(可写布尔值)
表示是否为此pset 设置PSET_NOESCAPE。请参见pset_setattr(2) 手册页。
pset.load(只读无符号整数)
此处理器集的负载。最低值为0。该值将随着处理器集上的负载(由系统运行队列中的
作业数度量)以线性方式增加。
pset.max(可写无符号整数)
此处理器集中允许的最大CPU 数。
pset.min(可写无符号整数)
此处理器集中允许的最小CPU 数。
pset.name(可写字符串)
资源的用户名称。
pset.size(只读无符号整数)
此处理器集的当前CPU 数。
pset.sys_id(只读整数)
系统指定的处理器集ID。
pset.type(只读字符串)
命名资源类型。所有处理器集的值都为pset。
pset.units(只读字符串)
标识与大小相关的属性的意义。所有处理器集的值都为population。
cpu.comment(可写字符串)
CPU 的用户说明。
使用libpool 处理池配置
libpool(3LIB) 池配置库定义了用于读取和写入池配置文件的接口。该库还定义了用于提交
现有配置以成为运行的操作系统配置的接口。 头文件提供了所有库服务的类型和
函数声明。
在资源池功能中,引入了“池”这个一般性的概念,用来指可绑定到进程的资源的集合。
可以采用持久方式配置、分组并标记处理器集和其他实体。可以将工作负荷组件与系统总
资源的一部分相关联。libpool(3LIB) 库提供了用于访问资源池功能的C 语言API。
pooladm(1M)、poolbind(1M) 和poolcfg(1M) 可通过从shell 中调用命令来使用资源池功能。
处理pset
以下列表包含与创建或销毁pset 以及处理pset 关联的函数。
processor_bind(2) 将LWP(lightweight process,轻量进程)或一组LWP
绑定到指定的处理器。
pset_assign(2) 为处理器集分配处理器。
使用libpool 处理池配置
76 Solaris 10 资源管理器开发者指南• 2006 年11 月
pset_bind(2) 将一个或多个LWP(lightweight processes,轻量进
程)绑定到处理器集。
pset_create(2) 创建不包含处理器的空处理器集。
pset_destroy(2) 销毁处理器集并释放关联的成员处理器和进程。
pset_setattr(2), pset_getattr(2) 设置或获取处理器集属性。
资源池API 函数
本节列出了所有的资源池函数。每个函数都带有指向相应手册页的链接和有关该函数用途
的简短说明。根据函数执行操作还是查询,函数分为两组:
 第77 页中的“用于对资源池和关联元素执行操作的函数”
 第78 页中的“用于查询资源池和关联元素的函数”
用于交换集的libpool 的导入接口与本文档中定义的接口相同。
用于对资源池和关联元素执行操作的函数
本节中列出的接口用于执行与池和关联元素相关的操作。
pool_associate(3POOL) 将资源与指定的池关联起来。
pool_component_to_elem (3POOL) 将指定的组件转换为池元素类型。
pool_conf_alloc(3POOL) 创建池配置。
pool_conf_close(3POOL) 关闭指定的池配置并释放关联资源。
pool_conf_commit(3POOL) 提交对指定池配置所做的更改以进行永久存储。
pool_conf_export(3POOL) 将给定的配置保存到指定位置。
pool_conf_free(3POOL) 释放池配置。
pool_conf_open(3POOL) 在指定的位置创建池配置。
pool_conf_remove(3POOL) 删除对配置的永久存储。
pool_conf_rollback (3POOL) 将配置状态恢复到池配置的永久存储中保留的状
态。
pool_conf_to_elem (3POOL) 将指定的池配置转换为池元素类型。
pool_conf_update(3POOL) 更新内核状态的库快照。
pool_create(3POOL) 使用缺省属性和每种类型的缺省资源创建新的池。
pool_destroy(3POOL) 破坏指定的池。关联的资源不会被修改。
资源池API 函数
第6 章• 动态资源池77
pool_dissociate(3POOL) 删除给定资源与池之间的关联。
pool_put_property (3POOL) 将有关元素的命名属性设置为指定的值。
pool_resource_create (3POOL) 使用所提供配置的指定名称和类型创建新的资源。
pool_resource_destroy (3POOL) 从配置文件中删除指定的资源。
pool_resource_to_elem (3POOL) 将指定的池资源转换为池元素类型。
pool_resource_transfer (3POOL) 将基本单位从源资源传输到目标资源。
pool_resource_xtransfer (3POOL) 将指定组件从源资源传输到目标资源。
pool_rm_property(3POOL) 从元素中删除命名的属性。
pool_set_binding(3POOL) 将指定的进程绑定到与正在运行的系统中的池关联
的资源。
pool_set_status(3POOL) 修改池功能的当前状态。
pool_to_elem(3POOL) 将指定的池转换为池元素类型。
pool_value_alloc(3POOL) 分配并返回池属性值的不透明容器。
pool_value_free(3POOL) 释放分配的属性值。
pool_value_set_bool (3POOL) 设置boolean 类型的属性值。
pool_value_set_double (3POOL) 设置double 类型的属性值。
pool_value_set_int64 (3POOL) 设置int64 类型的属性值。
pool_value_set_name (3POOL) 为池属性设置name=value 对。
pool_value_set_string (3POOL) 复制已传递的字符串。
pool_value_set_uint64 (3POOL) 设置uint64 类型的属性值。
用于查询资源池和关联元素的函数
本节中列出的接口用于执行与池和关联元素相关的查询。
pool_component_info (3POOL) 返回描述给定组件的字符串。
pool_conf_info(3POOL) 返回描述整个配置的字符串。
pool_conf_location (3POOL) 返回为指定配置的pool_conf_open() 提供的
位置字符串。
pool_conf_status(3POOL) 返回池配置的有效性状态。
pool_conf_validate (3POOL) 检查给定配置内容的有效性。
pool_dynamic_location (3POOL) 返回池框架用于存储动态配置的位置。
资源池API 函数
78 Solaris 10 资源管理器开发者指南• 2006 年11 月
pool_error(3POOL) 返回通过调用资源池配置库函数记录的最终
故障的错误值。
pool_get_binding(3POOL) 返回正在运行的系统中的池名称,该池包含
与指定进程绑定的资源集。
pool_get_owning_resource (3POOL) 返回当前包含指定组件的资源。
pool_get_pool(3POOL) 返回具有所提供配置中的指定名称的池。
pool_get_property (3POOL) 检索元素中的已命名属性的值。
pool_get_resource (3POOL) 返回具有所提供配置中的给定名称和类型的
资源。
pool_get_resource_binding (3POOL) 返回正在运行的系统中的池名称,该池包含
与给定进程绑定的资源集。
pool_get_status(3POOL) 检索池功能的当前状态。
pool_info(3POOL) 返回指定池的说明。
pool_query_components (3POOL) 检索与指定的属性列表匹配的所有资源组
件。
pool_query_pool_resources (3POOL) 返回当前与池关联的以NULL结尾的资源数
组。
pool_query_pools(3POOL) 返回与指定的属性列表匹配的池列表。
pool_query_resource_components (3POOL) 返回构成指定资源的以NULL结尾的组件数
组。
pool_query_resources (3POOL) 返回与指定的属性列表匹配的资源列表。
pool_resource_info (3POOL) 返回指定资源的说明。
pool_resource_type_list (3POOL) 枚举此平台上的池框架支持的资源类型。
pool_static_location (3POOL) 返回池框架用于存储缺省池框架实例化配置
的位置。
pool_strerror(3POOL) 返回每个有效池错误代码的说明。
pool_value_get_bool (3POOL) 获取boolean 类型的属性值。
pool_value_get_double (3POOL) 获取double 类型的属性值。
pool_value_get_int64 (3POOL) 获取int64 类型的属性值。
pool_value_get_name (3POOL) 返回为指定池属性指定的名称。
pool_value_get_string (3POOL) 获取string 类型的属性值。
pool_value_get_type (3POOL) 返回指定的池值包含的数据类型。
pool_value_get_uint64 (3POOL) 获取uint64 类型的属性值。
资源池API 函数
第6 章• 动态资源池79
pool_version(3POOL) 获取池库的版本号。
pool_walk_components (3POOL) 调用对资源中包含的所有组件的回调。
pool_walk_pools(3POOL) 调用在配置中定义的所有池的回调。
pool_walk_properties (3POOL) 调用对为给定元素定义的所有属性的回调。
pool_walk_resources (3POOL) 调用对与池关联的所有资源的回调。
资源池代码示例
本节包含资源池接口的代码示例。
确定资源池中的CPU 数
sysconf(3C) 提供有关整个系统中的CPU 数的信息。以下示例提供了用于确定特定应用程序
的池pset 中所定义CPU 数的粒度。
本示例的要点包括以下内容:
 pvals[] 应该为以NULL结尾的数组。
 pool_query_pool_resources() 返回与应用程序的池my_pool 中的pvals 数组类型pset 匹
配的所有资源的列表。由于池只能有一个pset 资源实例,因此每个实例始终在nelem 中
返回。reslist[] 仅包含一个元素,即pset 资源。
pool_value_t *pvals[2] = {NULL}; /* pvals[] should be NULL terminated */
/* NOTE: Return value checking/error processing omitted */
/* in all examples for brevity*/
conf_loc = pool_dynamic_location();
conf = pool_conf_alloc();
pool_conf_open(conf, conf_loc, PO_RDONLY);
my_pool_name = pool_get_binding(getpid());
my_pool = pool_get_pool(conf, my_pool_name);
资源池代码示例
80 Solaris 10 资源管理器开发者指南• 2006 年11 月
pvals[0] = pool_value_alloc();
pvals2[2] = { NULL, NULL };
pool_value_set_name(pvals[0], "type");
pool_value_set_string(pvals[0], "pset");
reslist = pool_query_pool_resources(conf, my_pool, &nelem, pvals);
pool_value_free(pvals[0]);
pool_query_resource_components(conf, reslist[0], &nelem, NULL);
printf("pool %s: %u cpu", my_pool_ name, nelem);
pool_conf_close(conf);
列出所有的资源池
以下示例列出了在应用程序的池pset 中定义的所有资源池。
该示例的要点包括以下内容:
 采用PO_RDONLY 以只读方式打开动态conf 文件。pool_query_pools() 将池列表返回到
pl 中,并将池数目返回到nelem 中。对于每个池,请调用pool_get_property() 以将
pool.name 属性从元素放入pval 值中。
 pool_get_property() 将调用pool_to_elem() 以将libpool 实体转换为不透明的值。
pool_value_get_string() 将从不透明的池值中获取字符串。
conf = pool_conf_alloc();
pool_conf_open(conf, pool_dynamic_location(), PO_RDONLY);
pl = pool_query_pools(conf, &nelem, NULL);
pval = pool_value_alloc();
for (i = 0; i < nelem; i++) {
pool_get_property(conf, pool_to_elem(conf, pl[i]), "pool.name", pval);
pool_value_get_string(pval, &fname);
资源池代码示例
第6 章• 动态资源池81
printf("%s\n", name);
}
pool_value_free(pval);
free(pl);
pool_conf_close(conf);
报告给定池的池统计信息
以下示例报告了指定池的统计信息。
该示例的要点包括以下内容:
 pool_query_pool_resources() 将获取rl 中的所有资源的列表。由于
pool_query_pool_resources() 的最后一个参数为NULL,因此将返回所有资源。对于每
种资源,系统都会读取并列显name、load 和size 属性。
 对strdup() 的调用将分配本地内存并复制由get_string() 返回的字符串。对
get_string() 的调用将返回一个指针,该指针由对get_property() 的下一次调用释放。
如果不包括对strdup() 的调用,则对字符串的后续引用将导致应用程序出现故障,并出
现段错误。
printf("pool %s\n:" pool_name);
pool = pool_get_pool(conf, pool_name);
rl = pool_query_pool_resources(conf, pool, &nelem, NULL);
for (i = 0; i < nelem; i++) {
pool_get_property(conf, pool_resource_to_elem(conf, rl[i]), "type", pval);
pool_value_get_string(pval, &type);
type = strdup(type);
snprintf(prop_name, 32, "%s.%s", type, "name");
pool_get_property(conf, pool_resource_to_elem(conf, rl[i]),
prop_name, pval);
pool_value_get_string(val, &res_name);
资源池代码示例
82 Solaris 10 资源管理器开发者指南• 2006 年11 月
res_name = strdup(res_name);
snprintf(prop_name, 32, "%s.%s", type, "load");
pool_get_property(conf, pool_resource_to_elem(conf, rl[i]),
prop_name, pval);
pool_value_get_uint64(val, &load);
snprintf(prop_name, 32, "%s.%s", type, "size");
pool_get_property(conf, pool_resource_to_elem(conf, rl[i]),
prop_name, pval);
pool_value_get_uint64(val, &size);
printf("resource %s: size %llu load %llu\n", res_name, size, load);
free(type);
free(res_name);
}
free(rl);
设置pool.comment 属性并添加新属性
以下示例设置了pset 的pool.comment 属性。该示例还在pool.newprop 中创建了新的属性。
该示例的要点包括以下内容:
 在对pool_conf_open() 的调用中,使用静态配置文件中的PO_RDWR 要求调用方为超级
用户。
 要在运行此实用程序后提交对pset 所做的更改,请发出pooladm -c 命令。要使实用程
序提交更改,请使用第二个非零参数调用pool_conf_commit()。
pool_set_comment(const char *pool_name, const char *comment)
{
pool_t *pool;
pool_elem_t *pool_elem;
资源池代码示例
第6 章• 动态资源池83
pool_value_t *pval = pool_value_alloc();
pool_conf_t *conf = pool_conf_alloc();
/* NOTE: need to be root to use PO_RDWR on static configuration file */
pool_conf_open(conf, pool_static_location(), PO_RDWR);
pool = pool_get_pool(conf, pool_name);
pool_value_set_string(pval, comment);
pool_elem = pool_to_elem(conf, pool);
pool_put_property(conf, pool_elem, "pool.comment", pval);
printf("pool %s: pool.comment set to %s\n:" pool_name, comment);
/* Now, create a new property, customized to installation site */
pool_value_set_string(pval, "New String Property");
pool_put_property(conf, pool_elem, "pool.newprop", pval);
pool_conf_commit(conf, 0); /* NOTE: use 0 to ensure only*/
/* static file gets updated */
pool_value_free(pval);
pool_conf_close(conf);
pool_conf_free(conf);
/* NOTE: Use "pooladm -c" later, or pool_conf_commit(conf, 1) */
/* above for changes to the running system */
}
另一种修改池的注释并添加新的池属性的方法是使用poolcfg(1M)。
poolcfg -c ’modifypool pool-name (string pool.comment = "cmt-string")’
poolcfg -c ’modifypool pool-name (string pool.newprop =
资源池代码示例
84 Solaris 10 资源管理器开发者指南• 2006 年11 月
"New String Property")’
与资源池关联的编程问题
编写应用程序时,请考虑以下问题。
 每个站点都可以向池配置中添加其自己的属性列表。
可以在多个配置文件中维护多个配置。系统管理员可以提交不同的文件,以反映在不同
的时间段对资源占用情况的更改。根据负载条件,这些时间段可以包括不同的时间
(日、周、月或季节)。
 可以在池之间共享资源集,但是池只有一个给定类型的资源集。因此,可以在缺省应用
程序数据库池与特定应用程序数据库池之间共享pset_default。
 请谨慎使用pool_value_*() 接口。切记字符串池值的内存分配问题。请参见第82 页中
的“报告给定池的池统计信息”。
与资源池关联的编程问题
第6 章• 动态资源池85
86
有关Solaris Zones 中资源管理应用程序的
设计注意事项
本章简要概述了Solaris Zones 技术,并介绍了编写资源管理应用程序的开发者可能遇到的潜
在问题。有关区域的更多信息,请参见《System Administration Guide: Solaris
Containers-Resource Management and Solaris Zones》中的第二部分,“Zones”。
区域概述
区域是指在Solaris 操作系统的单个实例中创建的虚拟化的操作系统环境。区域是一种为应
用程序提供安全隔离环境的分区技术。创建区域时,便创建了一个应用程序执行环境,其
中的进程与系统的其余部分相互隔离。这种隔离可防止在一个区域中运行的进程监视或影
响在其他区域中运行的进程。即使运行的进程具有超级用户凭证,也不能查看或影响其他
区域中的活动。区域还提供了一个抽象层,用于分隔应用程序和部署该区域的计算机的物
理属性。这些属性的示例包括物理设备路径和网络接口名称。
缺省情况下,所有系统都有全局区域。全局区域对Solaris 环境进行全局查看的方式与超级
用户模型相似。其他所有区域都称为非全局区域。非全局区域类似于超级用户模型的非特
权用户。非全局区域中的进程只能控制该区域中的进程和文件。通常,系统管理工作主要
是在全局区域中执行的。在极少数需要隔离系统管理员的情况下,可以在非全局区域中使
用特权应用程序。但是,通常资源管理活动在全局区域中进行。
有关区域中资源管理应用程序的设计注意事项
与在传统的Solaris 环境中一样,所有应用程序在全局区域中都可以完全正常地运行。只要
应用程序不需要任何权限,大多数应用程序便会在非全局环境中正常运行,不会出现任何
问题。如果应用程序确实需要权限,则开发者需要仔细了解所需的权限以及特定权限的使
用方式。如果需要权限,则系统管理员必须为应用程序指定相应的权限。
以下是开发者需要调查的已知情况:
 更改系统时间的系统调用需要PRIV_SYS_TIME 权限。这些系统调用包括
adjtime(2)、ntp_adjtime(2) 和stime(2)。
7第7 章
87
 需要对设置了sticky 位的文件执行的系统调用需要PRIV_SYS_CONFIG 权限。这些系统
调用包括chmod(2)、creat(2) 和open(2)。
 ioctl(2) 系统调用需要PRIV_SYS_NET_CONFIG 权限才能解除对STREAMS 模块中的锚
点的锁定。
 link(2) 和unlink(2) 系统调用需要PRIV_SYS_LINKDIR 权限才能在非全局区域中创建目
录链接或解除目录链接。用于安装或配置软件或创建临时目录的应用程序可能会受到此
限制的影响。
 PRIV_SYS_PROC_LOCK_MEMORY 权限是
mlock(3C)、munlock(3C)、mlockall(3C)、munlockall(3C) 和plock(3C) 函数以及
memcntl(2) 系统的MC_LOCK、MC_LOCKAS、MC_UNLOCK 和MC_UNLOCKAS 标志
所必需的。此限制会影响需要锁定和解除锁定内存的应用程序,如数据库程序。如果应
用程序出于性能考虑而锁定内存,则使用shmctl(2) 系统调用的锁定共享内存(intimate
shared memory, ISM) 可以提供潜在的解决方法。
 mknod(2) 系统调用需要PRIV_SYS_DEVICES 权限才能创建块(S_IFBLK) 或字符
(S_IFCHAR) 特殊文件。此限制会影响需要即时创建设备节点的应用程序。
 msgctl(2) 系统调用中的IPC_SET 标志需要PRIV_SYS_IPC_CONFIG 权限才能增加消息队
列的字节数。此限制会影响任何需要动态调整消息队列大小的应用程序。
 nice(2) 系统调用需要PRIV_PROC_PRIOCNTL权限才能更改进程的优先级。此限制会影
响用于设置调用优先级的应用程序。如果进程需要更改其优先级,则这种更改必须由进
程在全局区域中进行。另一种更改优先级的方法是将正在运行应用程序的非全局区域绑
定到资源池,尽管该区域中的调用进程最终会通过公平共享调度程序来决定。
 p_online(2) 系统调用中的P_ONLINE、P_OFFLINE、P_NOINTR、P_FAULTED、
P_SPARE 和PZ-FORCED 标志需要PRIV_SYS_RES_CONFIG 权限才能返回或更改进程操
作状态。此限制会影响需要启用或禁用CPU 的应用程序。
 priocntl(2) 系统调用中的PC_SETPARMS 和PC_SETXPARMS 标志需要
PRIV_PROC_PRIOCNTL权限才能更改轻量进程(lightweight process, LWP) 的调度参数。
 需要管理处理器集(pset) 的系统调用(包括将LWP 绑定到pset 和设置pset 属性)需要
PRIV_SYS_RES_CONFIG 权限。此限制会影响以下系统调用
:pset_assign(2)、pset_bind(2)、pset_create(2)、pset_destroy(2) 和
pset_setattr(2)。
 shmctl(2) 系统调用中的SHM_LOCK 和SHM_UNLOCK 标志需要
PRIV_PROC_LOCK_MEMORY 权限才能共享内存控制操作。如果应用程序出于性能考
虑而锁定内存,则使用锁定共享内存(intimate shared memory, ISM) 功能可以提供潜在的
解决方法。
 socket(3SOCKET) 函数需要PRIV_NET_RAWACCESS 权限才能在协议设置为
IPPROTO_RAW或IPPROTO_IGMP 的情况下创建原始套接字。此限制会影响使用原始
套接字或需要创建或检查TCP/IP 头的应用程序。
 swapctl(2) 系统调用需要PRIV_SYS_CONFIG 权限才能添加或删除交换资源。此限制会
影响安装和配置软件。
 uadmin(2) 系统调用需要PRIV_SYS_CONFIG 权限才能使用A_REMOUNT、A_FREEZE、
A_DUMP 和AD_IBOOT 命令。此限制会影响在某些情况下需要强制进行崩溃转储的应用程
序。
有关区域中资源管理应用程序的设计注意事项
88 Solaris 10 资源管理器开发者指南• 2006 年11 月
 clock_settime(3RT) 函数需要PRIV_SYS_TIME 权限才能设置CLOCK_REALTIME 和
CLOCK_HIRES 时钟。
 cpc_bind_cpu(3CPC) 函数需要PRIV_CPC_CPU 权限才能将请求集绑定到硬件计数器。
作为解决办法,可以使用cpc_bind_curlwp(3CPC) 函数监视CPU 计数器,找到有问题的
LWP。
 pthread_attr_setschedparam(3C) 函数需要PRIV_PROC_PRIOCNTL权限才能更改线程
的基础调度策略和参数。
 timer_create(3RT) 函数需要PRIV_PROC_CLOCK_HIGHRES 权限才能使用高精度系统
时钟创建计时器。
 t_open(3NSL) 函数需要PRIV_NET_RAWACCESS 权限才能建立传输端点。此限制会影响
使用/dev/rawip 设备实现网络协议的应用程序以及对TCP/IP 数据包头执行操作的应用
程序。
 以下列出的库所提供的API 在非全局区域中不受支持。共享对象存在于区域的/usr/lib
目录中,因此,如果代码中包括对这些库的引用,将不会出现链接时错误。对自己的
make 文件进行检查可以确定应用程序是否已显式绑定到其中的任何一个库,并可以在执
行应用程序时使用pmap(1) 来验证是否未动态装入其中的任何库。
 libdevinfo(3LIB)
 libcfgadm(3LIB)
 libpool(3LIB)
 libtnfctl(3LIB)
 libsysevent(3LIB)
 区域包含一组受限制的设备,这些设备主要由构成Solaris 编程API 一部分的伪设备组
成。这些伪设备包括/dev/null、/dev/zero、/dev/poll、/dev/random、/dev/tcp 等。
除非系统管理员已配置了设备,否则不能从区域中直接访问物理设备。由于设备通常是
系统中的共享资源,因此,要使设备在区域中可用,需要按照以下方式设置一些限制,
以免破坏系统安全性。
 /dev 名称空间由符号链接(即逻辑路径)组成,这些符号链接指向/devices 中的物
理路径。/devices 名称空间只能在全局区域中使用,用于反映驱动程序所创建的附
加设备实例的当前状态。仅有逻辑路径/dev 在非全局区域中是可见的。
 非全局区域中的进程不能创建新设备节点。例如,mknod(2) 不能在非全局区域中创建
特殊文件。如果指定了/dev 中的文件,creat(2)、link(2)、mkdir(2)、rename(2)、
symlink(2) 和unlink(2) 系统调用将会失败并发出EACCES 错误。您可以创建指向
/dev 中的某一项的符号链接,但是不能在/dev 中创建该链接。
 公开系统数据的设备只能在全局区域中使用。此类设备的示例包括
dtrace(7D)、kmem(7D)、kmdb(7d)、ksyms(7D)、lockstat(7D) 和trapstat(1M)。
 /dev 名称空间包含组成缺省“安全”驱动程序集的设备节点以及zonecfg(1M) 命令
为该区域指定的设备节点。
 不能在非全局区域中访问支持DLPI 编程接口的任何NIC 设备,例如hme(7D) 和
ce(7D)。
 每个非全局区域都有自己的逻辑网络和回送接口。上层流与逻辑接口之间的绑定受到限
制,因此流只能与相同区域中的逻辑接口建立绑定。与之类似,来自逻辑接口的数据包
只能传递给与该逻辑接口在同一区域中的上层流。到回送地址的绑定将保留在区域内,
有关区域中资源管理应用程序的设计注意事项
 
 
以上文章转自于 : http://developers.sun.com.cn/
阅读(559) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~