Linux多线程编程和Linux 2.6下的NPTL
而在IA-32硬件结构中,出现了对线程寄存器的支持,因此Pthread的线程上下文切换速度有了很大提高。但是由于硬件限制局限,线程的数量必须小于8192个,反正我是觉得已经很多了。 于是从2.5代码开始Linux内核采用了NPTLNative Posix Thread Library)方式。NPTL的设计思想初稿可参考nptl-design.pdf(http://people.redhat.com/drepper/nptl-design.pdf) 首先在IA-32和x86-64位体系结构上能实现任意数量的线程数量。通过引入了TLS系统调用可以建立多个GDT全局描述符表,每个cpu维护一个描述符表,每个表项存放一个线程。 其次,clone系统调用优化了线程的建立和结束功能。也不再需要额外的调度线程的帮助就可以回收线程资源了。 其三,信号投递由内核完成,而不再需要额外的用户态管理线程的帮助,而严重错误信号之间结束整个进程。 其四,引入了新的退出系统调用exit_group()。原来的exit保留用于退出单个线程,exit_group用于退出整个进程。 其五, 新的exec调用会先结束到一个进程中的所有线程后再载入新程序的执行,而不是只结束调用的线程。 其六,所有线程的资源使用情况(cpu资源,内存资源)会报告给整个进程,而不再是只报告给初始化线程 其七,proc文件系统中只显示初始化线程的信息,而不再是所有线程的信息(上万个线程会把proc文件系统拖死) 其八, 支持线程脱离, 执行Pthread_join的线程不需要再执行no wait。 其九,由内核来维护初始化线程(变成内核线程了),并在proc文件系统中显示其状态,并维护直到所有线程退出来保证信号的投递。 其十,内核支持无限制的线程数量。 最后,允许pthread_join在子线程已死之后返回,即pthread_join的返回和子线程状态变成异步的了,提高了性能。 根据报告,NPTL中线程的启动和中止时间消耗只有Linuxthread的大约1/8,当线程数量急遽增加的时候,消耗时间的差异更加明显。 在线程间同步试验中,频繁进出临界区的时间消耗只有原来的一半。 更多的用户测试报告可以看 http://kerneltrap.org/node/422 (编辑:应用网_丽江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |