AIX 5L 上的共享库内存占用
2008-11-10 08:28:28 来源:WEB开发网请注意,每个进程每次都在相同的地址加载该库。不要为库中的 .o 的构成列表感到困惑。在 AIX 上,您可以共享归档库(通常是 .a 文件)以及动态共享库(通常是 .so 文件)。这样做的目的是能够在链接时绑定符号,就像传统的归档链接,但不需要将构成对象(归档中的 .o 文件)复制到最终二进制映像中。但是,不执行动态(或运行时)符号解析,动态共享库(.so/.sl 文件)也是如此。
还要注意,libpthreads.a 代码部分(那些标记为 read/exec 的部分)被加载到段 0xd 中。如上所述,该段在 AIX 中被指定为预留给共享库代码。也就是说,内核将该共享库的可共享段加载到在同一内核上运行的所有进程所共享的区域。
您可能注意到数据部分也加载到同一段中:共享库段 0xf。但是,这并不表示每个进程也共享 libpthreads.a 的数据部分。这一点没有明确定义(这样的安排方式无法正常工作),因为不同的进程将需要在不同的时间维护不同的数据值。段 0xf 对于每个使用 libpthreads.a 的进程是独立的,即使虚拟内存地址相同也是如此。
svmon 命令可以显示进程在虚拟内存管理器中的段 ID (Vsid)。我们将看到共享库的代码段都具有相同的 Vsid,而共享库的数据段都具有不同的 Vsid。Esid 表示有效段 ID (Effective Segment ID),是位于进程地址空间范围内的段 ID(仅仅是术语,不要为此感到困惑)。
# svmon -P 17314
-------------------------------------------------------------------------------
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd 16MB
17314 dtexec 20245 9479 12 20292 N N N
Vsid Esid Type Description PSize Inuse Pin Pgsp Virtual
0 0 work kernel segment s 14361 9477 0 14361
6c01b d work shared library text s 5739 0 9 5786
19be6 f work shared library data s 83 0 1 87
21068 2 work process private s 56 2 2 58
18726 1 pers code,/dev/hd2:65814 s 5 0 - -
40c1 - pers /dev/hd4:2 s 1 0 - -
#
# svmon -P 20428
-------------------------------------------------------------------------------
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd 16MB
20428 dtlogin 20248 9479 23 20278 N N N
Vsid Esid Type Description PSize Inuse Pin Pgsp Virtual
0 0 work kernel segment s 14361 9477 0 14361
6c01b d work shared library text s 5735 0 9 5782
7869e 2 work process private s 84 2 10 94
parent=786be
590b6 f work shared library data s 37 0 4 41
parent=7531d
6c19b 1 pers code,/dev/hd2:65670 s 29 0 - -
381ae - pers /dev/hd9var:4157 s 1 0 - -
40c1 - pers /dev/hd4:2 s 1 0 - -
4c1b3 - pers /dev/hd9var:4158 s 0 0 - -
更多精彩
赞助商链接