NPTL, NGPT

NPTL, NGPT

 

NPTL
在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。
  NPTL号称是1×1的线程库,这是由于用户所创建的线程(通过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中了。

LinuxThreads 和 NPTL
LinuxThreads 项目最初将多线程的概念引入了 Linux®,但是 LinuxThreads 并不遵守 POSIX 线程标准。尽管更新的 Native POSIX Thread Library(NPTL)库填补了一些空白,但是这仍然存在一些问题。本文为那些需要将自己的应用程序从 LinuxThreads 移植到 NPTL 上或者只是希望理解有何区别的开发人员介绍这两种 Linux 线程模型之间的区别。

当 Linux 最初开发时,在内核中并不能真正支持线程。但是它的确可以通过 clone() 系统调用将进程作为可调度的实体。这个调用创建了调用进程(calling process)的一个拷贝,这个拷贝与调用进程共享相同的地址空间。LinuxThreads 项目使用这个调用来完全在用户空间模拟对线程的支持。不幸的是,这种方法有一些缺点,尤其是在信号处理、调度和进程间同步原语方面都存在问题。另外,这个线程模型也不符合 POSIX 的要求。

要改进 LinuxThreads,非常明显我们需要内核的支持,并且需要重写线程库。有两个相互竞争的项目开始来满足这些要求。一个包括 IBM 的开发人员的团队开展了 NGPT(Next-Generation POSIX Threads)项目。同时,Red Hat 的一些开发人员开展了 NPTL 项目。NGPT 在 2003 年中期被放弃了,把这个领域完全留给了 NPTL。

尽管从 LinuxThreads 到 NPTL 看起来似乎是一个必然的过程,但是如果您正在为一个历史悠久的 Linux 发行版维护一些应用程序,并且计划很快就要进行升级,那么如何迁移到 NPTL 上就会变成整个移植过程中重要的一个部分。另外,我们可能会希望了解二者之间的区别,这样就可以对自己的应用程序进行设计,使其能够更好地利用这两种技术。

本文详细介绍了这些线程模型分别是在哪些发行版上实现的。

LinuxThreads 设计细节

线程 将应用程序划分成一个或多个同时运行的任务。线程与传统的多任务进程 之间的区别在于:线程共享的是单个进程的状态信息,并会直接共享内存和其他资源。同一个进程中线程之间的上下文切换通常要比进程之间的上下文切换速度更快。因此,多线程程序的优点就是它可以比多进程应用程序的执行速度更快。另外,使用线程我们可以实现并行处理。这些相对于基于进程的方法所具有的优点推动了 LinuxThreads 的实现。

LinuxThreads 最初的设计相信相关进程之间的上下文切换速度很快,因此每个内核线程足以处理很多相关的用户级线程。这就导致了一对一线程模型的革命。

让我们来回顾一下 LinuxThreads 设计细节的一些基本理念:

• LinuxThreads 非常出名的一个特性就是管理线程(manager thread)。管理线程可以满足以下要求:

o 系统必须能够响应终止信号并杀死整个进程。

o 以堆栈形式使用的内存回收必须在线程完成之后进行。因此,线程无法自行完成这个过程。

o 终止线程必须进行等待,这样它们才不会进入僵尸状态。

o 线程本地数据的回收需要对所有线程进行遍历;这必须由管理线程来进行。

o 如果主线程需要调用 pthread_exit(),那么这个线程就无法结束。主线程要进入睡眠状态,而管理线程的工作就是在所有线程都被杀死之后来唤醒这个主线程。

• 为了维护线程本地数据和内存,LinuxThreads 使用了进程地址空间的高位内存(就在堆栈地址之下)。

转自:http://hi.baidu.com/brianxj/blog/item/7da29e2f1d7386341e308901.html

转载于:https://www.cnblogs.com/fly-fish/archive/2011/10/09/2203593.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/110544.html原文链接:https://javaforall.net

(0)
上一篇 2021年8月14日 上午8:36
下一篇 2021年8月14日 上午9:00


相关推荐

  • 结构体和类使用的区别

    结构体和类使用的区别前段时间写推力叠加时遇到的一个问题 我当时最开始是用两个列表分别存储由推力和方向得到的速度 速度的持续时间 下标一一对应 后来觉得可以用结构体来存储速度和持续时间 这样就只需要一个列表管理就可以了 能少用一次遍历 同时更好的面向对象吧 然后用结构体改的时候却发现结构体里的字段不能直接用来加等减等运算 因为结构体里的字段是放在栈里的 为值类型 后来就把结构体改成类解决了这个问题 因为类的存储是在堆里

    2026年3月19日
    0
  • Kimi K2.5— 月之暗面kimi开源的全新一代全能旗舰模型

    Kimi K2.5— 月之暗面kimi开源的全新一代全能旗舰模型

    2026年3月12日
    2
  • sql注入攻击的原理(sql注入攻击防范)

    sql注入攻击的原理(sql注入攻击防范)SQL 注入 SQLi 是一种可执行恶意 SQL 语句的注入攻击 这些 SQL 语句可控制网站背后的数据库服务 攻击者可利用 SQL 漏洞绕过网站已有的安全措施 他们可绕过网站的身份认证和授权并访问整个 SQL 数据库的数据 他们也可利用 SQL 注入对数据进行增加 修改和删除操作 SQL 注入可影响任何使用了 SQL 数据库的网站或应用程序 例如常用的数据库有 MySQL Oracle SQLServer 等等 攻击者利用它 便能无需授权地访问你的敏感数据 比如 用户资料 个人数据 商业机密 知识产

    2026年3月17日
    2
  • fiddler和charles哪个好用_charles手机设置代理后上不了网

    fiddler和charles哪个好用_charles手机设置代理后上不了网前言Charles是收费软件,可以免费试用30天。试用期过后,未付费的用户仍然可以继续使用,但是每次使用时间不能超过30分钟,并且启动时将会有10秒种的延时。此时,我们只需网上找一个注册码即可解

    2022年7月28日
    12
  • XILINX_linux基本命令的使用

    XILINX_linux基本命令的使用petalinux-v2018.2rootfs配置开发用到的常用工具,使能如下选项,FilesystemPackages→base→util-linuxutil-linux-mkfsFilesystemPackages→base→e2fsprogs [*]e2fsprogs []e2fsprogs-dev…

    2025年11月1日
    5
  • pycharm自动导入包_python自动到包快捷键

    pycharm自动导入包_python自动到包快捷键在终端通过pip装好包以后,在pycharm中导入包时,依然会报错。新手不知道具体原因是什么,我把我的解决过程发出来。解决方案一:在Pycharm中,依次打开File—>Settings,弹窗如下图:点击右侧“+”号,输入自己需要导入包的名称,在下面列表中可以看到自己需要的包,详图如下:最后点击InstallPackage,等待安装完成即可。解决方案二:前提是已经在终端通过pipin…

    2022年8月28日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号