在2.6版本以前发布的Linux内核中,Linux线程库叫做LinuxThreads,为glibc2.0以后的GNU C库所支持。该库虽然使用了POSIX API,但是并不真正遵循POSIX标准。从2.6内核开始,Linux引入了NPTL。它比LinuxThreads在性能上有了很大的提高,也更遵循POSIX标准。但是,仅仅使用2.6内核并不等于使用了NPTL。尽管有些发行版会同时携带NPTL和LinuxThreads, 但所有现代的Linux发行版都缺省携带NPTL。
用下面的命令可以查看你的Ubuntu系统上正在使用的POSIX实现:
编辑请注意,该代码中需要翻译的内容为:
(1)“This was returned from SUSE 9.1 installation”翻译成“这是SUSE 9.1返回的结果”
(2)“This was returned from Fedora 2.6.9-1.667 Instatllation”翻译成“翻译成“这是Fedora 2.6.9-1.667返回的结果”
(3)“This was returned from an old RedHat installation” “翻译成“这是一个老版本的RedHat返回的结果”
$ getconf GNU_LIBPATHREAD_VERSION
$ getconf GNU_LIBPATHREAD_VERSION
$ getconf GNU_LIBPATHREAD_VERSION
用下面的方法可以查看正在使用的Linux发行版是用什么编译工具编译链接的。
要找到/bin/ls链接的libpthreads库,如下:
(代码)(P81倒数第14行)
$ ldd /bin/ls |grep libc.so.6
从上面的输出内容可以看到,libc.so.6是和“Native POSIX Threads Library by Ulrich Drepper”一起链接的。
NPTL实现了一对一的线程模型;也就是说,一个用户线程对应一个内核线程。NPTL也实现了POSIX进程间的同步原语,而且线程选项PTHREAD_PROCESS_SHARED也被明确支持了。
3.9.1 最大线程数
在Linux上一个应用程序能够创建的线程最大数量在不同的发行版上是不同的。运行在2个CPU 2GB内存上的SUSE9.1在pthread_create返回EAGAIN错误前允许创建16317个线程。EAGAIN错误的意思是说应用程序可能超过了系统的某些限制。该应用程序创建线程的栈大小为16384,这是创建线程时允许的最大栈大小。在把栈大小设置为16384前,该应用程序会在创建第1021个线程时失败,并返回错误码ENOMEM。任何情况下,8000到16000个线程已经足以满足任何应用程序的需求。
要在Linux上创建大数量的线程,需要先做下面的事情:
1. 创建正确的栈大小(注释17);
2. 检查ulimit(可以输出内存、栈大小限制等的工具),修改对应项或编辑/etc/security/limits.conf文件。
第4、5、6章更详细的讲述了POSIX线程的内容,以及它与NPTL的区别。