Ubuntu Linux---GNU libc库( 五 )


示例3-2中,应用程序使用系统V共享内存系统调用来申请由大页面保留的256M内存 。shmget系统调用使用SHM_HUGETLB标志告诉内核申请的是大页面 。
(代码)(P76-78)
对ia86架构,内核为大页面保留了一个特定的内存区域 。也就是说,调用进程必须指定某一个固定的地址 。但对i386,x86_64,和ppc64不需要一个固定的地址 。
你也可能需要把每个共享内存段的最大大小增大到256MB 。这可以用下面的命令实现:
(代码)(P78第26行)
echo 268435456 > /proc/sys/kernel/shmmax
还需要关注的另一个限制是/proc/sys/kernel/shmall,它显示的是系统中可以创建的共享内存的总页数 。
mmap system call
这种情况下,需要管理员首先挂载一个hugetlbfs类型的文件系统,然后在该挂载点上创建的所有文件都保存在大页面上 。
(代码)(P78第33行)
mount none /mnt/huge t hugetlbfs o uid=1000,gid=100
上述命令在目录/mnt/huge上挂载一个hugetlbfs类型的文件系统,并把该文件系统的根目录的所有者和组分别设置成1000和100 。程序3-3给出了一个使用mmap系统调用申请由大页面保留的256MB内存的示例 。
(代码)(P79-80)
注意,对hugetlbfs文件系统上的文件,read和write系统调用是不支持的 。通常的chown,chgrp和chmod(如果有权限的话)可以用来改变hugetlbfs文件系统上文件的属性 。
上一页;;[1];[2];[3];[4];[5]
;3.1.1 glibc遵循的标准
GNU glibc发布了一个描述其所遵循的标准的报告(注释6) 。该报告同时也列出了GNU libc需要改进的地方 。写作本书时,该报告显示GNU libc通过了FIPS POSIX90、POSIX96、UNIX98、ANSI、C89/99,和ISO9899标准的头文件一致性检查 。所有主要Linux发行版的glibc也都遵循LSB规范 。
3.2 GNU科学库
把进行高性能计算的应用程序移植到Linux上需要一个支持库,该库要与UNIX平台上的科学库非常匹配 。Linux上类似的库叫GNU科学库(GNU Scientific Library,简写作GSL) 。GSL是一系列数学运算例程的集合 。这些例程是用C语言重新编写的,并且给编程人员提供了一个新式的API模式---允许编程人员为各高级语言编写包裹函数(wrapper) 。这些源代码使用的是GPL发布许可 。
GNU科学库包含了数学运算领域的很多内容 。表3-3列出了GNU科学库提供的例程 。
;这些例程的用法在GSL手册(注释7)中有详尽的描述,包括函数的定义、示例程序,以及函数实现的算法所引用的论文 。
3.3 共享库
我们所移植过的大多数应用程序都使用了共享库 。然而,不同的操作系统在创建和命名共享库时却不尽相同 。Linux上,共享库可以有不同的文件扩展名,例如,共享库可以以.so或.so.1.0结束 。以.so.x.x(x为数字)结尾的共享库叫版本化库 。第一个数字代表大版本号,第二个数字代表小版本号 。有些情况下,共享库的扩展名还可以是.so.x.x.x(x为数字)的形式,这里最后一个数字代表发布号,并且是可选的 。下面给出了共享库文件名的格式:
(代码)p58 第11行,lib.so...
大版本号、小版本号,以及发布号的变化反映了对共享库所作的不同类型的修改 。下面是对增大大版本号、小版本号和发布号的一些指导:
- 当对共享库提供的接口做了与以前版本不兼容的改变时,需要增大大版本号 。这个大的改变意味着依赖该库先前大版本的应用程序需要作相应修改才能使用大版本更新后的库 。
- 当共享库增加了新的接口同时也保留了原来的接口时,增大小版本号 。
- 当作了与以前兼容的修改又没有增加新接口时,增大发布号 。这通常是对一些实现做了改动以提高性能和扩展性 。
要在Linux上创建共享库,使用-shared编译参数;该参数告诉GNU ld创建一个共享库而不是应用程序 。下面是这样一个例子:

推荐阅读