进程的概念、组成和特征
进程的概念
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
视频讲解:从一个程序执行过程进一步理解进程,包括代码段和数据段
进程的组成
一个进程实体(进程映像)由PCB、程序段、数据段组成。
进程是动态的,进程实体是静态的。进程实体反映了进程在某一时刻的状态。
PCB
数据结构PCB ( Process Control Block),即进程控制块。操作系统需要对各个并发运行的进程进行管理,但凡管理时所需要的信息,都会被放在PCB中。
PCB是进程唯一的标识!
PCB中存储了包括PID,UID(进程所属用户ID),进程运行情况等相关信息
当进程结束后,系统会回收PCB。
程序段和数据段
程序段:程序所包含的指令
数据段:程序产生的数据(如各种变量)
进程的特征
动态性
进程是程序的一次执行过程,是动态地产生、变化和消亡的。
动态性是进程最基本的特征。
并发性
内存中有多个进程实体,各进程可并发执行
独立性
进程是能独立运行、独立获得资源、独立接受调度的基本单位。
异步性
各进程按各自独立的、不可预知的速度向前推进, 操作系统要提供“进程同步机制”来解决异步问题。
结构性
每个进程都会配置一个PCB。结构上看,进程由程序段、数据段、PCB组成。
进程的状态与转换
进程的状态
创建态
进程正在被创建。包括建立空白PCB,由系统为进程分配资源等。
就绪态
进程获得了除了处理机外的一切资源。一旦获得了处理机资源就可以立刻开始运行,系统中处于就绪态的进程可以有很多个,通常将它们排成一个队列,称为就绪队列。
运行态
进程正在处理机上运行。单处理机情况下每个时刻最多只有一个进程在运行态。
阻塞态(等待态)
进程请求等待某个事件发生,在该事件完成前,即使处理机资源空闲,该进程也不能运行。例如请求了系统调用或者是等待某些资源。
中止态
进程正在结束。系统先将进程置为结束态,之后再进行资源的释放和回收等工作。
如果是多核CPU,可以存在多个运行态的进程
运行态、阻塞态和就绪态是进程的三种基本状态
进程状态的转换
- 两个不能
- 不能直接由阻塞态到运行态
- 不能直接由就绪态到阻塞态
- 转变模式
- 运行态到阻塞态一般是主动的行为
- 阻塞态到就绪态是被动的行为
- 题目1:进程的状态转换
I/O操作完成之前进程在等待结果,状态为阻塞态,完成后进程等待事件就绪,是就绪态
题目2:进程状态与处理器效率关系
进程的就绪数目越多,争夺CPU的进程就越多,但只要就绪队列不为空,CPU就一直保持繁忙,而当CPU不忙效率才下降
进程的组织方式
链式方式:将同一状态的PCB连接到同一个队列中;
索引方式:将同一状态的PCB放在一个索引表当中。
进程控制
进程控制是使用原语来实现的。
原语是指执行期间不允许中断的程序段,是一个不可分割的基本单位。
通过“关中断指令”和“开中断指令”实现了原语的原子性。
进程的创建
创建原语
- 申请空白PCB
- 为进程分配所需资源
- 初始化PCB
- 将PCB插入就绪队列(创建态→就绪态)
引起进程创建的事件
- 用户登录
- 作业调度(有新的作业将要运行)
- 提供服务
- 应用请求(用户进程主动请求创建子进程)
进程的终止
撤消原语
- 从PCB集合中找到终止进程的PCB
- 若进程正在运行,立刻剥夺CPU,将CPU分配给其他进程
- 中止其所有子进程
- 将该进程所有资源归还给父进程或是操作系统
- 删除PCB
引起进程中止的事件
- 正常结束
- 异常结束
- 外界干预
举例:
A:对
B:虚拟地址空间不可共享
C:每个进程PCB都不一样
D:对
进程的阻塞和唤醒
阻塞原语和唤醒原语必须成对使用
阻塞原语
- 找到要阻塞进程对应的PCB
- 保护进程运行现场,将进程设置为阻塞态,暂时停止进程运行
- 将PCB插入对应事件的等待队列
引发阻塞的事件
- 需要等待系统分配某种资源
- 需要等待合作的其他进程完成工作
唤醒原语
- 在事件队列中找到对应的PCB
- 将PCB从等待队列移除,设置为就绪态
- 将PCB插入就绪队列,等待被唤醒
引发唤醒的事件
- 等待的事件发生
进程的切换
切换原语
- 将运行环境信息存入PCB
- PCB移入相应队列
- 选择另一个进程执行,并更新其PCB
- 根据PCB回复进程所需的运行环境
运行环境:进程运行中的临时变量等视频讲解:运行环境
引起切换的事件
- 当前进程时间片到
- 更高优先级的进程到达
- 当前进程主动阻塞
- 当前进程中止
原语公共点
- 更新PCB中信息
- 将PCB插入合适队列
- 分配/回收资源
进程通信
共享存储
- 两个进程对共享空间的访问必须是互斥的。
- 操作系统只提供共享空间和同步互斥工具(如P,V操作)。
两种方式:基于数据结构的共享、基于存储区的共享
基于数据结构的共享
- 只能共享固定的数据结构
- 速度慢,是一种低级的共享方式
可以理解为低级全局变量
基于存储区的共享
- 共享方式和大小由进程自己决定
- 速度快,是一种高级的共享方式
管道通信
管道实际上是一个固定大小的缓冲区
- 管道通信只能实现半双工通信,想实现双向通信需要两个管道
- 各个进程对管道的访问也需要是互斥的
- 管道中没有写满(读空)时,不能向管道中再写(读)数据,会被阻塞
- 从管道中读取数据是一次性的,数据一旦被读取就会从管道中抛弃
- 一次只能有一个读进程
- 但是可以有多个写进程
消息传递
进程间的数据交换以格式化消息(message)为单位。
通过发送消息/接收消息两个原语进行数据交换
两种方式:直接通信方式、间接通信方式
直接通信方式
发送进程直接将消息发送到接收进程的消息缓冲队列中
间接通信方式
发送进程将消息发送到某个中间实体,一般称为_信箱_,接收端从中间实体接收消息
举例:两个进程交换数据的方法
线程的概念和特点
线程的概念
线程是程序执行的最小单元,是进程中的一个实体,是系统独立调度与分派的基本单位。
线程是程序执行的最小单元,是调度的基本单位
进程是资源分配的最小单元
线程的特点
- 调度:线程作为独立调度的基本单位,进程内的线程调度不会引起进程切换,开销变小
- 并发性:更好
- 进程之间可以并发运行
- 同一进程内的线程可以并发运行
- 不同进程间的线程可以并发执行
- 占有资源:线程几乎不占有资源
- 独立性
- 进程拥有独立的地址空间和资源
- 同一进程内的线程共享地址空间和资源
- 系统开销:当进行进程内线程的切换时,开销远小于进程
- 支持多处理机系统:可以将多个线程分配给多个处理机运行
举例:
- 题1:线程的特点
A:线程是处理机调度的基本单位,所以可以独立执行程序
B:线程没有自己独立的地址空间,而是共享所属进程的空间
C:进程能创建多个线程
D:由于共享内存空间,同一进程中的线程间通信无需使用系统调用函数
题2:线程与进程的关系
B,D:进程是资源分配的单位,内核级线程是处理器调度和分派的单位
A:假如有一个内核进程,映射到用户级后有多个线程,那么这些线程之间切换不需要内核级切换进程,也就不需要内核支持
线程的实现方式
线程库支持的线程(用户级线程 User-Level Thread, ULT)
线程切换由应用程序负责,在用户态下即可完成
线程表存储在用户空间,系统内核意识不到线程的存在
调度
操作系统为进程分配时间片
用户的调度程序再讲时间片分给线程
优点
- 线程的切换在用户态即可完成,开销小、效率高
缺点
- 当一个线程被阻塞后,其他线程都会被阻塞,并发度不高
内核支持的线程(内核级线程 Kernel-Level Thread)
内核级线程的管理工作由操作系统内核完成
内核的切换需要在内核态下实现
线程表存储在内核空间,内核态线程是操作系统内核能够看到的
调度
- 操作系统以线程为调度单位
优点
- 一个线程被阻塞后,其他线程继续运行,并发性强
缺点
- 线程的切换需要内核态,成本高、开销大
题目1:内核级线程
A:内核级线程切换相当于进程切换,所以系统开销大
B:内核线程不会堵死,用户线程会
C:内核线程之所以叫内核线程就是因为运行在内核,那么对应的进程也在内核
D:同B
题目2:用户级线程和内核级线程关系
A:没学到
B:用户级线程调度实际上调度对象是进程,所以需要内核参与
C:用户级线程实际上不存在,所以任何操作系统都能运行
D:同B
多线程模型
一对一模式
一个用户级线程映射一个内核级线程(一个UTL一个TCB)
并发能力强
开销大
多对一模式
将多个用户级线程映射到一个内核级线程,等同于用户级线程(多个UTL一个TCB)
效率高
并发能力弱;多个线程不能并行的运行在多处理机上
多对多模式
将n个用户级线程映射到m个内核级线程上(m <= n)
线程的资源共享
- 共享
- 进程的虚拟地址空间
- 独立
- 栈
用户级线程是代码逻辑的载体
内核级线程是运行机会的载体
线程的控制
线程的状态转换
线程的组织与控制
将TCB组织成线程表进行管理