当前位置: 首页 > news >正文

线程、对称多处理和微内核(OS 笔记三)

线程、对称多处理


​ 这一部分继续深入探讨与进程管理相关的高级概念并了解多处理机的对称多处理技术。

进程和线程

到目前为止提出的进程的概念包含两个特点:

  • 资源所有权 存放进程映像的虚拟地址空间
  • 调度/执行 被执行和接受操作系统调度

上述两个特点是独立的,操作系统应该能够独立的处理他们。为了区分这两个特点,分派(接受调度)的单位通常被称为 线程 或者轻量级进程。而拥有资源所有权的单位通常仍称为进程或任务。现在,我们提出了线程的概念,并对二者加以了区分。

多线程

​ 多线程是指操作系统在单个进程内支持多个并发执行路径的能力。每个进程中只有一个线程(一条执行路径)在执行的传统方法称为单线程方法。

多线程单线程示意图:

img_d43a1842df77461b9d4eec29a6775e75.png

在多线程环境中,进程被定义成资源分配的单位和一个被保护的单位。与进程相关联的有:

  • 存放进程映像的虚拟地址空间
  • 受保护地对处理器、其他进程、文件和 I/O 资源的访问

在一个进程中,可能有一个或多个线程,每个线程都有:

  • 线程执行状态(执行,就绪等)
  • 在未运行时保存的线程上下文:从某种意义上来讲,线程可以被看做进程内的一个被独立操作的程序计数器
  • 一个执行栈
  • 用于每个线程局部变量的静态储存空间
  • 与进程内的其他线程共享的对进程的内存和资源的访问

线程和进程在进程管理角度的不同:

在单线程模型中(即并没有明确的线程概念),进程的表示包括他的进程控制块和用户地址空间,以及在进程执行中对例程调用和返回的行为的用户栈和内存栈。当进程正在运行时,处理器寄存器将被该进程所控制;当进程不运行时,这些处理器寄存器中的内容将被保存。在多线程环境中,进程仍只有一个与之关联的进程控制块和用户地址空间,但是每个线程都有一个独立的栈,该有独立的控制块用于包含寄存器的值、优先级和其他与线程相关的状态信息。

因此,进程中的所有线程共享进程的状态和资源。

如图:

img_22b48634284654d2b0125b3c879a69d2.png

从性能方面考虑线程的优点:

  • 在一个进程中创建一个新线程比创建一个新进程所需要的时间要少许多(约快10倍)
  • 终止一个线程比终止一个进程花费的时间要少
  • 同一个进程内线程间切换比进程间切换花费时间要少
  • 线程提高了不同的执行程序间通信的效率。在大多数操作系统中,独立进程间的通信需要内核的介入,以提供保护和通信所需的机制。但在同一个进程中的线程共享内存和文件,无需调用内核就可以相互通信

因此,如果一个应用程序或函数被实现为一组相关的线程要比实现为一组分离的进程更高效。

使用线程比较常见的例子是服务器对于多个用户请求的响应,因为这涉及到频繁的创建和销毁任务操作。并且如果计算机具有多个处理器,那么同一进程的多个线程可以同时被多个处理器同时处理以提高效率。

另外,在单处理机中,为了简化在逻辑上完成若干项不同功能的程序的结构,线程也是有用的。

比如:

  • 前台和后台工作
  • 异步处理
  • 执行速度
  • 模块化程序结构

在支持线程的操作系统中,调度和分派是在线程基础上完成的。

线程的功能特性

线程状态
  • 派生
  • 阻塞
  • 解除阻塞
  • 结束

线程阻塞并不会导致拥有该线程的进程发生阻塞。不然便丧失了线程的灵活性。

线程同步

线程同步的问题和解决的技术和进程同步相同,将在之后的进程同步部分一起讨论。

用户级和内核级线程

用户级线程

​ 在一个纯粹的用户级线程程序中,有关线程管理的工作都由应用程序完成,内核意识不到线程的存在。程序默认是以一个单线程程序开始执行,如果需要使用多线程技术,那么用户必须使用一个多线程的例程库,通过多线程例程库实现对线程的创建、销毁和调度、恢复线程上下文等操作。此时可以认为线程库起到了类似操作系统管理进程时的作用。这些活动都发生在用户进程中,操作系统内核并不知道这一切。

还有一点需要注意的就是线程调度和进程调度的关系。

考虑一种情况,一个进程中有两个处于运行态的线程,某一时刻这个进程被操作系统设置为阻塞态,但是由于进程内部的线程对于操作系统是不可见的,所以进程中的线程对于管理他的线程库来说仍处于运行态,不过由于线程所在的进程被阻塞而暂停运行所以进程中的多线程例程库和他所管理的线程都会赞同运行。等到这个进程恢复运行时,线程继续恢复运行。对于内部的线程来说,进程的阻塞仿佛没有发生一样。

使用用户级线程的 优点

  • 线程的切换不需要内核态特权,同时节省了内核态和用户态之间的状态转换时间
  • 可以在应用程序内部定制自己的线程调度算法
  • 用户级线程可以在任何操作系统中运行而不必对底层内核进行修改以支持用户级线程

