操作系统原理第四章:线程
目录
- 1 线程的引入
- 1.1 线程的由来
- 1.2 线程的特点
- 1.3 线程的定义
- 1.4 进程和线程的比较
- 2 内核线程和用户线程
- 2.1 内核线程
- 2.2 用户线程
- 2.3 两者比较
- 3 线程模型
1 线程的引入
1.1 线程的由来
前面章节提到,引入进程是为了解决程序并发所出现的一些问题,进程具有两个基本的属性:
- 进程是一个拥有资源的独立单位:它可独立分配虚地址空间、主存和其它;
- 进程是一个可独立调度和分派的基本单位。
正是因为进程具有这两个基本属性,所以进程成为并发执行的基本单位, 在一些早期的OS中,比如大多数UNIX系统、Linux等,进程同时具有这二个属性,由于 进程是一个资源的拥有者 ,因而在进程创建、撤销、调度切换时,系统需要付出较大的时空开销,所以进程的数目不宜过多,进程切换频率不宜过高,否则会限制并发程度,操作系统的设计目标是提高并发度,减小系统开销,显然进程还不能做到完全的高效,所以引入了线程的概念。
那么有没有一种方法能够既提高系统并发,还能减少系统开销呢,我们采用的方法是将进程的两个基本属性分开,对于拥有资源的基本单位,不对其进行频繁切换,对于调度的基本单位,不作为拥有资源的单位,“轻装上阵”,引入线程以小的开销来提高进程内的并发程度。
在没有引入线程之前,进程作为资源分配单位(存储器、文件)和CPU调度单位。当引入线程后把线程作为作为CPU调度单位,而进程只作为其他资源分配单位。相比进程,线程只拥有必不可少的资源,如:线程状态、程序计数器、寄存器上下文和栈,线程同样具有就绪、阻塞和执行三种基本状态,一个进程可以创建多个线程,线程与同属一个进程的其它线程共享进程拥有的全部资源,并且这些线程可以并发执行。
1.2 线程的特点
减小并发执行的时间和空间开销(线程的创建、退出和调度),因此容许在系统中建立更多的线程来提高并发程度,因为线程有如下特点:
- 线程的创建时间比进程短;
- 线程的终止时间比进程短;
- 同进程内的线程切换时间比进程短;
- 由于同进程内线程间共享内存和文件资源,可直接进行不通过内核的通信;
- 一个多线程的应用在执行中,即使其中的某个线程阻塞,其他的线程还可继续执行,从而提高响应速度
- 同一进程的多个线程共享该进程的内存等资源
- 创建和切换线程的开销要低于进程。比如,Solaris中进程创建时间是线程创建的30倍,进程切换时间是线程切换的5倍
- 多线程更适用于多处理机结构
1.3 线程的定义
线程(轻型进程)是CPU运用的一个基本单元,包括:
- 程序计数器 (program counter)
- 寄存器集 (register set)
- 栈空间 (stack space)
一个线程与它的对等线程共享如下内容:
- 代码段 (code section)
- 数据段 (data section)
- 操作系统资源 (operating-system resources)
传统的或重型进程等价于只有一个线程的任务,下图是单线程和多线程的对比,可以从图中看到多个线程共享code,data,files
,并且每个线程有自己的registers,stack
:
1.4 进程和线程的比较
- 并发性:在引入线程的OS中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间亦可并发执行,因而使OS具有更好的并发性,从而能更有效地使用系统资源和提高系统吞吐量;
- 拥有资源:进程是拥有资源的独立单位,而线程只拥有一些必不可少的资源;
- 系统开销:在创建或撤消进程时,系统都要为之分配或回收资源,如内存空间、I/O设备等。因此,OS所付出的开销将明显地大于在创建或撤消线程时的开销;
- 地址空间和其他资源(如打开文件):进程间相互独立,同一进程的各线程间共享,某进程内的线程在其他进程不可见;
- 通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信,需要进程同步和互斥手段的辅助,以保证数据的一致性;
- 调度:线程上下文切换比进程上下文切换要快得多,下图是线程切换和进程切换的示意图,当单线程进程需要切换的时候,整块内容都需要切换,当多线程进行切换的时候,只需要切换单个线程内容,即虚线框内的内容。
2 内核线程和用户线程
线程是一个轻型的进程,引入线程是为了进一步提高系统并发,从而提高系统效率,线程在实现的时候分为两种:
- 内核支持的线程 (Kernel-supported threads)
- 用户级线程 (User-level threads):在内核之上,通过用户级的库调用
2.1 内核线程
内核线程由内核支持,在内核空间执行线程创建、调度和管理,当线程是内核线程时,才真正的是CPU调度的基本单位,这么说是因为后面要讲到的用户线程并不是CPU调度的基本单位。内核线程是依赖于操作系统的,这个时候内核维护进程和线程的上下文信息,线程切换由内核完成,一个线程发起系统调用而阻塞,不会影响其他线程的运行,时间片分配给线程,所以多线程的进程获得更多CPU时间(线程作为CPU调度的基本单位,每个线程都会分得时间片,所以线程越多的进程,分到的CPU时间越多)。
2.2 用户线程
用户线程是由用户级线程库进行管理的线程,这个时候线程库提供对线程创建\调度和管理的支持,无需内核支持,因此用户线程不是CPU调度的基本单位,此时进程是CPU调度的基本单位。
由于用户线程不依赖于 OS 核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。调度由应用软件内部进行,通常采用非抢先式和更简单的规则,也无需用户态核心态切换,所以速度特别快 。
用户线程的维护由应用进程完成,内核不了解用户线程的存在,用户线程切换不需要内核特权,用户线程的缺点是如果内核是单线程的,那么一个用户线程发起系统调用而阻塞,则整个进程阻塞,此时时间片分配给进程,多线程则每个线程就慢。
2.3 两者比较
- 调度方式:内核线程的调度和切换与进程的调度和切换十分相似,用户线程的调度不需OS的支持;
- 调度单位:用户线程的调度以进程为单位进行,在采用时间片轮转调度算法时,每个进程分配相同的时间片。对内核级线程,每个线程分配时间片
3 线程模型
用户线程是在用户空间去实现的,有关于用户线程的所有操作都是在用户空间里实现的,那么这样的用户线程如果要用到操作系统提供的功能的时候,它通常是要映射到内核空间去,就要在用户线程和内核线程之间做映射,在映射过程中有以下三种模式:
- 多对一 (Many-to-One):多个用户线程映射到内核线程上,如下图,任一时刻只能有一个线程可以访问内核(并发性低),一个用户线程发起系统调用而阻塞,则整个进程阻塞:
- 一对一 (One-to-One):每个用户线程对应一个内核线程,如下图,提供了更好的并发性,一个用户线程发起系统调用而阻塞时允许另一个线程运行,每创建一个用户级线程需创建一个相应的内核线程,带来了额外开销,所以许多系统限制应用中的线程数目:
- 多对多 (Many-to-Many):为了克服上述两种方式的缺点,引入了多对多模型,不限制应用的线程数、多个线程可以并发,如下图:
操作系统原理第四章:线程相关推荐
- 计算机操作系统原理第四章习题
计算机操作系统原理第四章习题 1.什么是静态链接.装入时动态链接和运行时的动态链接? 2.简述分页系统和分段系统的异同点 3.什么情况下需要重定位?为什么要引入重定位? 4.在具有快表的段页式存储管理 ...
- 操作系统原理第七章:死锁
目录 1 死锁的基本概念 2 死锁的必要条件 3 死锁预防 3.1 抑制死锁发生的必要条件 4 死锁避免 4.1 资源分配图法 4.2 银行家算法 5 死锁的检测 5.1 每一种资源类型只有一个实例 ...
- 微型计算机原理答案第四章,微机原理第四章习题答案.doc
微机原理第四章习题答案 1.8086语言指令的寻址方式有哪几类?用哪一种寻址方式的指令执行速度最快? 答:数据操作数的寻址方式有七种,分别为:立即寻址,寄存器寻址,直接寻址,寄存器间接寻址,寄存器相对 ...
- 全面剖析《自己动手写操作系统》第四章---加载Loader.bin
全面剖析<自己动手写操作系统>第四章--FAT12文件系统 http://blog.csdn.net/zgh1988/article/details/7284834 1.突破512字 ...
- 编译原理第四章练习题
目录 编译原理第四章作业 课本习题 补充习题 编译原理第四章作业 自己写的不包对,有错请指正 BY hllinyu 2023年3月31日 课本习题 编译原理 第三版 王生原- 清华大学出版社 的那本 ...
- 第四章 线程切换与调度——操作系统的发动机
对于操作系统而言,即使是最基本的Linux 0.11来说,线程切换也是精致且精妙的,博主在这里只能用我的话大致的描述出基本框架,相比起我目前在学校学习到的课程更加深入一些.朋友们完全可以看一个乐呵,当 ...
- 操作系统原理:进程与线程、进程生命周期、线程的类型
一.进程定义 进程可以看成程序的执行过程,可以展示在当前时刻的执行状态.它是程序在一个数据集合上的一次动态执行的过程.这个数据集合通常包含存放可执行代码的代码段,存放初始化全局变量和初始化静态局部变量 ...
- 操作系统:第四章 文件管理2 - 磁盘管理,磁盘调度算法
本文已收录至 Github(MD-Notes),若博客中有图片打不开,可以来我的 Github 仓库:https://github.com/HanquanHq/MD-Notes,涵盖了互联网大厂面试必 ...
- 操作系统:第四章 文件管理1 - 文件逻辑结构,物理结构,文件目录,软硬连接,文件系统
本文已收录至 Github(MD-Notes),若博客中有图片打不开,可以来我的 Github 仓库:https://github.com/HanquanHq/MD-Notes,涵盖了互联网大厂面试必 ...
最新文章
- GStreamer跨平台多媒体框架
- C语言return函数
- 脚本命令远程访问计算机,在远程电脑上执行任意命令 (利用 Autohotkey ahk http 服务器)...
- 用 Flask 来写个轻博客 (4) — (M)VC_创建数据模型和表
- 3.9 神经网络解决多分类问题-机器学习笔记-斯坦福吴恩达教授
- c语言安卓贪吃蛇代码下载,C语言贪吃蛇代码
- MyCat分布式数据库集群架构工作笔记0024---高可用_单表存储千万级_海量存储_分表扩展_按照日期分片
- java并发编程(13)-- 线程 死锁和定位
- Linux设备模型(总线、设备、驱动程序和类)
- 如何批量打印图片文件
- 太阳代理ip_IP直通车 | 冬季之始,你知多少
- 转换azw3到epub
- 一系列自动化测试的开源项目介绍
- 那些普通人的价值观终究会害了你
- Postman之Pre-request Script 使用详解
- 咏南linux中间件状态查看,咏南跨平台中间件
- 招聘面试的STAR原则
- 简单的SWF视频播放器代码
- repos install.packages()安装镜像
- JAVA--Socket【“套接字”】
热门文章
- 【转帖】详解CSS网页布局中默认字体样式
- 《PSP游戏下载 国际象棋大师:学习的艺术》(Chessmaster : The Art Of Learning)
- c#对oracle操作时候 出现的乱码问题。
- 我看team work
- Python进阶:程序界的垃圾分类回收
- [认证授权] 5.OIDC(OpenId Connect)身份认证授权(扩展部分)
- webstorm中git密码输入错误,重置问题
- 机器学习工作流程第一步:如何用Python做数据准备?
- details和summary标签
- 如何有效地读书【转】