进程
概念
-
与程序的区别
- 1.程序:一个指令序列
- 2.进程是程序的执行(动态),程序是一组指令的有序集合(静态)
- 3.进程有诞生和死亡(生命期),程序是永久的
- 4.进程 = 程序+数据 +进程控制块PCB
- 5.一个程序可对应多个进程【程序的多次执行】
- 6.一个进程可包含多个程序
-
进程是进程实体的运行过程【强调 “动态性” 】,是系统资源分配和调度的一个独立单位
- 进程是动态的,进程实体是静态的
特征
- 动态性【最基本】
进程是程序的一次执行过程,是动态地产生、变化和消亡的 - 并发性
内存中有多个进程实体,各进程可并发执行 - 独立性
进程是能独立运行、独立获得资源、独立接受调度的基本单位 - 异步性
各进程以不可预知的速度向前推进,可能导致运行结果的不确定性 - 结构性
状态
-
运行【基本】
- 占有CPU,并在CPU上运行
- 单核处理机 → 最多一个进程处于运行态
-
就绪【基本】
- 已经具备运行条件,但由于没有空闲CPU暂时不能运行【万事俱备只欠CPU】
-
阻塞【基本】
- 因等待某一事件而暂时不能运行【提高CPU利用率,其他资源准备齐全最后才到CPU】
- 运行态 → 阻塞态 是一种进程自身做出的 主动行为 ,【保存进程运行环境、修改PCB内容和相应队列】
- 阻塞态 → 就绪态 不是进程自身能控制的,是一种 被动行为
-
创建
- 创建、初始化PCB
-
结束
- 运行结束/出bug导致无法执行,回收资源,撤销进程【删除PCB】
进程控制
-
基本概念
-
定义
进程控制的主要功能是对系统中的所有进程实施有效的管理,具有创建新进程、撤销已有进程、实现进程状态转换等功能
-
实现
用“原语”实现
原语特点:执行期间 不允许中断,只能一气呵成
关中断、开中断指令,只允许在核心态下执行的特权指令
不可中断的操作:原子操作
-
-
原语做什么
-
更新PCB中的信息【修改进程状态标志、将运行环境保存到PCB、从PCB恢复运行环境】
所有的进程控制原语一定都会修改进程状态标志
剥夺当前运行进程的CPU使用权必然需要保存其运行环境
某进程开始运行前必然要恢复运行环境 -
将PCB插入合适的队列
-
分配/回收资源
-
-
相关原语
-
创建【无→创建态→就绪态】
-
创建原语
申请空白PCB
为新进程分配资源
初始化PCB
将PCB插入就绪队列 -
引起进程创建事件
用户登录:分时系统中,用户登录成功,系统会为其建立个新的进程
作业调度:多道批处理系统中,有新的作业放入内存时,会为其建立新进程
提供服务:用户向操作系统提出某些请求时,会新建一个进程处理该请求
应用请求:由用户进程主动请求创建一个子进程
-
-
终止
-
撤消原语
从PCB集合中找到终止进程的PCB
若进程正在运行,立即剥夺CPU,将CPU分配给其他进程
终止其所有子进程
将该进程拥有的所有资源归还给父进程或系统
删除PCB -
引起进程终止的事件
正常结束
异常结束:bug
外界干预:任务管理器杀进程
-
-
阻塞与唤醒【成对使用】
-
阻塞【运行态→阻塞态】
-
阻塞原语
找到要阻塞的进程对应的PCB
保护进程运行现场,将PCB状态信息设置为“阻塞态”,暂时停止进程运行
将PCB插入相应事件的等待队列 -
引起进程阻塞的事件
需要等待系统分配某种资源
需要等待相互合作的其他进程完成工作
-
-
唤醒【阻塞态→就绪态】
-
唤醒原语
在事件等待队列中找到PCB
将PCB从等待队列移除,设置进程为就绪态
将PCB插入就绪队列,等待被调度 -
引起进程唤醒的事件
等待事件发生
因何事阻塞,就应由何事唤醒
-
-
-
切换【运行态→阻塞态/就绪态、就绪态→运行态】
-
切换原语
将运行环境信息存入PCB
PCB移入相应队列
选择另一个进程执行,并更新其PCB
根据PCB恢复新进程所需的运行环境 -
引起进程切换的事件
当前进程时间片到
有更高优先级的进程到达
当前进程主动阻塞
当前进程终止
-
-
-
组织【三部分构成进程实体(进程映像)】
-
进程的组成
-
进程控制块PCB【进程管理者所需的数据】
-
描述进程的各种信息【如代码存放位置】,是 进程存在的唯一标志
创建/撤销进程 → 创建/撤销进程实体中的PCB -
PCB内容
1.进程描述信息
①进程标识符PID【当进程被创建时,操作系统会为该进程分配一个唯一的、不重复的ID,用于区分不同进程
②用户标识符UID
2.进程控制和管理信息
①进程当前状态
②进程优先级
3.资源分配清单
①程序段指针
②数据段指针
③键盘
④鼠标
4.处理机相关信息
①各种寄存器值【当进程切换时需要把进程当前运行情况记录下来保存在PCB中,如程序计数器的值表示了当前程序执行到哪一句【保存现场】
-
-
程序段【程序实际运行所需的数据】
-
数据段【程序实际运行所需的数据】
-
-
进程的组织方式【多个进程之间的组织方式问题】
-
链接方式
- 按照进程状态将PCB分为多个队列
- 操作系统持有指向各个队列的指针
1.执行指针
【 指向当前运行状态的进程;单CPU计算机中,同一时刻只会有一个进程处于运行态】
2. 就绪队列指针
【 指向当前处于就绪态的进程;通常会把优先级高的进程放在队头
3. 阻塞队列指针
【 指向当前处于阻塞态的进程;根据阻塞原因不同,分为不同队列
-
索引方式
根据进程状态不同,建立几张索引表
操作系统持有指向各个索引表的指针
-
-
通信
-
进程通信:进程之间的信息交换
- 进程是分配系统资源的单位,各进程拥有的内存地址空间相互独立
- 为保证安全,一个进程不能直接访问另一个进程的地址空间
-
通信方法
-
共享存储
-
两个进程对共享空间的访问必须是互斥的【一个进程正在访问的时候另一个不能访问】
互斥通过操作系统提供工具实现
【 P、V操作【同步互斥】 -
基于数据结构的共享
只能放相同数据结构的数据
低级通信方式,速度慢、限制多 -
基于存储区的共享
内存中划出一块共享存储区,数据的形式、存放的位置都由进程控制,而非操作系统
高级通信方式,速度更快
-
-
消息传递
- 数据交换 - 格式化消息为单位【消息头、消息体】
- 原语:发送消息/接收消息
- 方式
-
直接通信方式
消息直接挂到接受进程的消息缓冲队列上
-
间接通信方式
先发送到中间实体【信箱】中
【 发送原语、接收原语
-
-
管道通信
- 用于连接读写进程的一个共享文件【pipe文件】,内存中开辟一个大小固定的缓冲区
- 半双工通信,某一时间段内只能实现单向传输;如果想要实现双向同时通信,则需设置两个管道
- 各进程要互斥地访问管道
- 数据 - 字符流,管道写满时,写进程的write()系统调用将被阻塞,读进程将数据全部取走后,管道变空,读进程的read()系统调用被阻塞
- 没写满,不能读;没读空,不能写;写满时,不能再写;读空时,不能再读
- 数据一旦被读出,就从管道中被抛弃,即读进程最多只能有一个,否则可能会读错数据
-