线程、对称多处理和微内核(OS 笔记三)
线程、对称多处理
这一部分继续深入探讨与进程管理相关的高级概念并了解多处理机的对称多处理技术。
进程和线程
到目前为止提出的进程的概念包含两个特点:
- 资源所有权 存放进程映像的虚拟地址空间
- 调度/执行 被执行和接受操作系统调度
上述两个特点是独立的,操作系统应该能够独立的处理他们。为了区分这两个特点,分派(接受调度)的单位通常被称为 线程 或者轻量级进程。而拥有资源所有权的单位通常仍称为进程或任务。现在,我们提出了线程的概念,并对二者加以了区分。
多线程
多线程是指操作系统在单个进程内支持多个并发执行路径的能力。每个进程中只有一个线程(一条执行路径)在执行的传统方法称为单线程方法。
多线程单线程示意图:
在多线程环境中,进程被定义成资源分配的单位和一个被保护的单位。与进程相关联的有:
- 存放进程映像的虚拟地址空间
- 受保护地对处理器、其他进程、文件和 I/O 资源的访问
在一个进程中,可能有一个或多个线程,每个线程都有:
- 线程执行状态(执行,就绪等)
- 在未运行时保存的线程上下文:从某种意义上来讲,线程可以被看做进程内的一个被独立操作的程序计数器
- 一个执行栈
- 用于每个线程局部变量的静态储存空间
- 与进程内的其他线程共享的对进程的内存和资源的访问
线程和进程在进程管理角度的不同:
在单线程模型中(即并没有明确的线程概念),进程的表示包括他的进程控制块和用户地址空间,以及在进程执行中对例程调用和返回的行为的用户栈和内存栈。当进程正在运行时,处理器寄存器将被该进程所控制;当进程不运行时,这些处理器寄存器中的内容将被保存。在多线程环境中,进程仍只有一个与之关联的进程控制块和用户地址空间,但是每个线程都有一个独立的栈,该有独立的控制块用于包含寄存器的值、优先级和其他与线程相关的状态信息。
因此,进程中的所有线程共享进程的状态和资源。
如图:
从性能方面考虑线程的优点:
- 在一个进程中创建一个新线程比创建一个新进程所需要的时间要少许多(约快10倍)
- 终止一个线程比终止一个进程花费的时间要少
- 同一个进程内线程间切换比进程间切换花费时间要少
- 线程提高了不同的执行程序间通信的效率。在大多数操作系统中,独立进程间的通信需要内核的介入,以提供保护和通信所需的机制。但在同一个进程中的线程共享内存和文件,无需调用内核就可以相互通信
因此,如果一个应用程序或函数被实现为一组相关的线程要比实现为一组分离的进程更高效。
使用线程比较常见的例子是服务器对于多个用户请求的响应,因为这涉及到频繁的创建和销毁任务操作。并且如果计算机具有多个处理器,那么同一进程的多个线程可以同时被多个处理器同时处理以提高效率。
另外,在单处理机中,为了简化在逻辑上完成若干项不同功能的程序的结构,线程也是有用的。
比如:
- 前台和后台工作
- 异步处理
- 执行速度
- 模块化程序结构
在支持线程的操作系统中,调度和分派是在线程基础上完成的。
线程的功能特性
线程状态
- 派生
- 阻塞
- 解除阻塞
- 结束
线程阻塞并不会导致拥有该线程的进程发生阻塞。不然便丧失了线程的灵活性。
线程同步
线程同步的问题和解决的技术和进程同步相同,将在之后的进程同步部分一起讨论。
用户级和内核级线程
用户级线程
在一个纯粹的用户级线程程序中,有关线程管理的工作都由应用程序完成,内核意识不到线程的存在。程序默认是以一个单线程程序开始执行,如果需要使用多线程技术,那么用户必须使用一个多线程的例程库,通过多线程例程库实现对线程的创建、销毁和调度、恢复线程上下文等操作。此时可以认为线程库起到了类似操作系统管理进程时的作用。这些活动都发生在用户进程中,操作系统内核并不知道这一切。
还有一点需要注意的就是线程调度和进程调度的关系。
考虑一种情况,一个进程中有两个处于运行态的线程,某一时刻这个进程被操作系统设置为阻塞态,但是由于进程内部的线程对于操作系统是不可见的,所以进程中的线程对于管理他的线程库来说仍处于运行态,不过由于线程所在的进程被阻塞而暂停运行所以进程中的多线程例程库和他所管理的线程都会赞同运行。等到这个进程恢复运行时,线程继续恢复运行。对于内部的线程来说,进程的阻塞仿佛没有发生一样。
使用用户级线程的 优点 :
- 线程的切换不需要内核态特权,同时节省了内核态和用户态之间的状态转换时间
- 可以在应用程序内部定制自己的线程调度算法
- 用户级线程可以在任何操作系统中运行而不必对底层内核进行修改以支持用户级线程
缺点 :
- 用户级线程执行一个系统调用时,不仅这个线程会被阻塞,而且进程中所有的线程都会被阻塞
- 纯粹用户级线程策略中,多线程应用程序不能使用多处理技术。内核一次只把一个进程分配给一个处理器,因此同一时间一个进程中只能有一个线程被执行。事实上,在一个进程内,我们相当于实现了应用程序级别的多道程序设计
内核级线程
在一个纯粹的内核级线程程序中,有关线程的管理操作都是由内核完成的。应用程序没有对线程进行管理的代码。只有一个到内核线程设施的应用程序编程接口(API)。
优点 :
- 内核可以把多个线程同时分配到多个处理器上
- 如果一个进程中的线程阻塞,可以调用该进程中的另一个线程
- 内核自身也可以是多线程的
缺点:
- 跨进程的线程切换需要进行用户态和内核态的转换
经过统计后能发现,进程、用户级线程、内核级线程的性能从高到低可以按照这样的顺序(每级相差大约一个数量级):
用户级线程 > 内核级线程 > 进程
这是大多数情况下的结果,实际情况还是要取决于应用程序的性质。
组合的方法
一种折中的方法是组合用户级线程和内核级线程。在组合的系统中,线程的创建完全在用户空间中进行,线程的调度和同步也是在应用程序中进行。一个应用程序中的多个用户级线程被映射到一些内核级线程上。程序员可以为特定的应用程序和处理器调节内核级线程的数目以达到最佳效果。
在组合方法中,同一个应用程序中的多个线程可以在多个处理器上 并行 的运行。某个线程引起阻塞的系统用不会阻塞整个进程。设计正确的情况下该方法将会结合用户级线程和内核级线程的优点同时减少二者的缺点。
对称多处理
传统上,操作系统被看做是顺序机器,大多数计算机编程语言要求程序员把算法定义成指令序列。处理器通过按顺序逐条的执行机器指令来执行程序。每条指令都是以操作序列(取指令、取操作数、执行操作、储存结果)的方式执行的。
然而,对于计算机的这种看法并不完全是真实的。 在微操作级别,同一时间会有多个控制信号产生;长久以来指令流水线技术至少可以把取操作指令和执行操作重叠起来;这些都是并行的例子。
下面分析两种最主流的通过复制处理器提供并行性的手段:对称多处理和集群(后面讨论)。
对称多处理体系结构
并行处理器系统的分类:
- 单指令单数据流 单处理器执行单个指令流,对保存在单个内存中的数据进行操作
- 单指令多数据流 一条机器指令控制许多处理器部件步伐一致的同时执行。每个处理部件都有一个相关的数据内存,因此每条指令都由不同的处理器在不同的数据集合上执行
- 多指令单数据流 一系列数据被传送到一组处理器上,每个处理器执行不同的指令序列。这个结构从未实现过
- 多指令多数据 一组处理器同时在不同的数据集上执行不同的指令序列
对称多处理系统在提高计算机性能的同时,无疑也引入了其他的问题,例如多个处理器避免同时选择一个线程执行等等。它增加了操作系统设计的复杂度。
多处理器操作系统
多处理器操作系统负责管理处理器和其他的计算机资源,使得用户可以把整个系统看做是与多道程序单处理器系统相同的形式。用户可以构造使用多进程或多线程的应用程序,而无需考虑用到一个处理器还是多个处理器。因此,多处理器操作系统必须提供多道程序系统的全部功能,再加上适应多个处理器的附加功能。
作者:Skipper
出处:http://www.cnblogs.com/backwords/p/9308536.html
本博客中未标明转载的文章归作者 Skipper 和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
线程、对称多处理和微内核(OS 笔记三)的更多相关文章
- C#线程学习笔记三:线程池中的I/O线程
本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/20/MultiThreads.html,记录一下学习过程以备后续查用. 一.I/O线 ...
- 南京大学OS笔记(1)-应用眼中的操作系统
南京大学OS笔记(1)-应用眼中的操作系统 早就想刷一刷南大JYY老师的os课.之前稍微看过几节,果然讲的风趣幽默,而且现场写代码展示水平确实很高,这次准备认真刷一刷然后好好记一下笔记.当然lab就不 ...
- 构建高性能WEB站点笔记三
构建高性能WEB站点笔记三 第10章 分布式缓存 10.1数据库的前端缓存区 文件系统内核缓冲区,位于物理内存的内核地址空间,除了使用O_DIRECT标记打开的文件以外,所有对磁盘文件的读写操作都要经 ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- Java加密与解密笔记(三) 非对称加密
非对称的特点是加密和解密时使用的是不同的钥匙.密钥分为公钥和私钥,用公钥加密的数据只能用私钥进行解密,反之亦然. 另外,密钥还可以用于数字签名.数字签名跟上文说的消息摘要是一个道理,通过一定方法对数据 ...
- Django开发笔记三
Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.基于类的方式重写登录:views.py: from ...
- 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记
回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...
- 响应式编程笔记三:一个简单的HTTP服务器
# 响应式编程笔记三:一个简单的HTTP服务器 本文我们将继续前面的学习,但将更多的注意力放在用例和编写实际能用的代码上面,而非基本的APIs学习. 我们会看到Reactive是一个有用的抽象 - 对 ...
- muduo网络库学习笔记(三)TimerQueue定时器队列
目录 muduo网络库学习笔记(三)TimerQueue定时器队列 Linux中的时间函数 timerfd简单使用介绍 timerfd示例 muduo中对timerfd的封装 TimerQueue的结 ...
随机推荐
- 推荐系统之矩阵分解及C++实现
1.引言 矩阵分解(Matrix Factorization, MF)是传统推荐系统最为经典的算法,思想来源于数学中的奇异值分解(SVD), 但是与SVD 还是有些不同,形式就可以看出SVD将原始的评 ...
- 信息检索(IR)的评价指标介绍 - 准确率、召回率、F1、mAP、ROC、AUC
原文地址:http://blog.csdn.net/pkueecser/article/details/8229166 在信息检索.分类体系中,有一系列的指标,搞清楚这些指标对于评价检索和分类性能非常 ...
- (并发编程)进程 (multiprocessing--Process实现进程并发)
['创建进程2方式种', '进程对象属性:join方法,守护进程obj.daemon=True,obj.pid, obj.name, obj.terminate(),obj.is_alive()等 ' ...
- (常用)re模块
re模块(正则)#re:一些带有特殊含义的符号或者符号的组合#为什么要用re:一堆字符串中找到你所需要的内容,过滤规则是什么样,通过re模块功能来告诉计算机你的过滤规则#应用:在爬虫中最为常用:使用爬 ...
- Go语言规格说明书 之 类型声明(Type declarations)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语 ...
- js常用函数整理
类型转换:parseInt\parseFloat\toString 类型判断:typeof;eg:if(typeof(var)!="undefined")\isNaN 字符处理函数 ...
- 服务端工程师入门与进阶 Java 版
前言 欢迎加入我们.这是一份针对实习生/毕业生的服务端开发入门与进阶指南.遇到问题及时问你的 mentor 或者直接问我. 建议: 尽量用google查找技术资料. 有问题在stackoverflow ...
- 【ES】学习2-搜索
1.空搜索 返回所有索引下的所有文档 GET /_search 设置超时.timeout 不是停止执行查询,它仅仅是告知正在协调的节点返回到目前为止收集的结果并且关闭连接.在后台,其他的分片可能仍在执 ...
- java 持有对象 ListIterator用法
package ch07; import java.io.*; import java.util.Iterator; import java.util.LinkedList; import java. ...
- python接口自动化测试十六:unittest完成用例
import unittestimport requests def add(a, b): print('前置条件!!!!!:如登录') return a + b class TestAAA(unit ...