命名共享库区域

默认情况下,AIX®会使用一组全局段(称为全局共享库区)在进程间共享库。

对于 32 位进程,该区域由一个用于共享库文本的段(段 0xD)和一个用于预重新定位库数据的段(段 0xF)组成。 共享文本和预重新定位数据提高了有大量进程使用普通共享库的系统的性能。

因为全局共享库区域是一个单独的固定大小的资源,所以尝试共享超过该区域容量的一组库是不会成功的。 这种情况下会私自装入一部分进程库。 与共享相比,私自装入库会消耗进程中的专用地址空间,并且在调页空间中放置更多的需求,导致整体系统性能下降。

为了解决全局共享库区域的此限制, AIX 5.3 支持 指定的共享库区域,这包括以下优点:

  • 命名共享库区域替换进程组的全局共享库区域。
  • 命名共享库区域使得进程组在有效地址空间中与全局共享库区域(段 0xD 和 0xF)相同的位置上具有它们可用的全部共享库容量。
  • 命名共享库区域的功能通过 LDR_CNTRL 环境变量启用,不需要对现有二进制作任何更改。
  • 系统中可以同时有多个命名共享库区域处于活动状态。
  • 进程使用唯一的名称指定某个命名共享库区域。 该名称由创建区域的进程选择。
  • 只有 32 位进程可以使用命名共享库区域。

因为对特定的命名共享库区域而言,只有请求它的进程才能使用它,所以使用全局共享库区域或不同的命名共享库区域的进程不会消耗其空间。 命名共享库区域中这种空间竞争的下降对使用该区域的进程有利。 这些进程消耗的专用地址空间更少,相互之间能更好地共享库。 在进程之间使用利用普通共享库的命名共享库区域,可以优化进程的地址空间使用情况并降低对调页空间的需求,提高了整体的系统性能。

备用内存型号 (doubletext32)

除了缺省的共享库区域内存型号(一个段专用于共享库文本,另一个段专用于预重新定位库数据),命名共享库区域支持将两段都用于共享库文本的备用内存型号。 该型号对共享多于 256 MB 库文本的进程组有用。 请注意,由于该备用内存型号执行没有预重新定位的库数据,所以在(执行时间相关性和动态装入模块)的模块装入过程中可能会出现一些性能下降。 因此,在每一个案例中都应该考虑共享库文本容量的增长对实际性能的好处。

INTERFACE

访问权

通过在运行时其环境中有带有 NAMEDSHLIB 选项的 LDR_CNTRL 环境变量,进程请求使用命名共享库区域。 新选项的语法如下:

NAMEDSHLIB=name[,attribute][,attribute2]...[,attributeN]

有效的名称字符串可以是与正则表达式 [A-Za-z0-9_\.]+ 匹配的任何字符串 (仅包含字母数字,底条和句点字符)。

有效的名称字符串必须以以下的一个字符结束:

  • @(at 符号):多个 LDR_CNTRL 选项的定界符
  • ,(逗号):NAMEDSHLIB 属性的定界符
  • \0(空):LDR_CNTRL 环境字符串的终止符

如果指定了无效的名称字符串,那么忽略整个 NAMEDSHLIB 选项。 如果指定了无效的属性,那么仅忽略该属性。 当前只有一个受支持的属性: doubletext32

使用命名共享库区域没有访问限制。 所有使用区域的请求都经过授权。

创建

没有明确用于创建命名共享库区域的接口。 当进程请求使用一个不存在的命名共享库区域时,将自动创建该区域。

清除

系统使用适用于全局共享库区域的机制从命名共享库区域除去无用的库:
  • 当区域变满时将自动除去无用的库。
  • 使用 slibclean 命令可以完成强制除去无用的库。

销毁

没有明确用于删除命名共享库区域的接口。 当使用命名共享库区域的进程只剩下最后一个(区域的使用情况计数下降到零)时,将自动删除该区域。

属性

NAMEDSHLIB 属性仅在命名共享库区域创建过程中由系统装入程序检测。 因此,使用现有命名共享库区域的请求不一定要指定属性匹配创建时指定的那些属性(请求不会由于属性不匹配而失败)。 然而,因为系统自动删除无用的命名共享库区域,所以即使您在请求使用一个现有的命名共享库区域,也最好始终指定属性。

示例

  1. 通过运行以下命令,使用名为 XYZ 的命名共享库区域(一个段专用于共享库文本,另一个段专用于预重新定位库数据)运行一对应用程序:
    $ export LDR_CNTRL=NAMEDSHLIB=XYZ
    $ xyz_app
    $ xyz_app2
  2. 通过运行以下命令,使用名为 more_shtext 的命名共享库区域(两个段都用于共享库文本)运行一对应用程序:
    $ export LDR_CNTRL=NAMEDSHLIB=more_shtext,doubletext32
    $ mybigapp
    $ mybigapp2