linux thread model
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种实现方式。
![]() pthreads的实现有3种方式: 这种实现没有OS的支持,线程对OS来说是不可见的,OS不知道线程的存在与否,也不负责对它们进行调度。所有的此类工作由线程库来完成。 |
![]() 第二种,1:1模式。(好象Solaries就是这种模式?) 1:1模式中,每个线程对应存在一个内核线程。也就是说,OS知道每个线程的生老病死,对它们进行调度。 下面是1:1模式的示意图: |
![]() 第三种,M:N模式。 简单的说,M:N模型的OS级调度上,跟1:1模型相似;线程间调度上,跟n:1模型相似。 优点是,既可以在进程内利用SMP的优势,又可以节省系统空间内存的消耗,而且环境切换大多在用户态完成。 下面是M:N模型的示意图: |
![]() 下面开始胡说八道了,说说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倍!为什么会这样呢?目前偶只知道它把环境切换放到用户态了,别的不懂。 |
![]() 支持一下,正在学习MP!后面的继续! |
![]() 参考: P.S. 我觉得《情景分析》有一个错误,作者在介绍进程时说, 红色部分显然是错误的。pthreads的必要行完全不能由内核线程取代。事实上,倘若这句话正确,pthreads就变成多余的了 :) |
![]() 急需HP-UX下acc的fork, execl的相关知识,我是初学,亟盼任何回复。 jjcao@dl.cn |
![]() 问一句,为什么不是kernel process 对应一组属于这个process的thread? |
![]() 倘若是库实现那就会象你说的那样。 |
![]() 1:1的这种形式是不是为了以空间换时间?如果N:M的话就需要有一个调度的算法,会降低效率? |
![]() 问楼主一个使用上的问题: |
![]() -->不好意思,我一直都是设为NULL让实现自己默认的,没用过这些特性。 |
![]() 关于M:N的问题 |
![]() 柳兄正好请教个问题,线程的stack是在HEAP区 吗? |
![]() user thread的stackS(除了MAIN THREAD外,都在HEAP里面,这里的THREAD LIB在HEAP可以理解成是UNI-PROCESS自己的HEAP空间上开辟的BUFFER). |
![]() >;>;user thread的stackS(除了MAIN THREAD外,都在HEAP里面, |
![]() 呵呵,是从进程栈那往heap方向生长的 |
![]() 再问一个问题,系统对于栈的保护是什么意思?比如由于什么原因栈空间不够了,这个时候系统做些什么动作呢?难道是仅仅发个栈溢出信号然后让程序死掉? |
![]() STACK和HEAP向两个相反方向扩展,当STACK超过他的SIZE限制,或者STACK到达HEAP的边界时候,MEMORY不够,程序退出. |
linux thread model相关推荐
- linux thread model . Linux上posix线程库实现原理讨论
http://blog.csdn.net/fanbird2008/article/details/6752853 Linux上posix线程库实现原理讨论 说明一下,这个问题困扰我好长时间,因为正如使 ...
- The Linux device model
/sys和 /dev的疑问 1./dev 下放的是设备文件,是由应用层mknod创建的文件.假设底层驱动对mknod的设备号有相应的驱动,如open等函数.那么应用层open "/dev/* ...
- linux thread 状态检查,Linux下查看进程的线程 - pstree
有些时候需要确实进程内部当前运行着多少线程,那么以下几个方法值得一用. 根据进程号进行查询两种方式: pstree -p 进程号 (centos下默认没有安装pstree,可通过yum -y inst ...
- linux自定义model,关于modelarts自定义镜像使用心得
1. 环境准备 1.1 前往CCE申请一个集群,并创建一个弹性云服务器,这样云服务器里就安装好了docker及相关环境的配置.选择集群我使用如下配置,创建一个免费的VPC,其余默认. 1.2 创建节点 ...
- Linux中python、C++和C语言的多线程用法整理(_thread、threading、thread和pthread)
目录 python3 开始学习Python线程 _thread 常量和函数: 锁对象 试用基本功能 试用线程同步 threading 函数 常量 类 线程本地数据 线程对象 锁对象 递归锁对象 条件对 ...
- GCC 在 Linux、Windows 系统安装
1. GCC 简介 谈到 GCC,就不得不提 GNU 计划.GNU 全称 GNU's Not UNIX,又被称为"革奴计划",由理查德·斯托曼于 1983 年发起.GNU 计划的最 ...
- linux下,redis 3.2.1双节点集群安装部署
为什么80%的码农都做不了架构师?>>> 一.环境准备 1.JDK环境准备,需卸载掉自带JDK (1)检查服务器是否自带jdk环境 [root@redis1 /]# rpm - ...
- linux centos7 使用 crosstool-ng 构建 交叉编译 工具链 即构建各cpu架构平台的gcc编译器
简介 crosstool-ng,全称是crosstool Next Generation,即下一代crosstool.crosstool是个交叉编译器的制作工具,但是做的不够好,于是有人(Yann E ...
- 嵌入式linux编译环境搭建,嵌入式Linux之旅——环境搭建篇之交叉编译工具的安装...
在正式开始学习裸机程序的编写之前,我们还需要安装一下交叉编译工具.何为交叉编译工具?其实就是在x86的ubuntu主机上编译程序,并且可以运行在arm环境的编译工具.而gcc是本地编译工具,这个在我们 ...
最新文章
- 2021 CSDN年度回忆录
- 创建一个windows服务的小程序及注意事项
- Could not load file or assembly 'System.Web.Extensions, Version=3.5.0.0
- android 多个url请求,[Android]Retrofit多base_url请求解决方案
- 2021全年“遇冷”后,“电商节”该何去何从?
- Qt数据库操作(三) -- 使用SQL模型类
- python3源码剖析_T-SNE源码剖析(python版)
- mysql 外键和事务_Mysql (五)事务和外键
- Nodejs cqmanager项目
- JavaScript学习(五十七)— arguments对象
- arch linux windows,windows+Archlinux双系统安装指南(一)
- springboot07多环境切换
- JAVA学习第八天--Scanner /String/StringBuilder
- 0003-img标签-前端学习笔记
- java检测栈溢出_java运行方法栈溢出
- config parser 模块
- 前缀列表技术原理和实验(华为设备)
- fastdb相关备忘
- linux终端修改键盘格局,如何在Ubuntu桌面中更改键盘布局
- matlab星三角变压器,什么是变压器星三角接法
热门文章
- Novavax向韩国提交生物制剂许可证申请;瑞科生物获得新冠疫苗《药品生产许可证》| 医药健闻...
- 五.GPU体系架构概述
- android 自定义等待框,mvp-frame: 基于MVPArams框架,加入自定义主题模块,自定义公共状态栏,自定义等待框,自动升级模块...
- 共享设备受到开发商和消费者青睐的原因
- 安卓开发之Toolbar
- 2022-2028年中国羽绒工业调研分析及投资战略研究报告
- 【Python稀疏矩阵】
- 论文阅读笔记 | MLP系列——MLP部分汇总(MLP-Mixer、S2-MLP、AS-MLP、ViP、S2-MLPv2)
- py2exe用法举例与调试技巧
- java recordset_使用VBA Excel代码中的RecordSet数据创建图表