- 论坛徽章:
- 0
|
Linux上posix线程库实现原理讨论
下面开始胡说八道了,说说Linux上的posix线程库实现。这个问题困扰我好长时间,从昨天开始才查了一大堆资料,囫囵理解了一些东西,可能bugs非常多的说 :wink:
1, Linux上的posix线程库最初实现是n:1模型,就是没有OS支持的库实现。这也是狭义上的“LinuxPthreads”,它支持2.0及以后的Linux。Linux Kernel Mailing List FAQ上一位Hacker曾大大推崇这种方式,拿来与Solaries的1:1模型相比较并证明这种模型是优秀的。至少拿现在的情况来说他的观点是不正确的。这观点曾让偶糊涂了很久。
2, IBM公司实现的NGPT。它采用M:N模式,好象与第一种的LinuxPthreads合作工作。
3, NPTL。1:1模型。今后Linux平台的POSIX线程库事实上的标准实现。
在2002年8、9月份,一直不肯松劲的Linus Torvalds先生终于被说服了,Ingo Molnar把一些重要特性加入到2.5开发版官方内核中。这些特性大体包括:新的clone系统调用,TLS系统调用,posix线程间信号,exit_group(exit的一个变体),等等。有了OS的支持,Ingo Molnar先生同Ulrich Drepper(glibc的LinuxThreads库的维护者,NPTL的设计者与维护者,现工作于RedHat公司)和其他一些Hackers开始NPTL的完善工作。题外话一句:IBM公司给了他们很大的赞助。
在Linux上,可以用getconf GNU_LIBPTHREAD_VERSION来查看你的posix线程库到底是那一个实现,什么版本。Drepper先生做过测试,据他的测试数据,IA32机器上启动撤销10万个线程,以前的库实现需要15分钟,而NPTL只需要2s。
理论上应当是M:N模型最高效,但是Linux内核提供支持后,反倒是1:1模型的NPTL比M:N的NGPT好要快4倍!为什么会这样呢?目前偶只知道它把环境切换放到用户态了,别的不懂。 |
|