进程与线程🌟
2020-09-26 本文已影响0人
幺姨母
进程的定义
程序:一个指令序列
进程控制块🌟
PCB,系统为每个运行的程序配置一个数据结构PCB,用来描述进程的各种信息(如程序代码存放位置)
- 进程描述信息:进程标识符PID、用户标识符UID
- 进程控制和管理信息:进程当前状态、进程优先级
- 资源分配清单:程序段指针、数据段指针、键盘、鼠标
- CPU相关信息:各种寄存器值
进程映像🌟
程序段、数据段、PCB
PCB是进程存在的唯一标志
进程是程序的一次执行过程
进程的组织
进程的组织方式
- 链接方式
执行指针:指向当前处于运行态的进程
就绪队列指针:指向当前处于就绪态的进程
阻塞队列指针:指向当前处于阻塞态的进程,可能会根据阻塞原因分成多个阻塞队列
执行指针———>PCB2
就绪队列指针———>PCB5——>PCB1——>PCB4
阻塞队列指针———>PCB3——>PCB7——>PCB6 - 索引方式
就绪表指针指向就绪索引表,索引表项指向相应进程
阻塞表指针指向阻塞索引表,索引表项指向相应进程
进程的特征
- 动态性:最基本的特征,进程是程序的一次执行过程,是动态产生、变化和消亡的
- 并发性:内存中有多个进程实体,各进程可并发执行
- 独立性:进程是能独立运行、独立获得资源、独立接受调度的基本单位
- 异步性:各进程按各自独立的、不可预知的速度向前推进,操作系统要提供“进程同步机制”来解决异步问题
- 结构性:每个进程都会配置一个PCB,结构上看,进程是由程序段、数据段、PCB组成
进程的状态
三种基本状态🌟
- 运行态:占有CPU,并在CPU上运行。单核处理器,每一时刻只能有一个进程处于运行态
- 就绪态:已具备运行条件,没有空闲CPU,暂时不能运行
- 阻塞态:等待某一事件而暂时不能运行。比如等待系统分配打印机、等待读磁盘操作的结果
另两种状态🌟
- 创建态:分配所需内存等资源,创建初始化PCB
- 终止态:进程运行结束或者发生bug导致进程无法继续执行需要撤销进程。回收进程所拥有的资源,撤销PCB
进程状态的转换🌟
- 就绪态——运行态:进程被调度
- 运行态——就绪态:时间片到、CPU被更高优先级的进程抢占
- 运行态——阻塞态:等待系统资源分配、等待某事件发生
- 阻塞态——就绪态:资源分配到位、等待的事件发生
- 创建态——就绪态:系统完成创建进程相关的工作
- 运行态——终止态:进程运行结束、运行过程中发生不可修复的错误
进程控制
实现进程状态的转换
进程控制的原语
- 更新PCB中的信息,如修改进程状态标志,将运行环境保存到PCB,从PCB恢复运行环境
1.1. 所有进程控制原语一定会修改进程状态标志
1.2. 剥夺当前运行进程的CPU使用权必然需要保存其运行环境
1.3. 某进程开始运行前必然要恢复其运行环境 - 将PCB插入到合适的队列
- 分配/回收资源
创建原语
- 申请空白PCB
- 为新进程分配所需资源
- 初始化PCB
- 将PCB插入到就绪队列
引起进程创建的事件
- 用户登录:分时系统中,用户登录成功,系统会为其建立一个新的进程
- 作业调度:多道批处理系统中,有新的作业放入内存时,会为其建立一个新进程
- 提供服务:用户向操作系统提出某些请求时,会新建一个进程处理该请求
- 应用请求:由用户进程主动请求创建一个子进程
撤销原语
- 从PCB集合中找到终止进程的PCB
- 若进程正在运行,立即剥夺CPU,将CPU分配给其他进程
- 终止其所有子进程
- 将该进程拥有的所有资源归还给父进程或操作系统
- 删除PCB
引起进程撤销的事件
- 正常结束
- 异常结束
- 外界干预
阻塞原语
- 找到要阻塞的进程对应PCB
- 保护进程运行现场,将PCB状态信息设置为“阻塞态”,暂时停止进程运行
- 将PCB插入相应的等待队列
引起进程阻塞的事件
- 等待系统分配资源
- 等待相互合作的其他进程完成工作
唤醒原语
- 在事件等待队列中找到PCB
- 将PCB从等待队列中移除,设置进程为“就绪态”
- 将PCB插入到就绪队列,等待调度
引起进程唤醒的事件
- 等待的事件发生
切换原语
- 将运行环境信息存入PCB
- PCB移入相应队列
- 选择另一个进程执行,并更新其PCB
- 根据PCB恢复新进程所需的运行环境
引起进程切换的事件
- 当前进程时间片到
- 有更高优先级的进程到达
- 当前进程主动阻塞
- 当前进程终止
进程通信🌟
- 共享存储:在内存中划出一块共享存储区,两个进程对共享存储区的访问必须是互斥的
- 管道通信:用于连接读写进程的一个共享文件,就是在内存中开辟一个大小固定的缓冲区
只能采用半双工通信,某一时间段内只能实现单向的传输
如果要实现双向同时通信,需要设置两个管道
各进程要互斥访问管道
数据以字节流形式写入管道
写满后不能再写,读空后不能再读
没写满不能读,没读空不能写
数据一旦读出,就从管道中抛弃,意味着读进程最多只能有一个,否则可能会有读错数据的情况 - 消息队列:数据交换以格式化的消息为单位,进程通过操作系统提供的发送/接收消息两个原语进行数据交换
3.1. 消息头:发送进程ID、接收进程ID、消息类型、消息长度等信息
3.2. 消息体
直接通信方式:消息直接挂到接收进程的消息缓冲队列上
间接通信方式:写进程通过发送原语将消息发送到信箱,读进程再通过接收原语将消息从信箱取出
线程
线程引入的变化🌟
- 资源分配、调度
1.1. 进程是资源分配的单位,线程是CPU调度的单位
1.2. 每个进程独享地址空间,同一进程的线程共享进程的地址空间 - 进程切换需要切换进程的运行环境,开销大,同一进程的线程切换不需要切换进程环境,并发带来的系统开销小
- 进程之间的通信需要操作系统干预,同一进程的线程由于共享进程地址空间,通信不需要操作系统干预
线程的属性
- 线程是CPU调度的单位
- 多CPU计算机中,各个线程可占用不同的CPU
- 每个线程都有一个tid,线程控制块TCB
- 线程也有就绪、阻塞、运行三种基本状态
- 线程几乎不拥有系统资源
- 同一进程的不同线程件共享进程的资源
- 由于共享内存地址空间,同一进程中的线程通信无需系统干预
- 同一进程中的线程切换不会引起进程切换
- 不同进程中的线程切换会引起进程切换
- 切换同进程内的线程,系统开销小
- 切换进程,系统开销大
线程的实现方式🌟
- 用户级线程
由应用程序通过线程库实现,所有的线程管理工作都由应用程序负责,包括线程切换
用户级线程中,线程切换可以在用户态下完成,无需操作系统干预
协程?////////// - 内核级线程
内核级线程的管理工作由操作系统内核完成,线程调度、切换等工作都由内核负责
内核级线程的切换必须在核心态下完成
内核级线程才是CPU分配的单位
多线程模型:用户级线程到内核级线程的映射🌟
- 多对一模型
多个用户级线程映射到一个内核级线程,每个用户进程只对应一个内核级线程
优点:用户级线程的切换在用户态即可完成,不需要切换到核心态,线程管理的系统开销小,效率高
缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高,多个线程不能在多核CPU上并行运行 - 一对一模型
一个用户级线程对应一个内核级线程,每个用户进程对应由于用户级线程同数量的内核级线程
优点:当一个线程被阻塞,别的线程还可以继续执行,并发能力强,多线程可以在多核CPU上并行运行
缺点:一个用户进程可能占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大 - 多对多模型
n用户级线程映射到m各内核级线程,每个用户进程对应m各内核级线程(n≥m)
克服了多对一模型并发度不高的问题,也克服了一对一模型一个用户进程占用太多内核级线程开销大的问题