线程实现模型

线程实现有3种不同模型,这3种实现模型的差异主要集中在线程如何与内核调度实体(KSE,Kernel Scheduling Entity)相映射。KSE是内核分配CPU以及其他资源的(对象)单位。

模型一:多对一(M:1)实现(用户级线程)

在M:1线程实现中,关乎线程创建、调度以及同步(互斥量的锁定,条件变量的等待等)的所有的细节全部由进程内用户空间(user-space)的线程库来处理。对于进程中存在的多个线程,内核一无所知。M:1实现的优势不多,其中最大的有点在于,许多线程操作(例如线程的创建和终止、线程上下文间的切换、互斥量以及条件变量操作)速度都很快,因为无需切换到内核模式。此外,由于线程库无需内核支持,所以M:1实现在系统间的移植相对要容易一些。

不过,M:1实现也存在一些严重缺陷。

  • 当一线程发起系统调用(如read)时,控制由用户空间的线程库转给内核。这就意味着,如果read()调用遭到阻塞,那么所有的线程都会被阻塞。
  • 内核无法调度进程中的这些线程。因为内核并不知晓进程中存在这些线程,也就无法在多处理器平台上将各线程调度给不同的处理器。另外,也不可能将一进程中某线程的优先级调整为高于其他进程中的线程,这是没有意义的,因为对线程的调度完全在进程中处理。

模型二:一对一(1:1)实现(内核级线程)

在1:1线程实现中,每一线程映射一个单独的KSE。内核分别对每个线程做调度处理。线程同步操作通过内核系统调用实现。

1:1实现消除了M:1实现的种种弊端。遭阻塞的系统调用不会导致进程的所有线程被阻塞,在多处理器硬件平台上,内核还可以将进程中的多个线程调度到不同的CPU上。

不过,因为需要切换到内核模式,所以诸如线程创建,上下文切换以及同步操作就要满一些。另外,为每个线程分别维护一个KSE也需要开销,如果应用程序包含大量线程,则可能对内核调度器造成严重的负担,降低系统的整体性能。

尽管有这些缺点,1:1实现通常更胜于M:1实现。LinuxThreads和NPTL都采用1:1模型。

模式三:多对多(M:N)实现(两级模型)

M:N实现旨在结合1:1和M:1模型的优点,避免二者的缺点。

在M:N模型中,每个进程都可拥有多个与之相关的KSE,并且也可以把多个线程映射到一个KSE。这种设计允许内核将同一应用的线程调度到不同的CPU上运行,同时也解决了随线程数量而放大的性能问题。

M:N模型的最大问题是过于复杂。线程调度任务由内核及用户空间的线程库共同承担,二者之间势必要进行分工协作和信息交换。在M:N模型下,按照SUSv3标准要求来管理信号也极为复杂。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值