加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux多线程编程和Linux 2.6下的NPTL

发布时间:2016-05-30 15:42:06 所属栏目:Linux 来源:网络整理
导读:这几天由于工作需要,琢磨了一下Linux下的多线程的相关资料。Linux下最常用的多线程支持库为Pthread库,它是glibc库的组成部分。但是关于Pthread的说明文档非常

而在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

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读