linux thread model . Linux上posix线程库实现原理讨论
http://blog.csdn.net/fanbird2008/article/details/6752853
Linux上posix线程库实现原理讨论
说明一下,这个问题困扰我好长时间,因为正如使用C编程会希望了解进程的内存映象一样,使用POSIX线程库我们也会想去了解其实现的原理。目前只是查过一些资料,或许仍然有误解的地方,请大家继续指正 :)
首先我们需要了解线程(threads)是个什么概念。在传统UNIX中,进程(process,就是Intel所谓的task)是调度的最小单位,复杂的大型软件往往需要有多个进程,fork+exev是很常用的技巧。但是随着需求的扩大,特别是网络服务的复杂性增长,fork的开销就成为一个瓶颈问题。为此产生了vfork和copy-on-write技术,都是为了减小fork的开销。
pthreads的引入也是为了解决fork开销问题,同时能够支持SMP(对称多处理器)。在SMP机器上,一个进程内的多个线程可以分布在各个处理器上并行运行。
由于历史原因,2.5.x以前的linux对pthreads没有提供内核级的支持,所以在linux上的pthreads实现只能采用n:1的方式,也称为库实现。下面先说一下pthreads的3种实现方式。
Linux上posix线程库实现原理讨论
pthreads的实现有3种方式: 这种实现没有OS的支持,线程对OS来说是不可见的,OS不知道线程的存在与否,也不负责对它们进行调度。所有的此类工作由线程库来完成。 |
Linux上posix线程库实现原理讨论
第二种,1:1模式。(好象Solaries就是这种模式?) 1:1模式中,每个线程对应存在一个内核线程。也就是说,OS知道每个线程的生老病死,对它们进行调度。 下面是1:1模式的示意图: |
Linux上posix线程库实现原理讨论
第三种,M:N模式。 简单的说,M:N模型的OS级调度上,跟1:1模型相似;线程间调度上,跟n:1模型相似。 优点是,既可以在进程内利用SMP的优势,又可以节省系统空间内存的消耗,而且环境切换大多在用户态完成。 下面是M:N模型的示意图: |
Linux上posix线程库实现原理讨论
下面开始胡说八道了,说说Linux上的posix线程库实现。这个问题困扰我好长时间,从昨天开始才查了一大堆资料,囫囵理解了一些东西,可能bugs非常多的说 :wink: 1, Linux上的posix线程库最初实现是n:1模型,就是没有OS支持的库实现。这也是狭义上的“LinuxPthreads”,它支持2.0及以后的Linux。Linux Kernel Mailing List FAQ上一位Hacker曾大大推崇这种方式,拿来与Solaries的1:1模型相比较并证明这种模型是优秀的。至少拿现在的情况来说他的观点是不正确的。这观点曾让偶糊涂了很久。 2, IBM公司实现的NGPT。它采用M:N模式,好象与第一种的LinuxPthreads合作工作。 3, NPTL。1:1模型。今后Linux平台的POSIX线程库事实上的标准实现。 在Linux上,可以用getconf GNU_LIBPTHREAD_VERSION来查看你的posix线程库到底是那一个实现,什么版本。Drepper先生做过测试,据他的测试数据,IA32机器上启动撤销10万个线程,以前的库实现需要15分钟,而NPTL只需要2s。 理论上应当是M:N模型最高效,但是Linux内核提供支持后,反倒是1:1模型的NPTL比M:N的NGPT好要快4倍!为什么会这样呢?目前偶只知道它把环境切换放到用户态了,别的不懂。 |
Linux上posix线程库实现原理讨论
支持一下,正在学习MP!后面的继续! |
Linux上posix线程库实现原理讨论
参考: P.S. 我觉得《情景分析》有一个错误,作者在介绍进程时说, 红色部分显然是错误的。pthreads的必要行完全不能由内核线程取代。事实上,倘若这句话正确,pthreads就变成多余的了 :) |
Linux上posix线程库实现原理讨论
急需HP-UX下acc的fork, execl的相关知识,我是初学,亟盼任何回复。 jjcao@dl.cn |
Linux上posix线程库实现原理讨论
问一句,为什么不是kernel process 对应一组属于这个process的thread? |
Linux上posix线程库实现原理讨论
倘若是库实现那就会象你说的那样。 |
Linux上posix线程库实现原理讨论
1:1的这种形式是不是为了以空间换时间?如果N:M的话就需要有一个调度的算法,会降低效率? |
Linux上posix线程库实现原理讨论
问楼主一个使用上的问题: |
Linux上posix线程库实现原理讨论
-->不好意思,我一直都是设为NULL让实现自己默认的,没用过这些特性。 |
Linux上posix线程库实现原理讨论
关于M:N的问题 |
Linux上posix线程库实现原理讨论
柳兄正好请教个问题,线程的stack是在HEAP区 吗? |
Linux上posix线程库实现原理讨论
user thread的stackS(除了MAIN THREAD外,都在HEAP里面,这里的THREAD LIB在HEAP可以理解成是UNI-PROCESS自己的HEAP空间上开辟的BUFFER). |
Linux上posix线程库实现原理讨论
>;>;user thread的stackS(除了MAIN THREAD外,都在HEAP里面, |
Linux上posix线程库实现原理讨论
呵呵,是从进程栈那往heap方向生长的 |
Linux上posix线程库实现原理讨论
再问一个问题,系统对于栈的保护是什么意思?比如由于什么原因栈空间不够了,这个时候系统做些什么动作呢?难道是仅仅发个栈溢出信号然后让程序死掉? |
Linux上posix线程库实现原理讨论
STACK和HEAP向两个相反方向扩展,当STACK超过他的SIZE限制,或者STACK到达HEAP的边界时候,MEMORY不够,程序退出. |
linux thread model . Linux上posix线程库实现原理讨论相关推荐
- linux thread model
Linux上posix线程库实现原理讨论 说明一下,这个问题困扰我好长时间,因为正如使用C编程会希望了解进程的内存映象一样,使用POSIX线程库我们也会想去了解其实现的原理.目前只是查过一些资料,或许 ...
- POSIX线程库(一)创建第一个pthread线程
对于这个简单的示例,步骤非常简单:创建线程-线程退出-同步退出. 对于POSIX线程相关的函数,无论是变量,还是属性,凡是有要使用的,一般都将会传入对象的地址,目前只有pthread_joint除外, ...
- linux 多线程并行计算,Linux下使用POSIX Thread作多核多线程并行计算
POSIX线程库根据处理器.操作系统等特性封装了一台线程处理的接口.对于目前基于x86处理器架构的Linux系统来说,它往往会默认地将新创建的一个线程调度到与主线程不同的核中执行,如果这样能更好地平衡 ...
- Linux系统编程36:多线程之线程控制之pthread线程库(线程创建,终止,等待和分离)
文章目录 (1)POSIX线程库 (2)pthread_create--创建线程 A:关于Linux线程的再理解 B:线程ID及地址空间布局 (3)pthread_exit--线程终止 (4)pthr ...
- linux服务器开发二(系统编程)--线程相关
线程概念 什么是线程 LWP:Light Weight Process,轻量级的进程,本质仍是进程(在Linux环境下). 进程:独立地址空间,拥有PCB. 线程:也有PCB,但没有独立的地址空间(共 ...
- 【Linux】多线程(上)
本文详细介绍了多线程的常见概念 生产者消费者模型将在多线程(下)继续讲解 欢迎大家指正 提起讨论进步啊 目录 多线程的理解 线程的优点 线程的缺点: 线程的用途 线程VS进程 用户级线程库 POSIX ...
- linux futex 进程同步,Linux的新式线程同步原语——Futex
在我的上一篇文章<本地POSIX线程库>中,提到了Futex一词,发现好多读者误以为这是我的笔误,将Mutex错写为Futex了.其实Futex是Linux的一种全新的线程同步原语.本文将 ...
- linux wap,在 Linux 上构建 WAP 网关(初级)
Webme09.cublog.cngoogle 在 Linux 上构建 WAP 网关(初级) | 2005-01-27 14:09 实现移动服务的最热门技术是无线应用协议(Wirele ...
- Linux多线程实践(四 )线程的特定数据
在单线程程序中.我们常常要用到"全局变量"以实现多个函数间共享数据, 然而在多线程环境下.因为数据空间是共享的.因此全局变量也为全部线程所共同拥有.但有时应用程序设计中有必要提供线 ...
最新文章
- python的openpyxl模块下载_python解析.xls/.xlsx文件–openpyxl模块(第三方)
- 微信小程序分析送积分功能如何实现_微信小程序如何做出一个积分系统?
- 甘肃2019年9月计算机二级报名入口,2019年9月甘肃计算机二级考试成绩查询入口...
- 推荐两本移动开发挺火的书
- iredmail邮件服务器之修改默认的web服务端口号
- 【java学习之路】(javaWeb篇)001.HTML
- 引入Hub再生的最短帧长及主机之间距离的最大值计算
- 利用ffmpeg解析视频文件信息
- 通达信画线文件是在服务器吗,通达信画线工具的使用说明★★★★
- 20220117 matlab 全局变量调试
- ffmpeg实时传输视频_使用ffmpeg和DirectX 11流式传输视频
- UE4 控制开关门基础之一
- Win10环境下完美卸载MySQL
- 免费ftp服务器,盘点三款好用的免费ftp服务器
- 请为横线处选择合适的程序使得程序的运行结果是123 ( )
- 电机速度rpm转换成轮子的速度
- h5唤起app,清除timeout
- 国内外dspace著名案例
- 在AS中引用第三方java类库含源代码包
- 陪伴是最长情的告白,民生保险“链”接万家告白征集
热门文章
- 学习Python有哪些好处?
- 用InternetOpen()的下载文件
- C# Task的各种用法和详解(推荐,精)
- 允许Traceroute探测
- linux下i2c与pca9555通信,pca9555(i2c-gpio扩展)应用层测试代码
- 2020CSP-S游记
- Python读取docx文档的内容
- java判断telnet通不通_(转)测试端口通不通(四种方法)
- Kotlin中的集合函数
- 2823-44-1,2,3,4,6-TETRA-O-ACETYL-ALPHA-D-MANNOPYRANOSYL FLUORIDE,2,3,4,6-四邻乙酰基-alpha-d-吡喃甘露糖氟化物