多线程编程之二:线程模型
来源:互联网 发布:汉字简化 知乎 编辑:程序博客网 时间:2024/05/21 03:26
###Date:2017/10/29
转载自:http://www.cnblogs.com/yuuyuu/p/5139620.html
一.概述
这里以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曾经也想使用该模型,但它太复杂,要对内核进行大范围改动,所以还是采用了一对一的模型!!!
- 多线程编程之二:线程模型
- intel2011多线程编程大赛之二 K-对单线程
- iOS-多线程编程学习之pthread创建线程(二)
- Linux多线程编程(二)线程同步之条件变量
- 多线程编程之二
- 多线程编程之二
- 网络编程模型综述 之 多线程模型
- 多线程编程模型之服务器/客户端模型
- 多线程之二 线程同步
- 多线程之二:线程同步
- 多线程编程之线程取消
- 多线程编程之线程通信
- 线程研究(二):多线程编程 .net 2
- 多线程编程(二)--进程&&线程
- 多线程编程(二)--进程&&线程
- 多线程编程摘录(二): 线程管理(1)
- 多线程编程摘录(二): 线程管理(2)
- 多线程编程摘录(二): 线程管理(3)
- js 产生规定范围里的随机数
- 如何实用github打造博客专属域名
- 面向对象语言的四大基本特征
- 从JAVA导出数据到Excel
- Java后台判断是否有中文
- 多线程编程之二:线程模型
- Java实现操作Memcache缓存数据库
- Spring Boot干货——(番外篇一)jar包的部署及运行
- 手机号码靓号匹配
- SpannableString与SpannableStringBuilder
- iOS webview尾部加自定义view,并且有个黑条
- 楼市监管持续轰炸,二线城市买房人哭了出来
- InputStream的avaliable()方法
- HTML5权威指南笔记:20-使用盒模型