首先注明:仍然是复习阶段,所以和课本可能有些许冲突和不同,只是图谱来自于王道考研2022操作系统,旨在快速梳理操作系统的基本知识
1.进程的定义,概念和特征:
多道程序环境下,多个程序并发执行,因此他们将会失去封闭性,不适宜于管理,所以引入了进程这种概念.
进程是程序的一次执行过程,是系统进行资源分配和调度的一个独立单位
进程是一个动态的过程,代表的是进程实体的运行,其中进行实体是静态的
(1)进程实体可以分为三部分:
1.PCB(进程控制块):系统通过进程控制块来感知进程的存在,进程的存在和删除也是对应PCB的创建和删除,这是一个数据结构,里面有描述进程基本的运行情况以及运行状态,是进程存在的唯一标志
2.程序段:也就是代码部分,同一段代码可以创建多个进程
3.数据段:就是进程在运行规程中所需要的数据
这三个部分构成了进程实体,是静态的部分
(2)进程的特征
进程具有动态性,并发,独立,异步,结构等特征
(3)进程的状态和转换
进程一共有五种状态(至少目前理解为五种,在一些考研书上是七种....)
分别为:
1.创建态:进程刚开始创建的时候是这个状态
2.就绪态:进程在等待处理机资源的时候是这个状态
3.运行态:运行态是进程在处理机中执行任务
4.阻塞态:当进程需要某种io或者资源而暂时获取不到的时候,进程会暂时进入阻塞状态
5.结束态:当进程执行完毕,或者出现了异常,则进入结束状
他们的转化关系如下所示
(注意一个可能会考的点,就是运行态到阻塞态是进程主动变化的,阻塞到就绪时被动的)
(4)关于进程的控制
进程控制主要包括进程的创建,终止阻塞唤醒,切换
在操作系统中,一般吧进程控制用的程序段称之为原语,原语的特点就是执行期间不许中断
调度指的是判断资源分配给哪个进程,是一种决策
执行是将资源分配给进程,是一种动作
(5)进程的通信:
进程的通信一共有三种方式
其实是有四种,因为通过PV传递信号量也是一种方式,但是相对来说比较低级
1.共享文件:指的是一片共享的文件空间,是同互斥工具,让每个进程都能访问到这个片其余,有数据结构和存储区两种实现方式
2.消息传递:使用操作系统一工地消息传递方法,在进程之间传递信息.有两种实现方式:第一种是直接发送信息,信息会挂载到收信者的消息缓冲队列下方.第二种简介通信,发送进程把消息发送到某个中间实体上.
3.管道:管道是一种单向的,互斥的结构,可以从一边读取,从另一边填入
当管道为空的时候,才可以向管道内填入数据,否则会发生阻塞
管道为满的时候,才能从管道向外读取数据,否则也会发生阻塞
2.关于线程
(1)线程的基本概念
引入线程的目的是未来减少程序在并发时候付出的开销,提高操作系统的并发性能.可以理解为一个轻量级的进程,同一个进程内的线程切换,是不需要修改上下文,也不需要修改资源
在传统的操作系统中,进程是资源调度和分配的基本单位.而在引入线程的操作系统中,线程是调度的基本单位,进程是调度的基本单位
线程几乎不拥有系统资源,但是可以访问所在进程的资源.线程之间可以并发进行,增加了吞吐量
(2)线程的实现方式:
线程有两种实现方式:
1.用户级线程,线程的管理都由应用陈鼓型实现,操作系统不知道这种线程的存在
2.内核级线程,线程的管理由内核完成,应用程序只有一个到达内核的接口,不能直接操作内核级线程,每个内核级别线程与应用程序的一个线程相关联
(多线程模型详见课本)
3.处理机调度
(1)处理机调度的概念:
进程数量一般远大于处理机数目,就要按一定的算法,将处理机资源分配给就绪队列中的进程,实现程序的并发执行
(2)调度的层次(不单是进程)
1.作业调度/高级调度:指的是把要执行的作业从外存拉到内存中
2.内存调度/中级调度:如果在内存中有的任务暂时无法执行,就要放回内存.同样,如果外存中有任务能执行了,就调回内存 此外在这个过程中PCB一直驻留在内存中等待变化
3.进程调度/低级调度:指的是在就绪队列中按照某种顺序和算法给进程分配处理机
另外补充三种不能进行进程调度的情况
在处理终端的过程中,不能进行进程的调度和切换
还有进程在操作系统内核临界区代码段,以及进行其他需要屏蔽中断的原子操作中,都不能进行切换进程和调度
(3)进程调度的方式
进程调度和切换无非就是两种方式
1.非抢夺式调度:就算现在有一个紧急任务需要处理机,但是现在处理机仍然先执行完正在执行的任务,也就是说,当前的进程只能主动终止
举例:程序运行成功自动退出,或者io操作阻塞
2.抢夺式调度:紧急任务可以剥夺处理机,也就是说当前的进程可以被强行打断
举例:时间片用完,更高优先级进行剥夺
(4)几种经典的调度算法:
1.先来先服务(FCFS)
先来先服务,顾名思义就是一个先进先出的队列,会按照顺序执行进程
2.短作业优先(SJF)
短作业优先算法会在就绪队列中寻找运行时间最短的进行执行
3.优先级调度(PP)
给进程设置优先级,会根据优先级进行执行
4.时间片轮转(LU)
分配时间片,如果任务小于时间片,则会退化为先来先服务算法
4.关于进程同步
(1)进程同步的相关概念
多道程序环境下进程是并发执行的,但是会出现一些问题
1.临界资源:临界资源指的是那些被不允许并行访问的资源,一次只能被一个进程使用,对于这些资源的访问必须互斥进行
2.临界区:临界区指的是访问临界资源的那部分代码
正常来说,如果想要访问临界资源,需要分为四个部分
进入区(判断能否进入临界区,并且设置标识)
临界区(访问临界资源的代码)
退出区(恢复标识)
剩余区(代码的其他部分)
(2)关于信号量
信号量机制是哟中用来解决同步和互斥的方法
使用两个原语wait(P)和signal(P),来对信号量进行+1和-1的操作,(也被称为P操作和V操作)
这两个原语也会在适当的时候发生阻塞
(3)关于管程和条件变量
除了信号量机制以外,管程也能用来处理同步和互斥方法
管程会把共享资源和访问这些资源的方法封装在一起,好像类一样,同一个时间内只允许一个进程进入管程完成操作,这个互斥机制是编译器实现的
如果某个进程不释放管程,则其他进程无法进入管程的捏,并且会被阻塞,阻塞的进程会放在一个队列中,这个队列就会被称作条件变量,根据不同的阻塞原因设置多个条件变量
如果对应条件满足,就会从某个条件变量中唤醒
5.关于死锁
死锁最简单的定义就是:资源的竞争,导致了死循环
死锁产生有四种必要条件,也是四个现象
(1)互斥:被争抢的资源无法共享
(2)不剥夺:无法通过剥夺来抢占资源
(3)保持并请求:死锁的进程自身抱有至少一个资源,并且还在试图获取别的资源
(4)循环等待:存在一个循环等待资源链,链中每个进程获得的资源都被其他进程请求
(另外注意,即使构成了循环等待链,也不一定是死锁,因为其他的进程(不在链中的)可能释放某个必要资源)
(2)处理死锁
1.死锁的预防
死锁的预防指的就是破坏上面四种情况:
(1)可以通过某些技术让资源能共享
(2)破解不剥夺有两种思路:第一种是如果一个进程进入死锁,就把被请求的资源全都吐出来.第二种是在操作系统的协助下,从别的进程身上剥夺资源
(3)保持并请求的破解方法为静态分配,在进程开始阶段就分配全部所需的进程,否则不运行
(4)循环的破解方法为给资源编号,进程只能按顺序请求资源,这个样可以保证已经被获取的资源不能被再次请求
2.死锁的避免
首先要说明一个概念:不安全队列
所谓不安全队列,其实指的是进程的推进顺序,如果某个推进顺序导致了资源分配不够而死锁,这个就算不安全队列.我们要避免进入不安全队列,防止死锁的发生
如果队列安全,则死锁一定可以避免.如果队列不安全其实也不一定死锁,因为其他进程可能会释放一些资源
银行家算法根本不会,笑死了