第二章 Part1 进程与线程
第一节 进程相关
进程的定义
程序:一个指令序列
引入多道程序之后,内存中有多道程序,OS需要找到内存中程序数据的位置、清楚分配了那些系统资源
方便并发,引入
进程
、进程实体
的概念进程:
创建进程,就是创建PCB(进程控制块,一种数据结构,用来描述进程信息)
PCB是进程存在的唯一标识
进程是进程实体的运行过程
进程是OS进行资源分配和资源调度的单位
PCB:进程控制块
进程描述信息
进程标识符
PID
:进程被创建时分配用户标识符
UID
:标志进程所属用户进程控制和管理信息
进程当前状态
进程优先级
资源分配清单:进程被分配到了那些进程资源
程序段指针
数据段指针
键盘
鼠标
处理机相关信息
各种寄存器的值:用于进程的切换
- 进程实体:
- 进程实体是静态的、是数据的集合;进程则是指运行过程,是动态的
一般可以认为
进程实体
=进程
进程的组成
即进程实体的组成
- PCB
- 程序段:代码
- 数据段:程序执行产生的数据
进程的组织方式:组织多个
PCB
的方式
- 链接方式
按照进程状态将PCB分为多个队列
操作系统持有各队列指针
- 索引方式
进程状态分类建立索引表
操作系统持有各索引表
进程的特征:相较于程序
- 动态性:进程是程序的执行过程,能动态的产生、变化和消亡。动态性是程序最基本的特征
并发性:和并行的区别
独立性:进程是能独立运行、独立获得资源、独立接受调度的基本单位
异步性:各进程具有不确定性。需要操作系统进程进程同步
结构性
第二节 进程的状态与转换
进程的状态
三种基本状态
运行态:占有CPU,并且在CPU上运行
就绪态:已经具备运行条件但是由于没有空闲CPU,所以暂时不能运行
阻塞态:因等待某一件事情而暂时不能运行(如等待磁盘的读取)
创建状态:初始化PCB,分配UID等
终止状态:运行结束或者程序错误,OS回收分配给进程的资源,撤销PCB
进程状态的转换
就绪态 -> 运行态
运行态 -> 就绪态
运行态 -> 阻塞态:进程自身主动行为
阻塞态 -> 就绪态:进程被动行为
不能从
阻塞态
直接转化为运行态
,也不能由就绪态
直接转化为阻塞态
第三节 进程控制
基本概念
什么是进程控制:实现进程状态的转换
如何实现进程控制:通过
原语
原语
的特点是执行期间不允许中断,此类操作又被成为原子操作
原语
不中断的特性由开中断
和关中断
两个指令实现,属于核心态
下的特权指令
。保存\回复运行环境
修改PCB内容
原语的三类任务
更新PCB信息(如修改状态标志、将运行环境保存到PCB、从PCB恢复运行环境)
- 所有进程控制原语一定会修改进程的状态标志
- 剥夺当前进程的CPU使用权必然需要保存其运行环境
- 进程开始运行前必须回复运行环境
将PCB插入合适的队列
分配和回收资源
进程控制相关的原语
进程的创建
创建原语:无 -> 创建态 -> 就绪态
申请空白PCB
为新进程分配资源
初始化PCB
将PCB插入就绪队列
引起创建的事件
用户登录:用户登录成功后为其创建一个用户进程
作业调度:多道批处理系统中有新作业加入时为其创建新进程
提供服务:操作系统创建新进程为用户的请求服务
应用请求:用户进程请求创建子进程
进程的终止
撤销原语
- PCB集合中找到终止进程的PCB
- 若进程正在允许,立即剥夺CPU,并将CPU重新分配
- 终止该进程所有子进程
- 将资源还给父进程或OS
- 删除PCB
引起终止的操作
正常结束
异常结束
外接干预
进程的阻塞
阻塞原语(必须和唤醒原语同时出现)
- 找到要阻塞的PCB
- 保护进程运行现场,将PCB设定为阻塞态,暂时停止程序运行
- 将PCB插入相应事件的等待序列
引起阻塞的操作
需要等待系统分配资源
需要等待其他线程完成工作
进程的唤醒
唤醒原语
- 等待事件队列中找到PCB
- 将PCB从等待队列移除,程序由阻塞态变为就绪态
- 将PCB插入就绪队列,等待被调度
引起唤醒的操作
被阻塞的条件已经满足
进程的切换
切换原语
- 运行换机存入PCB
- PCB移入相应队列
- 选择另一个程序执行,并更新对应PCB
- 根据PCB恢复该进程的运行环境
引起进程切换的操作
进程时间片到
高优先级线程
阻塞
终止
第三节 进程通信
进程间的信息交换
各进程间的内存地址相互独立(保证系统安全)
- 共享存储:互斥的访问共享空间
基于数据结构的共享:如定义一个数组(慢,低级通信方式)
基于存储区的共享:由进程相互决定(快,高级通信方式)
- 消息传递
以格式化消息Message为单位,通过”发送消息“和”接受消息“两个原语进行数据交换
消息头 + 消息体(类计网的报文)
直接通信:消息直接挂在接收进程的消息缓冲队列上
间接通信:消息发送到中间实体(信箱通信方式)
- 管道通信
内存中用于连续写的一个共享文件
又名
pipe
文件本质是内存中开辟的一个大小固定的缓冲区
- 管道只能实现
半双工通信
:同一时间段单向传输,各进程互斥的访问管道- (同时)双向通信需要设置两个管道
- 管道写满时,写进程
write()
将会被阻塞,不能再写;数据被取走、管道变空,读进程read()
被阻塞,不能再读。- 先写满再读,读完后再写
- 读进程只有一个
第四节 线程、多线程模型
为什么有线程
传统上,进程是程序执行的最小单位
将一个进程分为多个线程,线程成为代码执行的最小单位
- 线程是CPU的基本执行单元,是程序执行的最小单位
引入线程机制后的变化
并发性:(不仅仅进程可以并发),线程也可以并发,提升系统并发度
资源分配:进程只作为CPU之外的系统资源的分配单元,线程是CPU调度的基本单位
系统开销:同进程不同线程(功能)间切换时,不需要切换进程,减小系统开销
线程的属性
- 线程是处理器调度单位,进程是资源分配单位
处理器调度单位
多核心时,不同线程可以占用不同CPU
每个线程有自己的线程ID,线程控制块TCB(
thread control block
)线程也有就绪、阻塞、运行三种状态
线程共享系统资源(由于共享内存空间,进程通信无需系统干预)
线程的实现
用户级线程(用户视角才”关注“的线程)
用户级线程管理由应用程序负责
用户级线程切换在用户态下可完成
内核级线程(OS视角关注的线程)
- 用户级线程管理由OS负责
- 内核级线程切换在核心态下才能完成
- 内核级线程才是处理器分配的单位
多线程模型
多对一模型:多个用户级线程映射到一个内核级线程
优点:用户级线程切换不需要OS干预
缺点:只有一个内核级线程,故只能运行在一个核心上,并发性不佳
一对一模型:一个用户级线程映射到一个内核级线程
优点:并发性佳,可以利用多核心
缺点:用户级线程切换需要OS干预,效率低
多对多模型:将n个用户级线程映射到m个内核级线程(n>=m)
高并发,低切换开销