CHS_07.2.1.6_3+线程的状态与转换

CHS_07.2.1.6_3+线程的状态与转换

  • 知识总览
    • 线程的状态与转换
    • 线程的组织与控制

其实线程的状态与转换和进程的状态与转换

知识总览

CHS_07.2.1.6_3+线程的状态与转换_第1张图片

几乎是一模一样的并且线程的状态 我们通常只关注最核心 最主要的这三个状态 也就是运行态 就绪态和阻塞态

他们之间的转换和进程之间的转换完全一致 如果一个系统它支持线程的话

线程的状态与转换

CHS_07.2.1.6_3+线程的状态与转换_第2张图片

那么 一个运行态的线程 它被分配的时间用完了 那么它就会下处理机进入就绪态

而一个就绪态的线程 如果他被调度程序选中 那么就可以从就绪态回到运行态上处理机运行

而一个正在运行的线程 如果他发出了某种请求 等待某个事件的发生 比如说等待i o完成

那么它就会从运行态转变为阻塞态 而如果一个阻塞的线程 它等待的事件发生了 那么它就会从阻塞态回到就绪态

所以这就是线程的状态与转换 我们着重关注这种三状态的模型 好接下来线程的组织与控制

线程的组织与控制

CHS_07.2.1.6_3+线程的状态与转换_第3张图片

那其实线程的组织与控制和进程的组织与控制也是非常类似的

在组织与控制进程的时候 操作系统会对进程的

pcb 也就是进程控制快 进行一个管理 其中包含了进程的各种各样的信息

那对于线程来说 要管理线程 我首先得给各个线程建立一个与之对应的

一个数据结构对吧 那线程对应的数据结构就是tcb也就是线程控制块

那每个线程控制块里边会包含这样的一些内容 可以简称为 tid 这和进程的pid是很类似的

其次 每个线程他们执行的代码可能是各不相同的 因此 每个线程

他执行到代码的哪个位置 是不是得把它记录下来好 所以tcb当中还会包含

程序计数器pc用于指明线程现在执行到哪了 那如果一个线程

他切换下处理机 那此时就需要把这个处理机上的pc

pc的值给它保存到tcb当中 而如果一个线程 它上处理机运行 从就绪态回到运行态

那这个线程的运行现场运行环境是不是得被恢复 那就可以从这个tcb当中取出p c的值

把它放回pc寄存器里面 这是属于线程运行现场的一个信息

那除了程序计数器pc之外 还需要保留其他寄存器 我们都知道

代码运行的中间结果会被保存到各种各样的寄存器里面 因此当我们切换现成的时候 是不是也需要保存

这个线程的各种寄存器的一个值啊 那除了寄存器之外还有一个重要的信息叫做堆栈

那么知道堆栈是用于保存函数调用的信息 a调用了b b调用的c

并且也会记录每一次的函数调用它的返回地址是什么 a调用了b

那么b这个函数调用结束之后 应该返回到a的哪一句代码 对吧 需要把这个函数的返回位置也给它 在堆栈里面记录下来

同时 每一层函数的局部变量也会放在堆栈里面 那线程的堆栈

它可能是比较大的 是内存里的一大片区域 如果把这一整片区域都全部把它放到tcb里 显然没必要 对吧

我们只需要保存对账指针就可以保存一个指针 那么我们可以通过这个指针来找到这个线程

它的堆栈在内存里的哪个位置哪片区域就可以了好 所以还需要保存堆栈指针

好 所以这个地方 我把这三个部分把它圈起来了 程序计数器 pc 以及其他各种寄存器的值

还有堆栈的信息 这些是线程切换的时候我们需要保存和恢复的一些

线程的运行环境下 处理计的线程需要把这些信息保存到tcb当中

而上处理机的线程需要从tcb当中取出这些信息 然后把这些信息填回到相应的位置

堆栈指针通常是把它恢复到s p堆栈寄存器里面的好 那除了上面这些信息之外 当中还需要保存运行状态

运行它就序它而阻塞态 甚至如果是阻塞态的话 还可以把阻塞的原因什么的就是更详细的给它进行一个记录

好之后 还需要保存线程的优先级 那通常在线程调度 或者

系统在分配资源的时候 可以根据线程的优先级来进行一个分配 或者制定一个策略

好 那这就是tcb当中大致需要包含的一些内容 那有了tcb之后

每一个tcb这种数据结构就可以表示一个线程 那我们把多个线程的tcb给它组织起来 就可以形成一个线程表

组织的方式有很多种 比如说每个进程给他设置一张线程表

或者系统当中所有的线程组成一张线程表 当然也可以按照线程的状态不同

组织成不同的线程表 不同的系统可以采取不同的策略 总之 所谓线程的组织无非就是按照你的需求

把各个tcb有规律的 分门别类的把它们组织起来 分类管理 这就是线程的组织

那所谓线程的控制 就是要让线程在各种状态之间来回切换 这就是线程的控制

所以这两个部分新增的内容无非是把进程变成了线程而已 而线程往往比进程还要更简单

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

你可能感兴趣的:(操作系统,第二章进程与线程,#,进程与线程,java,jvm,开发语言,操作系统)