进程
进程的基本概念
[!note] 顺序执行 顺序执行的特征: 1. 顺序性: 处理机严格按照程序规定的顺序指定程序 2. 封闭性: 程序独占所有资源, 不受其他程序影响 3. 可再现性:
顺序执行的问题: 1. 整体资源利用率低 - 并发执行的基本概念: 多道程序设计技术 - 并发执行的问题: 不可再现性 - 并发执行的特征: 1. 间断性: 由于资源共享, 程序执行具有"执行-暂停-执行"的特点 2. 失去封闭性: 程序不在独占所有资源, 运行收到其他程序的影响 3. 不可再现性: 程序执行结果收到其他程序的影响, 结果不定
进程
- 进程的特征:
- 动态性
- 并发性
- 独立性
- 异步性
- 结构特征:
- 程序段
- 数据段
- [[进程控制块]]
- 进程: 是系统进行资源分配和调度的独立单位
- 进程的三种基本状态:
- 就绪状态: 进程已经获得了处处理机之外的所有出资源, 一旦获得处理机就可以立即执行
- 执行状态: 一个进程已经获得了必要的资源, 正在处理机上运行
- 阻塞状态: 正在执行的进程, 由于发生了某些事件而暂停
[!note] 进程的状态 进程并非固定处于某种状态, 其状态会随着自身的运行和外界条件的变化而变化
- 基本状态之间的转换:
- 挂起状态的引入:
- [[进程的状态与转换|不同系统的进程的状态与转换]]
进程控制块(Process Control Block)
- 基本概念:
- OS管理进程的数据结构
- 进程控制块是进程存在的唯一标志
- 进程控制块所在的位置: 操作系统内核
[!note] PCB位于操作系统内核 只允许操作系统访问, 不允许进程本身访问, 因此存放在系统内核中
- PCB中的基本内容:
- 进程标志符
- 处理机状态
- 进程调度信息
- 进程控制信息
- PCB的两种组织方式:
- 链接方式
- 索引方式
进程控制
[!attention] 原语 指若干指令组成的程序段, 用来实现某个特定功能, 在执行过程不可被中断
进程的创建
- 引起创建的事件:
- 用户登录
- 作业调度
- 提供服务
- 应用请求
- 进程创建原语:
create()
- 进程创建的流程:
- 申请PCB
- 初始化PCB中的信息
- 设置状态为"就绪"
- 进程树:
[!note] 不同系统对进程的清理 - linux: - 删除一个进程, 是删除了进程树中的一棵子树 - windows: - 删除一个进程, 仅仅删除其本身 - 也可以选择删除进程树
进程的撤销
- 引起进程撤销的事件:
- 正常结束
- 异常结束
- 外界干预
- 进程撤销原语:
exit()
- 进程撤销的流程:
- 根据PCB获得该进程的状态
- 终止正在执行中的进程, 置调度标志为
true
, 指示被终止后应该重新进行调度 - 终止其子孙进程, 防止其称为不可控的进程
- 资源回收
- 移除PCB
进程的阻塞
- 引起阻塞的事件:
- 请求系统服务
- 请求操作
- 等待数据、资源
- 等待工作任务
- 进程阻塞原语:
block()
[!note] 阻塞 阻塞是由进程自己控制的 在程序编写时候, 由程序员添加到代码中, 用来获取进程运行所需要的资源等
进程的唤醒
- 引起进程环境的事件:
- 允许系统服务
- 允许操作
- 数据、资源到达
- 工作任务到达
- 唤醒的原语:
wakeup()
[!note] 唤醒 唤醒是由其他的进程进行的 进程被唤醒后并不是进入"执行"状态, 而是进入挂起状态, 重新与其他进程争夺处理机资源
进程的挂起
- 引起挂起的事件:
- 调试系统
- 暂停程序执行
- 进程挂起的原语:
suspend()
进程的激活
- 引起进程激活的事件:
- 调试系统结束
- 程序继续执行
- 进程激活的原语:
activate()
进程同步
[!note] 进程同步问题的产生 在多道程序的环境中, 系统中的多个进程可以并发执行, 同时他们又要共享系统中的资源, 这些资源有些是可共享使用的, 如磁盘, 有些是以独占方式使用的, 如打印机. 因此将会产生错综复杂的进程间相互制约的关系 - 两种形式的制约关系: - 间接相互制约关系: 共享某种系统资源 - 直接相互制约关系: 主要原语进程间的合作
- 临界资源: 不同进程间共享的资源
- 硬件资源: 打印机
- 软件资源: 共享内存, 文件, 消息队列
- 临界区: 进程中访问临界资源的代码称为临界区
- 临界区的访问控制模型:
-
OS重点同步机制所遵循的原则:
- 空闲让进: 当无进程处于临界区时, 请求进入临界区的进程可立即进入
- 忙则等待: 当已有进程进入临界区时, 其他试图进入临界区进程须等待
- 有限等待: 对要求访问临界资源进程, 保证能在有限时间内进入临界区
- 让权等待: 当进程不能进入临界区时, 应当释放处理机
实现线程同步的早期方法
按需访问
- 设置资源空闲标志
busy
- 问题:
- 当进程1通过
while(busy)
后, OS将处理机交给了进程2, 而因为此时busy==false
, 进程2同样可以正常运行, 当OS将处理机交回给进程1时, 就出现了冲突
- 当进程1通过
- 违背: 忙则等待, 让权等待, 有限等待
轮询
- 设置一个轮流标志
turn
:turn == 1
->P1turn == 2
->P2
- 问题: 访问的顺序固定: ...->1->2->1->2->...
- 违背: 让权等待, 有限等待
访前先看
- 愿望标志:
pturn
和qturn
- 问题: 如果两个进程在进入循环之前, 都将
turn
设置为了true
, 则会产生没有任何一个进程可以进入临界区 - 违背: 空闲让进, 让权等待, 有限等待