2.1.6 线程的实现方式、多线程模型

目录

2.1.6 线程的实现方式、多线程模型

2.1.6.1 线程的实现方式

2.1.6.2 多线程模型


2.1.6.1 线程的实现方式

  线程已在许多系统中实现,但各系统的实现方式并不完全相同。在有的系统中,特别是一些数据库管理系统,所实现的是用户级线程;而另一些系统所实现的是内核级线程; 还有一些系统如 Solaris 操作系统,则同时实现了这两种类型的线程。


  用户级线程:在早期的操作系统中只支持进程还不支持线程,线程这一功能的实现是采取代码书写的线程库来实现的。
  在这时,“线程”其实就是一行行代码,线程库的实现就类似于代码的调用,因此此时的用户级线程就运行在用户态中。下面这个代码中while语句的作用实际就相当于线程库。
int main(){int num;while(true){if(num==1){线程1;}if(num==2){线程2;}if(num==3){线程3;}}
}
  根据上面这种图我们可以看出,用户级线程的管理工作(创建,切换,撤销等)均有应用程序来完成,不需要操作系统的介入。从用户的角度来看,确实可以感受到多个线程的存在(因为有直观的代码逻辑),但是在操作系统看来,操作系统并意识不到有多个用户级线程的存在。所以,“用户级线程”就是“从用户视角看能看到的线程”。
这种用户级线程的优点十分明显:进程切换较快,线程管理的系统开销较小,效率高。但是如果某一线程被阻塞了,那么整个进程都会停滞不前,而且因为用户级线程是用代码书写的所以这些代码不能在多核处理机上并发,只能在一个处理及上执行,这也是用户级线程的一个缺点
内核级线程:无论是用户进程中的线程,还是系统进程中的线程,他们的创建、撤消和切换等也是依靠内核,在内核空间实现的。
相较于用户级线程,从下图中我们可以看到:内核级线程的管理工作(创建,切换,撤销等)均有操作系统内核来完成,所以内核级线程的切换必须进入核心态才能完成。每个内核级线程都会有一个TCB(Thread Control Block,线程控制块),通过TCB操作系统可以对内核级线程进行管理,所以,“内核级线程”就是“从操作系统内核视角看能看到的线程”。 与用户级线程的优缺点正好相反,内核级线程的缺点是进程切换较慢,线程管理的系统开销较大。同时如果某一线程被阻塞了,别的线程可以继续并发执行,同时不同的线程还可以进入不同的处理机运行,这是他的优点

2.1.6.2 多线程模型

  一对一模型:该模型是为每一个用户线程都设置一个内核控制线程与之连接,当一个线程阻塞时,允许调度另一个线程运行。在多处理机系统中,则有多个线程并行执行。该模型并行能力较强,但每创建一个用户线程相应地就需要创建一个内核线程,开销较大,因此需要限制整个系统的线程数。

多对一模型:多个用户级线程映射到一个内核级线程。且一个进程只被分配一个内核级线程。

  该模型的主要优点是线程管理的开销小,效率高;但当一个线程在访问内核时发生阻塞,则整个进程都会被阻塞,而且在多处理机系统中,一个进程的多个线程无法实现并行。

这里我们需要知道:操作系统只“看得见”内核级线程,因此只有内核级线程才是处理机分配的单位。

  多对多模型:用户级线程映射到 m 个内核级线程(n >= m)。每个用户进程对应 m 个内核级线程。

对于这个多对多模型,一个线程阻塞并不会引起整个进程阻塞,只有这两个线程同时阻塞才会将进程阻塞,因此多对多线程模型的并发性较好。因为内核级线程才是处理机分配的基本单位,所以这个多对多模型最多被分配两个处理机。

