linux编程(3) 2.6内核、Posix兼容性与其他

类别:编程语言 点击:0 评论:0 推荐:
     在最开始我就说了,我刚转入linux刚刚3天,我进入linux下的目的也很明确:我们公司的后台系统网络底层模块目前使用的是我封装的IOCP。我首先就需要将这个IOCP模块移植到LINUX下,用LINUX2.6内核所支持的EPOLL模型来取代,同时还要最大限度地兼容原来的模块接口。
     因为我们开发的是服务器系统,对服务器端程序性能要求比较苛刻,所以传统的select、poll或者预先派生子进程等等网络服务器程序开发模型基本上我们不考虑。从e-donkey的主页上得知,他们采用的EPOLL模型跑在4G内存的LINUX上,支持的最大用户已经超过了280K,由此可见EPOLL的威力,基本上可以断定,他们的服务器使用了SMP。而资料表明,linux 2.6内核至少在以下三个方面对开发大容量高性能并发服务器程序有大的帮助(也许我孤陋寡闻,我目前只关注这三个改进)。
1:NPTL
UNIX传统是没有线程的,线程是后来加入的,所以*nix操作系统从来对线程的支持都不是很好。后来IBM和REDHAT提出了线程模型改进计划,IBM提出的是NGPT,这是一个 m : n的线程模型,REDHAT提出了NPTL,这是一个1:1的线程模型,即一个用户线程对应一个内核线程。从测试效果来看,NPTL性能大大超过了NPTL,IBM现在已经停止了NGPT的开发,只做维护。NPTL已经正式加入到LINUX2.6内核。关于NPTL的性能测试,请参见:http://www-900.ibm.com/developerWorks/cn/linux/l-nptl/index.shtml 总之,性能比传统的linuxthreads提高了很多。

2:新的内核调度器
上面我说了,e-donkey的服务器肯定用了SMP,而linux以前的调度器对多处理器支持得不是很好,Ingo Molnar对此进行了改进,以下是引用自网上的资料:
新的调度器 2.6版本的Linux 内核使用了由Ingo Molnar开发的新的调度器算法,称为O(1)算法,它在高负载的情况下执行得极其出色,
并且当有很多处理器时也可以很好地扩展。
SMP效率:如果有工作需要完成,那么所有处理器都会工作。 等待进程:没有进程需要长时间地等待处理器;同时,没有进程会无端地占用大量的CPU时间。 SMP进程映射:进程只映射到一个CPU而且不会在CPU之间跳跃。 优先级:不重要的任务的优先级低(反之亦然)。 负载平衡:调度器会降低那些超出处理器负载能力的进程的优先级。 交互性能:使用新调度器,即便是在非常高负载的情况下,系统花费很长时间来响应鼠标点击或者键盘输入的情况不会再发生。

处理器支,对于高性能的网络服务器程序来说,SMP基本上是必须的,所以新的调度器对此有利。

3、EPOLL
在2.4内核里,epoll只是作为一个补丁发布,现在在2.6内核里,已经被正式支持收入了内核开发树,根据epoll作者提供的资料以及采用此模型的e-donkey服务器程序,此模型的威力惊人,基本上不逊于WINDOWS的IOCP和FreeBSD的KQUEUE。

POSIX兼容性
在新的2.6内核里,我遇到了一个奇怪的问题,无法使用POSIX的消息队列,明明已经 include <mqueue.h>
但是编译的时候就是说找不到mq_open和mq_unlink这些东西。后来在国外网站上找到资料,原来消息队列已经从传统的linuxthreads中移除,将添加到NPTL中,目前内核还没支持,不过在http://www.kernel.org上已经发布了一个-mm补丁,据说这个补丁解决了这个问题。
在我写程序中,我尽量使用POSIX的标准,一则为了兼容性,而则为了效率。虽然消息队列和信号量这些都有基于SYSTEM V的实现,但是SYSTEM V是80年代初期加入的。很多东西从现在来看,不仅仅使用麻烦,而且效率低下,比如信号灯,SYSTEM V的信号灯就是基于内核的,而POSIX的信号灯是基于内存的, 后者比前者少了在内核和用户模式之间的切换,效率要高,而且使用也非常简单,和WINDOWS下的信号量基本没区别。而且POSIX标准比SYSTEM V的实现大多数要新得多,所以我坚持使用支持POSIX标准的实现。

最后,如果要查看自己的系统是否支持NPTL,可以以如下方式查看:

$ /lib/tls/libc.so.6
GNU C Library 20041006 release version 2.3.4, by Roland McGrath et al.
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 3.3.4 20040623 (Gentoo Linux 3.3.4-r1, ssp-3.3.2-2, pie-8.7.6).
Compiled on a Linux 2.6.8 system on 2004-10-15.
Available extensions:
GNU libio by Per Bothner
crypt add-on version 2.1 by Michael Glad and others
Native POSIX Threads Library by Ulrich Drepper et al
The C stubs add-on version 2.1.2.
BIND-8.2.3-T5B
NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk
Glibc-2.0 compatibility add-on by Cristian Gafton
GNU Libidn by Simon Josefsson
Thread-local storage support included.
For bug reporting instructions, please see:<http://www.gnu.org/software/libc/bugs.html>.

红色的那行字就是,如果看传统的linuxthreads

$ /lib/libc.so.6
GNU C Library 20041006 release version 2.3.4, by Roland McGrath et al.
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 3.3.4 20040623 (Gentoo Linux 3.3.4-r1, ssp-3.3.2-2, pie-8.7.6).
Compiled on a Linux 2.6.8 system on 2004-10-15.
Available extensions:
GNU libio by Per Bothner
crypt add-on version 2.1 by Michael Glad and others
linuxthreads-0.10 by Xavier Leroy
The C stubs add-on version 2.1.2.
BIND-8.2.3-T5B
NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk
Glibc-2.0 compatibility add-on by Cristian Gafton
GNU Libidn by Simon Josefsson
libthread_db work sponsored by Alpha Processor Inc
Thread-local storage support included.
For bug reporting instructions, please see:
<http://www.gnu.org/software/libc/bugs.html>.

如何察看自己的程序时候使用了NPTL,很简单,比如我们编译了某个可执行文件 sem

输入如下命令

$ ldd sem

libpthread.so.0 => /lib/tls/libpthread.so.0 (0x4003d000)
 libc.so.6 => /lib/tls/libc.so.6 (0x42000000)
 libm.so.6 => /lib/tls/libm.so.6 (0x4004a000)
因为NPTL需要TLS支持,所以连接到的库都是TLS下的,如果没连接到TLS下的库,那么程序就没用上NPTL。

本文地址:http://com.8s8s.com/it/it26418.htm