本地POSIX线程库(NPTL)
本地POSIX线程库
在Linux操作系统中,本地POSIX线程库(NPTL)是一种软件特性,它可让Linux的内核,高效地运行那些使用POSIX风格的线程所编写的程序。
测试中,NPTL在一个IA-32处理器上,成功地同时跑了10万个线程,启动这些线程只用了不到2秒。比较起来,在不支持NPTL的内核上,这个测试花费了大约15分钟。
以前(也就是在2.6内核以前),Linux把进程当作其调度实体,内核并不真正支持线程。可是,它提供了一个clone()系统调用——创建一个调用进程的拷贝,这个拷贝与调用者共享地址空间。LinuxThreads项目就是利用这个系统调用,完全在用户级模拟了线程;不幸的是,它与真正的POSIX标准在一致性上面存在大量的问题,在信号处理,任务调度,以及进程间同步原语方面尤为突出。
要改进LinuxThreads,显然需要一些内核方面的支持,并重写线程库。针对于这一需求的两个竞争项目启动了——NGPT,或称下一代POSIX线程,由包括来自IBM的开发者在内的一个团队进行开发;NPTL是由Red Hat的开发者来开发的,两者同时进行。但是,NGPT已在2003年年中就被放弃了。
NPTL的使用与LinuxThreads极为相似,这是由于,其主要的抽象依然被内核认为是一个进程,而且新线程的创建,使用的还是clone()系统调用(来自NPTL的调用)。可是,NPTL需要专有的内核支持来实现在竞争情况下可使线程睡眠或被再唤醒的同步原语。用在这儿的原语,被认为是一个Futex(不要与mutex相混淆)。
NPTL号称是1x1的线程库,这是由于用户所创建的线程(通过pthread_create()库函数)与内核的调度实体(在Linux内是进程)1-1对应。这是最简单的合理线程实现了。一个备选方案是m x n的,就是说用户级线程要多于调度实体,如果以这种方式实现的话,由线程库负责在可用的调度实体上调度用户线程。这会使得线程上下文切换非常的快,因为它避免了系统调用,但是它也增加了复杂性和优先级反转的可能性。
NPTL的第一版发布在Red Hat 9.0中。老式的POSIX线程库众所周知的问题是有些时候线程会拒绝向系统让出控制权,因为这种事情发生时,它得不到让出控制权的机会。还有些事情Windows会做得更好。Red Hat在Java的站点上的一篇关于Java在Red Hat 9上的文章中声称NPTL已经解决了这些问题。
自从Red Hat Enterprise Linux第3版开始,NPTL就已经成为它的一部分,现在它已经完全的集成到Glibc中了。
更多推荐
所有评论(0)