一.概述                                                  

这里以Linux为例。Linux历史上,最开始使用的线程是LinuxThreads,但LinuxThreads有些方面受限于内核的特性,从而违背了SUSV3 Pthreads标准。即它要根据内核的特性来实现线程,有些地方没有遵循统一的标准。后来IBM开发了NGPT(Next Generation POSIX Threads),性能明显优于LinuxThreads,人们曾把它当作LinuxThreads的继任者。但最后,又有一个项目NPTL(Native POSIX Threads Library)出来后,性能更优于NGPT。2002年NGPT项目停止开发,我们现在用的Linux线程就是NPTL。

线程的实现曾有3种模型:

1.多对一(M:1)的用户级线程模型

2.一对一(1:1)的内核级线程模型

3.多对多(M:N)的两级线程模型

上面的x对y(x:y)即x个用户线程对应y个内核调度实体(Kernel Scheduling Entity,这个是内核分配CPU的对象单位)。

LinuxThreads和NPTL都是采用一对一的线程模型,NGPT采用的是多对多的线程模型!!!

二.多对一用户线级程模型                      

多对一线程模型中,线程的创建、调度、同步的所有细节全部由进程的用户空间线程库来处理。用户态线程的很多操作对内核来说都是透明的,因为不需要内核来接管,这意味不需要内核态和用户态频繁切换。线程的创建、调度、同步处理速度非常快。当然线程的一些其他操作还是要经过内核,如IO读写。这样导致了一个问题:当多线程并发执行时,如果其中一个线程执行IO操作时,内核接管这个操作,如果IO阻塞,用户态的其他线程都会被阻塞,因为这些线程都对应同一个内核调度实体。在多处理器机器上,内核不知道用户态有这些线程,无法把它们调度到其他处理器,也无法通过优先级来调度。这对线程的使用是没有意义的!

三.一对一内核极线程模型                      

一对一模型中,每个用户线程都对应各自的内核调度实体。内核会对每个线程进行调度,可以调度到其他处理器上面。当然由内核来调度的结果就是:线程的每次操作会在用户态和内核态切换。另外,内核为每个线程都映射调度实体,如果系统出现大量线程,会对系统性能有影响。但该模型的实用性还是高于多对一的线程模型。

四.多对多两极线程模型                          

多对多模型中,结合了1:1和M:1的优点,避免了它们的缺点。每个线程可以拥有多个调度实体,也可以多个线程对应一个调度实体。听起来好像非常完美,但线程的调度需要由内核态和用户态一起来实现。可想而知,多个对象操作一个东西时,肯定要一些其他的同步机制。用户态和内核态的分工合作导致实现该模型非常复杂。NPTL曾经也想使用该模型,但它太复杂,要对内核进行大范围改动,所以还是采用了一对一的模型!!!

最新文章

  1. 【PRINCE2是什么】PRINCE2认证之七大原则(4)
  2. Java中的泛型
  3. 初识Android && 搭建Android开发环境
  4. 今天装了一个RTI工具
  5. mysql多实例安装脚本
  6. 深入理解Java内存模型(三)——顺序一致性
  7. springmvc(2)--参数绑定
  8. 9更令人兴奋的WebGL演示
  9. C#下如何用NPlot绘制期货股票K线图(3):设计要显示的股票价格图表窗口并定义相应类的成员及函数
  10. centos7 更改语言
  11. Android(java)学习笔记233: 远程服务的应用场景(移动支付案例)
  12. BestCoder Round #3 A,B
  13. 运用Python语言编写获取Linux基本系统信息(二):文件系统使用情况获取
  14. libevent简单介绍和使用
  15. java 工厂的变形模拟的各种应用
  16. Aop初步了解
  17. 脑残手贱:被NFS祸害的调度系统
  18. 揽货最短路径解决方案算法 - C# 蚁群优化算法实现
  19. 20190312 Windows安装Kafka
  20. 【BZOJ2724】【Violet 6】蒲公英

热门文章

  1. Spring IOC之容器概述
  2. Android Intent 三解决
  3. C#边边角角(一)
  4. 64位平台支持大于2 GB大小的数组
  5. 了解mongoDB存储结构
  6. WCF基于MSMQ的事件代理服务
  7. sequence diagram
  8. last error : SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate veri
  9. VMware上安装ubuntu 13.04
  10. Prolog学习:基本概念 and Asp.net与Dojo交互:仪器仪表实现