Linux线程比较:LinuxThreads 和NPTL( 三 )
Ulrich Drepper 和 Ingo Molnar 是 Red Hat 参与 NPTL 设计的两名员工 。他们的总体设计目标如下:
这个新线程库应该兼容 POSIX 标准 。
;这个线程实现应该在具有很多处理器的系统上也能很好地工作 。
;为一小段任务创建新线程应该具有很低的启动成本 。
;NPTL 线程库应该与 LinuxThreads 是二进制兼容的 。注意,为此我们可以使用 LD_ASSUME_KERNEL,这会在本文稍后进行讨论 。
;这个新线程库应该可以利用 NUMA 支持的优点 。NPTL 的优点
与 LinuxThreads 相比,NPTL 具有很多优点:
NPTL 没有使用管理线程 。管理线程的一些需求,例如向作为进程一部分的所有线程发送终止信号,是并不需要的;因为内核本身就可以实现这些功能 。内核还会处理每个线程堆栈所使用的内存的回收工作 。它甚至还通过在清除父线程之前进行等待,从而实现对所有线程结束的管理,这样可以避免僵尸进程的问题 。
;由于 NPTL 没有使用管理线程,因此其线程模型在 NUMA 和 SMP 系统上具有更好的可伸缩性和同步机制 。
;使用 NPTL 线程库与新内核实现,就可以避免使用信号来对线程进行同步了 。为了这个目的,NPTL 引入了一种名为 futex 的新机制 。futex 在共享内存区域上进行工作,因此可以在进程之间进行共享,这样就可以提供进程间 POSIX 同步机制 。我们也可以在进程之间共享一个 futex 。这种行为使得进程间同步成为可能 。实际上,NPTL 包含了一个 PTHREAD_PROCESS_SHARED 宏,使得开发人员可以让用户级进程在不同进程的线程之间共享互斥锁 。
;由于 NPTL 是 POSIX 兼容的,因此它对信号的处理是按照每进程的原则进行的;getpid() 会为所有的线程返回相同的进程 ID 。例如,如果发送了 SIGSTOP 信号,那么整个进程都会停止;使用 LinuxThreads,只有接收到这个信号的线程才会停止 。这样可以在基于 NPTL 的应用程序上更好地利用调试器,例如 GDB 。
;由于在 NPTL 中所有线程都具有一个父进程,因此对父进程汇报的资源使用情况(例如 CPU 和内存百分比)都是对整个进程进行统计的,而不是对一个线程进行统计的 。
;NPTL 线程库所引入的一个实现特性是对 ABI(应用程序二进制接口)的支持 。这帮助实现了与 LinuxThreads 的向后兼容性 。这个特性是通过使用 LD_ASSUME_KERNEL 实现的,下面就来介绍这个特性 。LD_ASSUME_KERNEL 环境变量
正如上面介绍的一样,ABI 的引入使得可以同时支持 NPTL 和 LinuxThreads 模型 。基本上来说,这是通过 ld (一个动态链接器/加载器)来进行处理的,它会决定动态链接到哪个运行时线程库上 。
举例来说,下面是 WebSphere?Application Server 对这个变量所使用的一些通用设置;您可以根据自己的需要进行适当的设置:
LD_ASSUME_KERNEL=2.4.19:这会覆盖 NPTL 的实现 。这种实现通常都表示使用标准的 LinuxThreads 模型,并启用浮动堆栈的特性 。LD_ASSUME_KERNEL=2.2.5:这会覆盖 NPTL 的实现 。这种实现通常都表示使用 LinuxThreads 模型,同时使用固定堆栈大小 。我们可以使用下面的命令来设置这个变量:
export LD_ASSUME_KERNEL=2.4.19
注意,对于任何 LD_ASSUME_KERNEL 设置的支持都取决于目前所支持的线程库的 ABI 版本 。例如,如果线程库并不支持 2.2.5 版本的 ABI,那么用户就不能将 LD_ASSUME_KERNEL 设置为 2.2.5 。通常,NPTL 需要 2.4.20,而 LinuxThreads 则需要 2.4.1 。
如果您正运行的是一个启用了 NPTL 的 Linux 发行版,但是应用程序却是基于 LinuxThreads 模型来设计的,那么所有这些设置通常都可以使用 。
GNU_LIBPTHREAD_VERSION 宏
大部分现代 Linux 发行版都预装了 LinuxThreads 和 NPTL,因此它们提供了一种机制来在二者之间进行切换 。要查看您的系统上正在使用的是哪个线程库,请运行下面的命令:
推荐阅读
- 国家Linux技术水平认证项目正式启动
- Linux命令:改变文件或目录的访问权限
- 红帽Linux获美国政府最高安全等级认证
- Linux终端下的强大工具screen的认识
- 黑米和什么一起搭配煮粥比较好
- Linux 认证,我们到底该去考不考?
- Linux的LUPA认证考试系统beta2发布
- Linux认证能帮助你找到一份好工作吗?
- Linux系统通过手机GPRS上网设置简介
- Ubuntu Linux---GNU libc库