进程与线程
2021-05-07 07:14:19 30 举报
AI智能生成
操作系统进程与线程脑图
作者其他创作
大纲/内容
引入
程序执行的两种方式
顺序执行
顺序性
封闭性
独占全机资源,执行结果不受外界因素影响
可再现性
并发执行
间断性
执行-暂停-执行
失去封闭性
资源共享
不可再现性
进程引入目的
为了能使多个程序并发执行,并且可以对并发执行的程序加以描述和控制
进程
概念
进程是进程实体的运行过程,是系统进行资源调度和分配的一个独立单位。
进程实体(进程映像)是静态的,进程则是动态的。
基本属性
进程是一个可拥有资源的独立单位
同时又是一个可独立调度和分派的基本单位
进程实体(进程映像)组成
PCB
进程描述信息
进程标识符PID
用户标识符UID
进程控制和管理信息
CPU、磁盘、网络流量使用情况统计...
进程当前状态:就绪态/阻塞态/运行态...
资源分配清单
正在使用哪些文件、内存区域、I/O设备
处理机相关信息
如PSW、PC等各种寄存器的值(用于实现进程切换)
进程存在的唯一标识
程序段
程序的代码(指令序列)
数据段
运行过程中产生的各种数据。
特征
动态性
进程最基本的特性,进程是程序的一次执行过程,是动态的产生、变化和消亡的。由创建而产生,由调度而执行,由撤销而消亡
并发性
内存中有多个进程实体,各进程可并发执行
独立性
进程是能独立运行,独立获得资源,独立接收调度的基本单位。
异步性
各进程按各自独立的、不可预知的速度向前推进,可能导致运行结果的不确定性。操作系统要提供“进程同步机制”来解决异步问题
结构性
程序段、数据段、PCB构成进程
进程状态转换
状态
运行状态
CPU
其他所需资源
就绪状态
CPU
其他所需资源
阻塞状态
CPU
其他所需资源
创建状态
操作系统为新进程分配资源、创建PCB
终止状态
操作系统回收进程的资源、撤销PCB
进程状态间的转换
就绪态->运行态
进程被调度
运行态->就绪态
时间片到,或CPU被其他高优先级的进程抢占
运行态->阻塞态
等待系统资源分配,或等待某事件发生(主动行为)
阻塞态->就绪态
资源分配到位,等待的事件发生(被动行为)
创建态->就绪态
系统完成创建进程相关的工作
运行态->终止态
进程运行结束,或运行过程中遇到不可修复的的错误
进程组织方式
链接方式
按照进程状态把PCB分为多个队列
操作系统持有指向各个队列的指针
索引方式
根据进程状态不同,建立几张索引表
操作系统持有指向各个索引表的指针
进程控制
基本概念
进程控制就是实现进程状态的转换
进程控制用原语实现
原语用开/关中断来实现
原语是一种特殊的程序
原语的执行必须一气呵成,不可中断
相关原语
进程的创建
创建原语
分配进程标识号,申请空白PCB
为新进程分配所需资源
初始化PCB
将PCB插入就绪队列
引发进程创建的事件
用户登录
分时系统中,用户登录成功,系统会为其建立一个新的进程
作业调度
多道批处理系统中,有新的作业放入内存时,会为其建立一个新的进程
系统提供服务
用户向操作系统提出某些请求时,会新建一个进程处理该请求
用户程序的应用请求
由用户进程主动请求创建一个子进程
进程的终止
撤销原语
从PCB集合中找到终止进程的PCB
若进程处于执行态,立刻剥夺CPU,将CPU分配给其他进程
终止其所有子进程
将该进程所拥有的全部资源归还给其父进程或归还给操作系统
将该PCB从所在队列(链表)中删除
引发进程终止的事件
正常结束
进程自己请求终止(exit系统调用)
异常结束
越界错、保护错、非法指令、特权指令错、运行超时、等待超时、算术运算错、I/O故障
外界干预
进程应外界请求而终止运行。操作员或操作系统干预、父进程请求、因父进程终止
进程的阻塞
阻塞原语
找到要阻塞的进程对应的PCB
若该进程为运行态,则保护进程的运行现场,将PCB状态信息设置为“阻塞态”,暂时停止进程运行
将PCB插入相应事件的等待队列
引起进程阻塞的事件
向系统请求共享资源失败
等待某种操作的完成
新数据尚未到达
等待新任务的到达
进程的唤醒
唤醒原语
在事件等待队列中找到PCB
将PCB从等待队列中移除,设置进程为就绪态
将PCB插入就绪队列,等待被调度
引起进程唤醒的事件
等待的事件发生
因何事阻塞,就应由何事唤醒
进程的切换
切换原语
将运行环境信息存入PCB(保存处理机上下文,包括程序计数器和其他寄存器)
PCB移入相应队列
选择另一个进程执行,并更新其PCB
根据PCB恢复新进程所需的运行环境
引起进程切换的事件
当前进程时间片到
有更高优先级的进程到达
当前进程主动阻塞
当前进程终止
进程切花和处理机模式切换不同
模式切换时,处理机逻辑上可能还在同一进程中运行。
若进程因中断或异常进出入核心态运行,执行完后又回到用户态刚被中断的程序运行,则操作系统只需恢复进程进入内核时所保存的CPU现场,而无需改变当前进程的环境信息。但若要切换进程,当前运行进程改变了,则当前进程的环境信息也需要改变。
进程通信
低级进程通信:如信号量机制
效率低,通信对用户不透明
高级通信机制
共享存储器系统
设置一个共享空间
要互斥地访问共享空间
两种方式
基于数据结构(低级)
属于低级通信
基于存储区的共享(高级)
管道通信系统
设置一个特殊的共享文件(管道),其实就是一个缓冲区
一个管道只能实现半双工通信
实现双向同时通信要建立两个管道
各进程要互斥访问管道
写满时,不能再写。读空时,不能再读
没写满,不能读。没读空,不能写。
协调能力
互斥
同步
确定对方是否存在
消息传递系统
传递结构化的消息(消息头/消息体)
系统提供“发送/接受原语”
两种实现方式
直接消息传递系统
消息直接挂到接收方的消息缓冲队列里
间接(信箱)通信方式
消息发到中间体(信箱)
客户机-服务器系统
实现方式
套接字
基于文件型
基于网络型
远程过程调用
远程方法调用
优点:使用方便,通信过程对用户透明;高效地传送大量数据
同步与互斥
进程同步(直接制约关系)
并发性带来了异步性,有时需要通过进程同步解决这种异步问题。
有的进程之间需要相互配合地完成工作,各进程的工作推进需要遵循一定先后顺序
源于进程之间的相互合作
进程互斥(间接制约关系)
对临界资源的访问,需要互斥的进行。即同一时间段内只能允许一个进程访问该资源
四个部分
进入区
检查是否可进入临界区,若可进入,需要“上锁”
临界区
访问临界资源的那段代码
退出区
负责“解锁”
剩余区
其余代码部分
需要遵循的规则
空闲让进
临界区空闲时,应允许一个进程访问
忙则等待
临界区正在被访问时,其他试图访问的进程需要等待
有限等待
要在有限时间内进入临界区,保证不会饥饿
让权等待
进入不了临界区的进程,要释放处理机,防止忙等
实现方法
软件实现方法
单标志法
算法思想:两个进程在访问完临界区后会把使用的临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予。
在进入区只做“检查”,不“上锁”
在退出区把临界区的使用权转交给另一个进程
(相当于在退出区既给另一个进程“解锁”,又给自己“上锁”
主要问题:不遵循“空闲让进”原则
双标志先检查
在进入区“检查”后“上锁”,退出区“解锁”
主要问题:不遵循“忙则等待”原则
双标志后检查
在进入区先“加锁”后“检查”,退出区“解锁”
主要问题:不遵循“空闲让进,有限等待”原则,可能导致饥饿
Peterson算法
在进入区“主动争取-主动谦让-检查对方是否想进、己方是否谦让”
主要问题:不遵循“让权等待”原则,会发生“忙等”
硬件实现方法
中断屏蔽方法
使用“开/关中断”指令实现
优先:简单高效
缺点:只适用于单处理机,只适用于操作系统内核进程
TestAndSet(TS指令/TSL指令)
old记录是否已被上锁:再将lock设为true;检查临界区是否已被上锁(若已上锁,则循环重复前几步)
优点:实现简单;适用于多处理机环境;
缺点:不满足“让权等待”
Swap指令(XCHG指令)
由于共享资源
线程
引入
引入进程的目的是为了使多个程序能并发执行,以提高资源利用率和系统吞吐量
引入线程的目的则是为了减少程序在并发执行时所付出的时空开销,使OS具有更好的并发性。
重要特点
线程是处理机调度的单位,进程是资源分配的单位
同一进程的各线程共享该进程所拥有的的资源
同一进程内的线程切换不会导致进程切换
实现方式
线程的实现方式
用户级线程(ULT)
从用户视角能看到的线程,由线程库实现
内核级线程(KST)
从操作系统视角能看到的线程,由操作系统实现
(内核级线程才是处理机分配的单位)
组合方式(ULT/KST)
多线程模型
一对一模型
一个用户线程映射到一个内核支持线程
优:各个线程可分配到多核处理机并行执行,并发度高
缺:线程管理都需要操作系统支持,开销大
多对一模型
多个用户级线程映射到一个内核级线程
优:线程管理开销小,效率高
缺:一个线程阻塞导致整个进程都阻塞(并发度低)
多对多模型
n个用户级线程映射到m个内核支持线程(n>=m)
集二者之所长
信号量机制
分类
整型信号量
用一个整数型变量作为信号量,数值表示某种资源数
整型信号量与普通整型变量的区别:对信号量只能执行 初始化、P、V 三种操作
存在问题:不满足让权等待原则
记录型信号量
S.value 表示某种资源数,S.L指向等待 该资源的队列
P操作中,一定是先S.value--, 之后可能需要执行block原语(运行态->阻塞态)
V 操作中,一定是先 S.value++,之后可能执行wakeup原语(阻塞态->就绪态)
可以用记录型信号量实现系统资源的“申请”和“释放”
可以用记录型信号量实现进程同步、进程互斥
实现同步、互斥
实现进程互斥
分析问题,确定临界区
设置互斥信号量,初值为1
临界区之前对信号量执行P操作
临界区之后对信号量执行V操作
实现进程同步
分析问题,找出哪里需要实现“一前一后”的同步关系
设置同步信号量,初始值为0
在“前操作”之后执行V操作
在“后操作”之前执行P操作
实现进程的前驱关系
分析问题,画出前驱图,把每一对前驱关系都看成一个同步问题
为每一对前驱关系设置同步信号量,初值为0
在“前操作”之后执行V操作
在“后操作”之前执行P操作
例子
生产者-消费者问题
吸烟者问题
读者-写者问题
哲学家进餐问题
管程
引入
解决信号量机制编程麻烦、易出错的问题
定义
一个管程定义了一个数据结构和能为并发进程所执行(在该数据结构上)的一组操作,这组操作能同步进程和改变管程中的数据
组成
1、管程的名称
2、局部于管程的共享数据结构说明
3、对该数据结构进行操作的一组过程(函数)
4、对局部于管程的共享数据设置初始值的语句
基本特征
各外部进程/线程只能通过管程提供的 特定的“入口”才能访问共享数据
每次仅允许一个进程在管程内执行某个内部过程
和进程不同点
1、虽然二者都定义了数据结构,但进程定义的是私有数据结构PCB,管程定义的是公共数据结构
2、二者都存在对各自数据结构上的操作,但进程是由顺序程序执行有关操作,而管程主要是进行同步操作和初始化操作
3、设置进程的目的在于实现系统的并发性,而管程的设置则是解决共享资源的互斥问题
4、进程通过调用管程中的过程对共享数据结构实行操作,该过程就如通常的子程序一样被调用,因而管程为被动工作方式,进程则为主动工作方式
5、进程之间能并发执行,而管程则不能与其调用者并发
6、进程具有“动态性”,由创建而诞生,由撤销而消亡,而管程则是操作系统中的一个资源管理模块,供进程调用
补充
各进程必须互斥访问管程的特性是由编译器实现的
可在管程中设置条件变量及等待/唤醒操作以解决同步问题
0 条评论
下一页