`

线程模型及常用线程库

阅读更多

      线程的概念分为两种,用户态线程核心态线程 。用户态线程指不在内核中实现线程,只在用户态中模拟出多线程,内核完全不知道。而核心态线程是由内核创建的。类Unix系统中一般通过修改进程的实现方式来完成,可以使用不完全的进程创建方式创建共享数据空间的进程,在 Linux下这种系统调用为clone(),而在FreeBSD下它为rfork()。

  在许多类Unix系统中,如Linux、FreeBSD、 Solaris等,进程一直都是操作系统内核调用的最小单位。程序开发也都采用多进程模型。后来引入了线程这一概念,由于这些系统本身不存在线程这一概念,那么出现以下几种常见的线程模型:


      N∶1用户线程模型 : N条用户线程只由一条内核进程/线程调度,即以用户态线程实现。内核不干涉线程的任何生命活动,用户态线程工作在“进程竞争范围”。因此,线程的创建、删除和环境切换都很高效。但是缺点同样明显,因为一个进程同一时间只能在一个CPU中执行。所以在SMP中,无论系统有多少CPU,同一进程中的所有线程都只能由一个CPU去执行。另外,如果其中某条线程执行了一个“阻塞”操作,比如read和write,那么整个进程中的其它线程都会被阻塞,这也违背了线程的概念。
      目前,采用这种模型的线程库大概有,FreeBSD下的libc_r,libkse好像还有GNU的libpth(这个不太清楚)


      1∶1 核心线程模型 : 1条用户线程对应一条内核进程/线程来调度,即以核心态线程实现。应用程序创建的每一个线程都由一个核心线程直接管理,内核将每一个核心线程都调度到系统CPU上。
所有线程都工作在“系统竞争范围”。这种方式也是现在大多线程库采用的模式。它完全克服了N:1模型的缺点,但较之在线程的创建、删除、切换的代价更昂贵。
      目前,采用这种模型的线程库大概有,FreeBSD下的libthr,Linux下的LinuxThreads,NPTL。


      N∶M 混合线程模型 : 即N∶1和1∶1模型的组合形式,支持用户态线程和核心态线程同时存在。在创建线程时可以指明这个线程应该工作在哪一种模式。
这个模型比较灵活和强大,并且在实现N∶1模型中,加入了算法来克服这个模型会被阻塞的缺点。但是这种模型也较复杂。
      目前,solaris提供了这种模型。Linux下可选的NGPT(已不再维护,NPTL已成为Linux下默认的线程库)


参考文献:《C++网络编程,卷1》
  Linux自从2.4以后就把线程库从原来的 LinuxThreads升级成NPTL。LinuxThreads需要一条管理线程来维护所有线程,NPTL把这些工作交给了内核,大幅提升了线程的效率。并且更好地兼容了POSIX标准。
  FreeBSD在6.0之前对线程的支持非常差,效率低。7.0开始libthr成为默认的线程库,不知道会不会有明显改善。
  在线程方面做得比较好的操作系统有 Windows NT/2000和SUN Solaris,对于Windows NT/2000,它们本身就是以线程为基础进行任务调度的,性能较好比较正常。SUN Solaris的线程实现则提供了另一个很好的参考平台,在Solaris中,采用了N∶M 混合线程模型,使用多个进程运行更多的线程,因此可以综合利用多处理器的优点和在进程内部切换线程的优点。

PS:
进程竞争范围(process contention scope):各个线程在同一进程中竞争“被调度的CPU时间”(但不直接和其他进程中的线程竞争)。
系统竞争范围(system contention scope):线程直接和“系统范围”内的其他线程竞争,无论它们和什么进程关联。
POSIX - 支持可移植操作系统接口标准(Portable Operating System Interface Standard)。


参考地址:http://blog.sina.com.cn/s/blog_43adf9fb0100a1t7.html

分享到:
评论

相关推荐

    使用 quickjs 和 Vue.js 模仿微信小程序的双线程模型.zip

    这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本...

    Linux多线程服务端编程:使用muduo C++网络库

    《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...

    zlog---比log4c更牛的c语言日志库

    纲目分类模型,比log4j系列的继承模型更加清晰 多种输出,包括动态文件、静态文件、stdout、stderr、syslog 可以在运行时动态刷新配置,只需要调用函数zlog_reload() 高性能,在我的笔记本上达到72'000条日志每秒, ...

    AI学习知识点.xmind

    常用库 时间库 并发库 科学计算库 Matplotlib可视化会图库 锁和线程 多线程变成 3. 机器学习 机器学习 理论概述 督导学习 逻辑回归 Softmax分类 条件随机场 支持向量机svm 决策树 随机森林 GBDT ...

    delphi的com机制

    COM 库常用函数 HRESULT 类型 ⊙ 第四章 COM 特性 可重用性:包容和聚合 进程透明性 (待学) 安全性 (待学) 多线程特性 (待学) ⊙ 第五章 用 Visual C++ 开发 COM 应用 Win32 SDK 提供的一些头文件的说明 与 ...

    易语言支持库

    F:\ISO\=]易语言视频[=模块[=\易语言支持库\GBB的线程支持库.rar F:\ISO\=]易语言视频[=模块[=\易语言支持库\GIF动画全操作支持库1.1版(伪静态).zip F:\ISO\=]易语言视频[=模块[=\易语言支持库\HGE游戏引擎支持库...

    UNIX操作系统教程 张红光

    Window及其他实用程序292 14.1X-Window292 14.1.1X-Window的特征292 14.1.2X-Window的工作方式293 14.1.3X-Window的组成部件294 14.1.4X-Window编程环境介绍295 14.2数据检索加工工具awk296 14.2.1awk基本描述296 ...

    后台开发核心技术与应用实践

    第六部分(第13章)通过常用类库JsonCPP和Protobuf的使用,演示如何使用第三方库。 目录 第1章 C++编程常用技术 1 第2章 面向对象的C++ 26 第3章 常用STL的使用 65 第4章 编译 117 第5章 调试 148 第...

    C#上位机开发必备帮助类库.zip

    里面包含了Windows API、加密解密序列化、可移动设备管理类、各种仪表控件库、多媒体处理类、内存管理、数据库管理、图片文字处理、多线程串口与网络、文件处理、压缩与解压、log4net、标准modbus实现方法和工作逻辑...

    asp.net多线程的TCP端口扫描程序的设计与实现(源代码+thesis).zip

    缓存管理:为了提高应用程序的性能,我们将使用ASP.NET提供的缓存机制来缓存常用的数据和页面。这将减少对数据库和服务器的访问次数,提高应用程序的响应速度和吞吐量。 异步编程:我们将使用ASP.NET提供的异步编程...

    Java性能调优实战——覆盖80%以上的Java应用调优场景

    开篇词讲怎样才能做好性能调优02讲如何制定性能调优策略04讲...索引的失效与优化36讲什么时候需要分表分库37讲电商系统表设计优化案例分析39讲答疑课堂:MySQL中InnoDB的知识点串讲加餐讲推荐几款常用的性能测试工具

    深入JVM内核 - 原理、诊断与优化

    介绍常用的JVM参数,包括内存分配、堆栈分配、虚拟机运行模式以及调试跟踪参数。 第四课 GC的算法和种类 引用计数 标记清除 复制算法 标记压缩 可触及性 本章是理论性较强的一章,主要介绍GC的基本算法和思想,本...

    OpenSceneGraph三维渲染引擎设计与实践

    12.3 多种线程模型的讨论与实现 341 12.3.1 渲染器与场景视图 341 12.3.2 单线程模型 347 12.3.3 多设备裁减/绘制模型 348 12.3.4 多设备绘制模型 349 12.3.5 多相机绘制模型 350 12.3.6 数据变度 351 第13章...

    linux网络编程-宋敬彬-part2

    4.4.3 线程的结束函数pthread_join()和pthread_exit() 129 4.4.4 线程的属性 130 4.4.5 线程间的互斥 132 4.4.6 线程中使用信号量 133 4.5 小结 136 第2篇 Linux用户层网络编程 第5章 TCP/IP协议族简介 ...

    linux网络编程-宋敬彬-part3

    4.4.3 线程的结束函数pthread_join()和pthread_exit() 129 4.4.4 线程的属性 130 4.4.5 线程间的互斥 132 4.4.6 线程中使用信号量 133 4.5 小结 136 第2篇 Linux用户层网络编程 第5章 TCP/IP协议族简介 ...

    人脸识别所用到函数例子解析以及判断人脸是否为活体的检测算法,设计了简单的人脸识别系统.rar

    --常用人脸识别库安装和应用 --多线程的定时方法调用 --活体检测算法原理以及代码的实现 人脸识别的基本原理 --机器学习简单的说根据一堆已知的海量数据,利用计算机(算法)去进行演算,最终得到一个合适的计算公式(也...

    javase项目开发源码-awesome-android-libraries:很棒的安卓库

    简单的线程模型,通过annotation表示方法运行在ui线程还是后台线程 事件绑定:通过annotation表示view的响应事件,不用在写内部类 REST客户端:定义客户端接口,自动生成REST请求的实现 没有你想象的复杂:...

    《Windows网络编程技术》高清PDF版+随书源码

    单机资源共享的应用编程2.1 进程间通信2.1.1 进程间通信应用实例及概念2.1.2 进程的创建与终止2.1.3 内存文件映射2.2 多线程通信2.2.1 多线程应用实例及概念2.2.2 线程的创建、挂起、激活和终止2.2.3 线程的优先级...

Global site tag (gtag.js) - Google Analytics