缺点

  • 用户级线程执行一个系统调用时,不仅这个线程会被阻塞,而且进程中所有的线程都会被阻塞
  • 纯粹用户级线程策略中,多线程应用程序不能使用多处理技术。内核一次只把一个进程分配给一个处理器,因此同一时间一个进程中只能有一个线程被执行。事实上,在一个进程内,我们相当于实现了应用程序级别的多道程序设计
内核级线程

​ 在一个纯粹的内核级线程程序中,有关线程的管理操作都是由内核完成的。应用程序没有对线程进行管理的代码。只有一个到内核线程设施的应用程序编程接口(API)。

优点

  • 内核可以把多个线程同时分配到多个处理器上
  • 如果一个进程中的线程阻塞,可以调用该进程中的另一个线程
  • 内核自身也可以是多线程的

缺点

  • 跨进程的线程切换需要进行用户态和内核态的转换

经过统计后能发现,进程、用户级线程、内核级线程的性能从高到低可以按照这样的顺序(每级相差大约一个数量级):

​ 用户级线程 > 内核级线程 > 进程

这是大多数情况下的结果,实际情况还是要取决于应用程序的性质。

组合的方法

​ 一种折中的方法是组合用户级线程和内核级线程。在组合的系统中,线程的创建完全在用户空间中进行,线程的调度和同步也是在应用程序中进行。一个应用程序中的多个用户级线程被映射到一些内核级线程上。程序员可以为特定的应用程序和处理器调节内核级线程的数目以达到最佳效果。

在组合方法中,同一个应用程序中的多个线程可以在多个处理器上 并行 的运行。某个线程引起阻塞的系统用不会阻塞整个进程。设计正确的情况下该方法将会结合用户级线程和内核级线程的优点同时减少二者的缺点。

对称多处理

​ 传统上,操作系统被看做是顺序机器,大多数计算机编程语言要求程序员把算法定义成指令序列。处理器通过按顺序逐条的执行机器指令来执行程序。每条指令都是以操作序列(取指令、取操作数、执行操作、储存结果)的方式执行的。

然而,对于计算机的这种看法并不完全是真实的。 在微操作级别,同一时间会有多个控制信号产生;长久以来指令流水线技术至少可以把取操作指令和执行操作重叠起来;这些都是并行的例子。

下面分析两种最主流的通过复制处理器提供并行性的手段:对称多处理和集群(后面讨论)。

对称多处理体系结构

并行处理器系统的分类:

  • 单指令单数据流 单处理器执行单个指令流,对保存在单个内存中的数据进行操作
  • 单指令多数据流  一条机器指令控制许多处理器部件步伐一致的同时执行。每个处理部件都有一个相关的数据内存,因此每条指令都由不同的处理器在不同的数据集合上执行
  • 多指令单数据流 一系列数据被传送到一组处理器上,每个处理器执行不同的指令序列。这个结构从未实现过
  • 多指令多数据 一组处理器同时在不同的数据集上执行不同的指令序列

对称多处理系统在提高计算机性能的同时,无疑也引入了其他的问题,例如多个处理器避免同时选择一个线程执行等等。它增加了操作系统设计的复杂度。

多处理器操作系统

多处理器操作系统负责管理处理器和其他的计算机资源,使得用户可以把整个系统看做是与多道程序单处理器系统相同的形式。用户可以构造使用多进程或多线程的应用程序,而无需考虑用到一个处理器还是多个处理器。因此,多处理器操作系统必须提供多道程序系统的全部功能,再加上适应多个处理器的附加功能。

相关文章:

  • js中写文档write和innerHTML的区别
  • React 16 Jest ES6 Class Mocks(使用ES6语法类的模拟) 实例二
  • 拉格朗日乘子
  • FE协同中流程无法提交
  • 《大道至简》读后感
  • mui集成微信H5支付(返回白屏问题已经解决)
  • JVM学习笔记二:内存结构规范
  • React Native中获取屏幕的宽高、分辨率
  • POI技术
  • 微信公众号之模板消息使用
  • Windows Unity ARKit发布到IOS相关设置及错误解决
  • Spring配置补充
  • 基于 HTML5 结合互联网+ 的 3D 隧道
  • Ligowave无线网桥15级手拉手链路设计及稳定性保障
  • JAVAOOP异常
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • create-react-app项目添加less配置
  • mysql 数据库四种事务隔离级别
  • MySQL-事务管理(基础)
  • Xmanager 远程桌面 CentOS 7
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 构建工具 - 收藏集 - 掘金
  • 记录一下第一次使用npm
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 坑!为什么View.startAnimation不起作用?
  • 排序(1):冒泡排序
  • 前端
  • 如何实现 font-size 的响应式
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 新书推荐|Windows黑客编程技术详解
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 通过调用文摘列表API获取文摘
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • !!java web学习笔记(一到五)
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (4)事件处理——(7)简单事件(Simple events)
  • (arch)linux 转换文件编码格式
  • (C++20) consteval立即函数
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (转载)Linux 多线程条件变量同步
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • ***利用Ms05002溢出找“肉鸡
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .netcore 获取appsettings
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • @RequestParam详解
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)