操作系统(十二)线程的实现方式、多线程模型相关推荐

  1. 六、线程的实现方式---多线程模型

    一.线程的实现方式----用户级线程 1.线程分为用户级线程和内核级线程 2.用户级线程由应用程序通过线程库实现,所有的线程管理工作都由应用程序负责(包括线程切换) 3.用户级线程中,线程切换可以在用 ...

  2. OpenGL教程翻译 第二十二课 使用Assimp加载模型

    第二十二课 使用Assimp加载模型 原文地址:http://ogldev.atspace.co.uk/(源码请从原文主页下载) 背景 到现在为止我们都在使用手动生成的模型.正如你所想的,指明每个顶点 ...

  3. 线程的概念和多线程模型

    文章目录 5.线程概念和多线程模型 5.1.为什么要引入线程 5.2.什么是线程 5.3.线程引入后带来的变化 5.4.线程的属性 5.5.线程的实现方式 5.5.1.用户级线程 5.5.2.内核级线 ...

  4. (十二)boost库之多线程高级特性

    很多时候,线程不仅仅是执行一些耗时操作,可能我们还需要得到线程的返回值,一般的处理方法就是定义一个全局状态变量,不断轮训状态,就如我目前维护的一个项目,全局变量定义了N中状态,看的让人抓狂.该项目的大 ...

  5. 动手学深度学习(二十二)——GoogLeNet:CNN经典模型(五)

    文章目录 1. 含并行连结的网络(GoogLeNet) 1.1 Inception块 1.2 GoogLeNet模型 2. 动手实现简化的GoogLeNet模型 2.1 实现Inception块 2. ...

  6. WPF and Silverlight 学习笔记(十二):WPF Panel内容模型、Decorator内容模型及其他...

    由于园子里昨天使用Live Writer上传出现问题,昨天只能使用Web上的文本编辑器上传本文,造成代码.内容等格式的错误,现重发本文. 一.Panel内容模型 Panel内容模型指从System.W ...

  7. 机器学习笔记(十二)——马尔科夫模型

    马尔科夫模型是一种概率图模型,它描述了一类重要的随机过程(随机过程又称为随机函数,是随时间而随机变化的过程).我们常常需要考察一个随机变量序列,这些随机变量序列并不是相互独立的,每个随机变量的值都依赖 ...

  8. linux线程并不真正并行,Linux系统编程学习札记(十二)线程1

    Linux系统编程学习笔记(十二)线程1 线程1: 线程和进程类似,但是线程之间能够共享更多的信息.一个进程中的所有线程可以共享进程文件描述符和内存. 有了多线程控制,我们可以把我们的程序设计成为在一 ...

  9. 2.1.5 线程概念和多线程模型

    目录 思维导图 啥是线程,为什么要引入线程? 引入线程机制后,有啥变化? 线程的属性 线程的实现方式 用户级线程 内核级线程 组合方式 多线程模型 多对一模型 一对一模型 多对多模型 思维导图 啥是线 ...

最新文章

  1. 学习笔记-小甲鱼Python3学习第十五讲:字符串:格式化
  2. boost::multiprecision模块mpfi相关的测试程序
  3. css—盒子模型理解
  4. java课程之团队开发冲刺1.8
  5. AT4144-[ARC098D]Donation【Kruskal重构树,dp】
  6. 著名数学大师丘成桐:我们为什么要读数学科普书
  7. 数据链路层的是三个基本问题
  8. java生成动态验证码_java动态生成验证码
  9. python和matlab的区别_我为什么选择Python,不是Matlab和R语言呢?
  10. iReal Pro 2020 for Mac(模拟乐队音乐陪练工具)
  11. 小程序实现列表和详情页
  12. vue+腾讯地图 实现坐标拾取器功能
  13. 行为画像分析 行业客户画像 行业用户画像
  14. SpringBoot整合MyBatisPlus(十四)
  15. 【LaTeX入门】15 在文章中添加脚注
  16. 构建你的Office 365开发环境 - IOS版
  17. WPF之布局属性HorizontalAlignment、HorizontalContentAlignment、VertialAlignment、VerticalContentAlignment
  18. MFC界面开发进入BCGControlBar v30.5时代,Gauge控件全新升级
  19. 小米手机防盗nbsp;方法、安全及可…
  20. Mycat JVM appears hung: Timed out waiting for signal from JVM.

热门文章

  1. source insight和vim同时使用
  2. 参考例子,学习FuncT, TResult委托
  3. 4.6 explain 之 rows
  4. ASP.NET MVC 传值方法ViewData与ViewBag的区别
  5. vijos1055 奶牛浴场
  6. ubuntu-桌面版-常用设置
  7. 关于写文本文件的问题
  8. 深度丨机器学习的理论局限性与因果推理的七大特性zhuan'z
  9. Python学习笔记:进程和线程(起)
  10. 远程唤醒linux系统方法