精 灵 王


  • 首页

  • 文章归档

  • 所有分类

  • 关于我

  • 搜索
设计模式之美 分布式 Redis 并发编程 个人成长 周志明的软件架构课 架构 单元测试 LeetCode 工具 位运算 读书笔记 操作系统 MySQL 异步编程 技术方案设计 集合 设计模式 三亚 游玩 转载 Linux 观察者模式 事件 Spring SpringCloud 实战 实战,SpringCloud 源码分析 线程池 同步 锁 线程 线程模型 动态代理 字节码 类加载 垃圾收集器 垃圾回收算法 对象创建 虚拟机内存 内存结构 Java

(四)操作系统-多线程

发表于 2021-04-21 | 分类于 操作系统 | 0 | 阅读次数 178

线程的引入

  • 提高系统并行性
    • 硬件方面:流水线计算机、数据流计算机、并行处理器、流水存储器、多体交叉及多端口存储器等;
    • 操作系统方面:中断、通道、多道程序设计技术、并发程序技术。
  • 仅使用进程来解决并行性问题的缺点
    • 经常性的进程开关,系统开销很大;
      • 与进程运行有关的表格要改写;
      • 进程的地址空间要进行转换为新被调度的进程的地址空间;
      • 两次模式开关的开销(用户模式—内核模式—用户模式)
  • 传统的进程概念有两个严重的局限性
    1. 许多应用想并发执行彼此间独立的任务,但又必须要共享一个公共的地址空间和其他资源,将这类应用中独立的任务串行化,效率很低;
    2. 传统的进程不能很好地利用多处理器系统。

线程(thread)的概念

概念:

  • 进程内的一个执行单元
  • 进程内的一个可调度实体
  • 线程是程序(或进程)中相对独立的一个控制流序列
  • 线程是执行的上下文,即执行的现场数据和其他调度所需要的信息

线程是进程内一个相对的、可调度的执行单元 ; 有些系统把线程称为轻质进程(lightweight process)

线程的性质

  • 线程是进程内一个相对独立的可执行单元;
  • 线程是操作系统中的基本调度单元,因此线程中应包含有调度所需要的必要信息;
  • 每个进程在创建时,至少需要同时为该进程创建一个线程,即进程中至少要有一个或一个以上线程,否则该进程无法被调度执行;
  • 需要时,线程可以创建其他线程;
  • 进程是被分给并拥有资源的基本单元,同一进程内的多个线程共享该进程的资源,但线程并不拥有资源,只是使用它们;
  • 由于共享资源(数据和文件),所以线程间需要通信和同步机制;
  • 线程有生命周期,有诞生和死亡,在生命周期中有状态的变化。

多线程机制的优点

  • 在进程内创建多线程,可以提高系统的并行处理能力。
  • 线程机制可显著提高程序执行的有效性,也可方便用户编程;
  • 不但适用于多机系统(尤其是对称式多机系统),而且对大多数单CPU系统也同样有好处。
  • 首先用于创建和撤消线程的开销比创建和撤消进程的系统开销(CPU时间)要少得多(比如不需要建立它的地址空间和所需资源等);
  • CPU在线程之间开关时的开销也远比在进程之间开关的开销小;
  • 线程机制也增加了通讯的有效性(无须内核参与);
  • 方便和简化了用户的程序结构工作。

线程的状态

所谓状态是指线程当前正在干什么和它能干什么

几个基本状态:

  • 就绪状态
  • 运行状态
  • 等待状态(或阻塞状态)

线程没有挂起操作和挂起状态;

  • 线程不是资源的拥有者,资源属于进程,所以线程不应有决定整个进程或自己从主存撤出的权力。

进程中可能有多个线程,当其中一个线程在执行中成为阻塞状态时,不阻塞其他线程,该进程中其他线程仍然可以参与调度运行;

对于多线程进程中的进程状态,可以只划分为活动(可运行)状态和非活动(不可运行)状态。

线程的生命周期图:

1

线程的状态转换

运行状态到阻塞状态

  • 其他线程使用Sleep( )原语;
  • 因为“挂起”原语;
  • 该线程自己“等待”某个条件(事件);
  • 该线程请求I/O服务。

阻塞状态到可运行状态

  • 唤醒
  • 解除挂起
  • 条件发生
  • I/O完成

进入死亡状态

  • 线程自己由于完成而使用Exit原语结束自己;
  • 被其他线程使用Stop原语而突然结束。

线程的描述(TCB)

线程控制块TCB——描述和记录其属性和调度所需的数据,是线程存在的标志。

  • 线程状态(就绪、运行、阻塞等)
  • 当线程不运行时,被保存的现场信息;
    • 程序计数器、程序状态字、通用寄存器、堆栈指针
  • 一个执行堆栈;
  • 存放每个线程的局部变量的主存区;
  • 访问被同一进程中所有线程共享的该进程的主存和其他资源。

线程的管理

  • 也用链指针将TCB或线程对象按它们所处的状态链接成相应的线程队列来加以管理;
  • 操作系统的进程管理程序为某用户应用程序创建进程时,同时为该进程创建第一个线程;
  • 以后在线程的运行过程中,线程可以在需要的时候创建所需的线程;
  • 线程间不提供父子关系的支持。

线程控制原语

创建线程原语

  • 为线程得到一个TCB或线程对象,并初始化线程ID,线程描述表(程序计数器PC、程序状态字PSW、通用寄存器、堆栈指针等)和其他有关项,然后进入相应就绪队列。

撤消线程原语

  • 撤消线程TCB或线程对象、线程堆栈和描述表。

阻塞或等待原语

挂起一个线程

恢复(解挂)一个线程

改变优先数

基于线程的操作系统分类

  • 单进程和单线程系统——只有一个进程,每个进程中只有一个线程,如MS-DOS;
  • 多进程和单线程系统——有多个进程,但每个进程中只有一个线程,如传统意义上的UNIX系统;
  • 单进程和多线程系统——只有一个进程,但每个进程有多个线程;
  • 多进程和多线程系统——有多个进程,每个进程中又有多个线程,是当前应用最广泛的系统类型。

2

精 灵 王 wechat
👆🏼欢迎扫码关注微信公众号👆🏼
  • 本文作者: 精 灵 王
  • 本文链接: https://jinglingwang.cn/archives/system04
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
# 设计模式之美 # 分布式 # Redis # 并发编程 # 个人成长 # 周志明的软件架构课 # 架构 # 单元测试 # LeetCode # 工具 # 位运算 # 读书笔记 # 操作系统 # MySQL # 异步编程 # 技术方案设计 # 集合 # 设计模式 # 三亚 # 游玩 # 转载 # Linux # 观察者模式 # 事件 # Spring # SpringCloud # 实战 # 实战,SpringCloud # 源码分析 # 线程池 # 同步 # 锁 # 线程 # 线程模型 # 动态代理 # 字节码 # 类加载 # 垃圾收集器 # 垃圾回收算法 # 对象创建 # 虚拟机内存 # 内存结构 # Java
(三)操作系统-进程管理
(五)操作系统-进程间的交互
  • 文章目录
  • 站点概览
精 灵 王

精 灵 王

青春岁月,以此为伴

85 日志
14 分类
43 标签
RSS
E-mail
Creative Commons
Links
  • 添加友链说明
© 2022 精 灵 王
渝ICP备2020013371号
0%