;但是,使用上面的函数或GCC的-nostartfiles选项并不是很好的习惯,因为这可能会产生一些意外的结果。相反,库应该使用__attribute__((constructor))和__attribute__((destructor))函数属性来输出它的构造函数和析构函数。如下所示:
(代码)(P74第21行)
void __attribute__((constructor)) x_init(void)
void __attribute__((destructor)) x_fini(void)
构造函数会在dlopen()返回前或库被装载时(注释16)调用。析构函数会在这样几种情况下被调用:dlclose()返回前,或main()返回后,或装载库过程中exit()被调用时。
3.6 系统调用
系统调用是用户程序请求内核为调用线程或进程提供具体服务的接口。因为UNIX平台上的一些系统调用是与操作系统密切相关的,因此在Linux上可能不存在类似的系统调用。这种情况下,就需要在Linux上实现一个包裹函数(wrapper)。
Linux上系统调用的列表位于/usr/include/asm/unistd.h中。本书的附录部分还对Linux和UNIX系统(如Solaris,HP-UX等)进行了并列比较。
3.7 大页面支持
大页面的应用主要是用来提高应用程序的性能,该类应用程序需要分配大块内存并且频繁访问该内存。性能的提高主要是通过减少地址转换缓冲器 (Translation Lookaside Buffer,简写作TLB,一块虚拟地址到物理地址转换的缓冲区)的未命中次数来实现的。当TLB能够映射更大的虚拟内存范围时,即可减少TLB的未命中次数。因为大部分现代的体系结构支持多种页面大小,上述方法也就可以实现了。例如,Intel 32位架构支持4KB和4MB(PAE模式时为2MB)的页面;Itanium支持多种页面大小:4K,8K,64K,256K,1M,4M,16M和256M;SUN UltraSPARC支持8K,64K,512K和4M的页面;64位PowerPC(ppc64)支持4K,64K,16M和64G的页面。本节内容将告诉应用程序开发人员如何使用Linux内核提供的大页面支持功能。
Linux 2.6内核包含有内建的对hugetlbpage(Linux社区称呼大页面的专用术语)的支持。内核配置成支持hugetlbpage时,命令cat /proc/meminfo的输出会显示出关于hugetlbpage的信息,如下例:
(代码)(P75倒数第8行)
HugePages_Total : 20
HugePages_Free : 20
Hugepagesize: 16384 KB
一种类型为hugetlbfs的文件系统也应该会出现在/proc/filesystems中。在用户空间的应用程序能够使用hugetlbpage支持前,管理员应该先在内核中分配这些大页面。/proc/sys/vm/nr_hugepages的内容显示的是内核中当前配置的大页面的个数。如果要在系统上配置10个大页面,可以用下面的命令:
(代码)(P76第1行)
echo 10 > /proc/sys/vm/nr_hugepages
只有当系统中存在足够的连续物理内存时,分配请求才会成功;只有存在足够多的能够转回到正常内存池的空闲大页面时,释放请求才会成功。用作hugetlbpage的页面在内核中作为保留页面而不能用作其他用途。
应用程序开发人员有两种方法可以使用hugetlbpage支持:
1. 系统V共享内存系统调用(shmget,shmat)
2. mmap系统调用
同一个应用程序也可以两者都使用。
下面的示例程序中,我们给出了如何使用上述系统调用来获得hugetlbpage支持。这些程序来源于/usr/src/linux/Documentation/vm/hugetlbpage.txt。
示例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]
标签: linux