【2018-07-19】Linux线程模型NPTL简单笔记
[历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2018-07-19 标题Linux线程模型NPTL简单笔记分类编程 标签linux·thread·nptlLinux线程NPTL简单笔记历史设计参考链接《 https://blog.csdn.net/ttomqq/article/details/53172504 》《 https://www.ibm.com/developerworks/cn/linux/l-threading.html 》POSIX Thread Library (NPTL)使Linux内核可以非常有效的运行使用POSIX线程标准写的程序。这里有一个测试数据在32位机下NPTL成功启动100000个线程只用了2秒而不使用NPTL将需要大约15分钟左右的时间。历史在内核2.6以前的调度实体都是进程内核并没有真正支持线程。它是能过一个系统调用clone()来实现的这个调用创建了一份调用进程的拷贝跟fork()不同的是,这份进程拷贝完全共享了调用进程的地址空间。LinuxThread就是通过这个系统调用来提供线程在内核级的支持的(许多以前的线程实现都完全是在用户态内核根本不知道线程的存在)。非常不幸的是这种方法有相当多的地方没有遵循POSIX标准特别是在信号处理调度进程间通信原语等方面。很显然为了改进LinuxThread必须得到内核的支持并且需要重写线程库。为了实现这个需求开始有两个相互竞争的项目IBM启动的NGTP(Next Generation POSIX Threads)项目以及Redhat公司的NPTL。在2003年的年中IBM放弃了NGTP也就是大约那时Redhat发布了最初的NPTL。NPTL最开始在redhat linux 9里发布现在从RHEL3起内核2.6起都支持NPTL并且完全成了GNU C库的一部分。设计NPTL使用了跟LinuxThread相同的办法在内核里面线程仍然被当作是一个进程并且仍然使用了clone()系统调用(在NPTL库里调用)。但是NPTL需要内核级的特殊支持来实现比如需要挂起然后再唤醒线程的线程同步原语futex.NPTL也是一个1*1的线程库就是说当你使用pthread_create()调用创建一个线程后在内核里就相应创建了一个调度实体在linux里就是一个新进程这个方法最大可能的简化了线程的实现。除NPTL的1*1模型外还有一个m*n模型通常这种模型的用户线程数会比内核的调度实体多。在这种实现里线程库本身必须去处理可能存在的调度这样在线程库内部的上下文切换通常都会相当的快因为它避免了系统调用转到内核态。然而这种模型增加了线程实现的复杂性,并可能出现诸如优先级反转的问题此外用户态的调度如何跟内核态的调度进行协调也是很难让人满意。