一.进程的基本概述
1.1 进程的概念
程序:是静态的,是存放在磁盘里的可执行文件,即一系列的指令集合
进程:是动态的,是程序的一次执行过程
进程控制块(PCB): PCB是进程存在的唯一标志,当进程被创建时,操作系统为其创建PCB,当进程结束时,会回收其PCB
进程的组成:
一个进程实体(进程映像)由PCB、程序段、数据段组成
进程是动态的,进程实体(进程映像)是静态的
进程实体反应了进程在某一时刻的状态
引入进程实体的概念后,进程定义为:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
1.2 进程的特征
1.3 进程的状态与转换
五状态模型:
不能由阻塞态直接转为运行态,也不能由就绪态直接转换为阻塞态,因为进入阻塞态是进程主动请求的,必然需要进程在运行时才能发出这种请求。
1.4 进程的组织(了解)
二.进程控制
一般把进程控制用的程序段称为原语
原语的特点:执行期间不允许中断,是一个不可分割的基本单位。
2.1 进程的创建
操作系统创建一个新进程的过程如下(创建原语):
- 为新进程分配一个唯一的进程标识号,并申请一个空白的PCB
- 为进程分配资源,若资源不足,则并不是创建失败,而是出于阻塞态,等待内存资源
- 初始化PCB
- 若进程就绪队列能够接纳新进程,则将新进程插入就绪队列,等待被调度运行。
2.2 进程的终止
引起进程终止的事件主要有:
- 正常结束
- 异常结束 如存储区越界,保护错,非法指令等
- 外界干预
操作系统终止进程的过程如下(撤销原语): - 根据被终止进程的标识符,检索PCB,读出进程的状态
- 若被终止进程处于执行状态,立即终止该进程的执行,将处理机资源分配给其他进程
- 若该进程还有子孙进程,则应当将其所有子孙进程终止
- 将该进程的所有资源,或归还给父进程,或者归还给操作系统
- 将该PCB从所在队列中删除
2.3 进程的阻塞与唤醒
阻塞原语:运行态 - > 阻塞态
唤醒原语:阻塞态 - > 就绪态
2.4 进程的切换
调度是一种决策行为,切换是指实际分配的行为,是执行行为
现有资源的调度,然后才有进程的切换
三.进程通信
3.1 共享存储
两个进程对共享空间的访问必须是互斥的,操作系统只负责提供共享空间和同步互斥工具(如PV操作)
分为两种:
- 基于数据结构的共享
- 基于存储区的共享
3.2 管道通信
管道 是指用于连接读写进程的一个共享文件, 其实就是在内存中开辟一个大小固定的缓冲区
管道只能是半双工通信
读进程最多只有一个
各进程互斥访问管道
3.3 消息传递
进程间的数据交换以格式化的消息为单位
系统提供发送/接受原语
两种方式:直接通信 间接通信方式
四.线程
4.1 线程基本概述
引入线程的目的:为了减小程序在并发执行时所付出的时空开销,提高操作系统的并发性能
线程是进程中的一个实体,是被系统独立调度和分派的基本单位
4.2 线程实现方式
4.2.1 用户级线程
从用户视角看到的线程,线程库实现
所有工作由应用程序完成,内核意识不到线程的存在
应用程序可以通过使用线程库设计成多线程程序
优点:开销小 效率高
缺点:并发度不高,多个线程不可在多核处理机上并行运行
4.2.2 内核级线程
操作系统视角看到的线程,操作系统实现
线程管理工作由内核完成
应用程序没有进行线程管理的代码
优点:并发能力强 多线程可以在多核处理机上并行执行
缺点:线程切换由OS内核完成,需要切换到核心态,成本高,开销大
4.2.3 多线程模型
五.处理机调度
5.1 概念
调度:从就绪队列中按照一定的算法选择一个进程并将处理机分配给他运行,以实现进程并发地执行
5.1.1 调度的三个层次
5.1.2 进程的挂起态和七状态模型
5.2 进程调度的时机和方式
5.2.1 进程调度的时机
5.2.1 进程调度的方式
- 非剥夺调度方式:主动放弃 适合早期批处理系统
- 剥夺调度方式:被动放弃 适合分时操作系统、实时操作系统
进程切换是有代价的,过于频繁的调度、切换,会导致整个系统的效率降低
5.3 进程调度算法的评价指标
5.4 调度算法
5.4.1 先来先服务(FCFS)
5.4.2 短作业优先(SJF)
非抢占式短作业优先(SJF)
抢占式短作业优先(SRTN)
5.4.3 高响应比优先调度算法
5.4.4 优先级调度算法
5.4.5 时间片轮转算法
5.4.6 多级反馈队列调度算法
5.5 进程同步和进程异步
5.5.1 进程互斥的软件实现方法
1.单标志法:
turn变量背后的逻辑:表达 “谦让”
- 是否轮到自己用(检查)
- 访问临界资源
- 下次让别人用(谦让)
- 做其他事情
不遵循空闲让进原则
2.双标志先检查法:
主要问题:违反忙则等待原则
原因在于:进入区的检查和上锁两个处理不是一气呵成的,检查后,上锁前可能发生进程切换
3.双标志后检查法:
主要问题:虽然解决了忙则等待问题,但是又违背了空闲让进和有限等待原则,会因各进程长期无法访问临界资源而产生饥饿现象
4.Peterson法:
遵循了空闲让进、忙则等待、有限等待原则,但是未遵循让权等待原则
5.5.2 进程互斥的硬件实现方法
5.5.3 信号量机制
信号量表示系统中某种资源的数量,就是一个变量
原语是一种特殊的程序段,执行只能一气呵成,不能被中断
一对原语:P(S)、V(S) 即:wait(S)和signal(S)
1.整型信号量:
2.记录型信号量:
5.5.4 生产者-消费者问题
实现互斥的P操作一定要在实现同步的P操作之后
5.5.5 多生产者-多消费者问题
5.5.6 吸烟者问题
5.5.7 读者-写者问题
5.5.8 哲学家进餐问题
5.6 管程
管程是一种特殊的软件模块,保证了进程互斥,无需程序员自己实现进程互斥
基本特征:
- 局部与管程的数据只能被局部于管程的过程所访问
- 一个进程只有通过调用管程内的过程才能进入管程访问共享数据
- 每次仅允许一个进程在管程内执行某个内部过程
各进程必须互斥访问管程的特征是由编译器实现的
可在管程中设置条件变量及等待 / 唤醒操作以解决同步问题
Java中类似于synchronized 关键字
5.7 死锁
定义:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进
5.7.1 死锁、饥饿、死循环区分
5.7.2 死锁产生的必要条件
- 互斥条件:对必须互斥访问的资源的争抢才可会导致死锁
- 不可剥夺条件:进程保持的资源只能主动释放,不可强行剥夺
- 请求并保持条件:保持着某些资源不放的同时,请求别的资源
- 循环等待条件:存在一种进程资源的循环等待链
发生死锁时一定有循环等待,发生循环等待时不一定发生死锁
5.7.3 死锁产生的原因
- 对系统资源的竞争
- 进程推进顺序非法
- 信号量的使用不当
总结一句话:对不可剥夺资源的不合理分配,可能导致死锁
5.7.4 死锁的处理策略
1.预防死锁:
2.死锁避免:(银行家算法)
安全序列:如果系统按照这种序列分配资源,则每个进程都能够顺利完成,只要找出一个安全序列,系统就是安全状态,当然,安全序列可能有多个
如果找不到一个安全序列,那么系统就进入了不安全状态
处于不安全状态未必是发生了死锁,但发生死锁一定是在不安全状态下
银行家算法:
3.死锁的检测和解除:
- 死锁的检测:
- 死锁的解除:
1.资源剥夺法
2.撤销进程法
3.进程回退法