操作系统考研复试复习-2
第二部分:进程管理
回答问题应该从是什么,为什么,如果是一种解决问题的方案就说有什么优点,有什么缺点的顺序进行思考和回答;如果是一种问题就说解决问题的方法有哪些?
1,关于进程
1,是什么?
进程就是运行中的程序,是资源分配和调度(没有线程的话)的独立单位。
进程实体(进程映像)=PCB+程序段+相关数据段
PCB是什么?
PCB是记录进程信息的数据结构,是OS为管理进程的调度和运行而创建的,每一个进程都有一个对应的PCB,随着进程的创建而创建,消失而消失,是进程存在的唯一标志。
2,为什么要有进程?
因为现代操作系统需要实现CPU的虚拟化,即一个CPU等于逻辑上的多个CPU,需要实现多个程序在一段时间间隔内同时运行,所以同一段时间中可能有多个程序在电脑上切换运行(为了实现并发),会破坏程序之间的封闭性,需要有个数据结构来划分清除程序之间的界限。
3,单个进程的状态转换
创建态:为进程创建PCB,分配资源和内存空间
就绪态:加入相应的就绪队列中,等待上CPU运行(所有的资源只差CPU)
执行态:在CPU上运行
阻塞态:进程调用了系统调用,申请某个资源(等待资源),是主动行为,当资源到来时进入就绪态
终止态:执行完毕,或异常结束。
如何控制进程之间的状态转换呢?
利用原语来实现:原语是一种执行期间不允许中断,不可分割的程序段。(不可分割可以用开中段和关中断)
4,多个进程之间的通信
进程之间是如何配合的?
(1)共享存储:
低级: 基于数据结构 速度较慢
高级:基于存储区 速度较快
(2)消息传递:
直接通信方式:直接发送给接收进程,并挂入其消息缓冲队列上
间接通信方式:通过中间实体:信箱,来传递消息
(3)管道通信:
通过Pipe文件来实现,半双工通信
pipe文件的性质:pipe为一片内存缓冲区,读文件为一次性操作,读出就消失(允许一个读,多个写)
当pipe为空的时候,读进程被阻塞,当pipe文件满的时候,写进程被阻塞
2,关于线程
是什么?
在有线程的计算机中,线程是调度的基本单位(线程是处理机的分配单元),而进程只是资源分配的基本单位,线程自己不拥有资源,与其它线程共享进程资源。
为什么要有线程?
减少调度时的切换开销,提高OS的并发
进程的实现方式?
(1)用户级线程:只存在于应用软件中,操作系统内核看不见,线程切换在用户态
(2)内核级线程:由操作系统实现切换和调度,处理机分配和调度的单位。
多线程模型:分为多对一(用户级线程),一对一(内核级线程),多对多(n个线程映射到m和内核级线程)
线程之间的通信?
3,处理机调度(调度是通过中断实现的)
1,处理机调度的层次
(1)作业调度(长程\高级调度),面向作业的调度
把作业存中取出,分配内存和PCB,成为一个进程。每一个作业只会经历一次作业调度的调入和调出
(2)内存调度(中级调度),面向进程
当内存空间不够时,将某一些不经常用的进程换出内存,暂时挂起;当他们可以运行时,根据内存调度算法,选择一些进程重新进入内存,进入就绪队列。
(3)进程调度(低级调度),面向进程
多个进程竞争CPU的调度情况,按照调度算法从就绪队列选出一个进程上处理机运行。调度频率非常高
2,不能进行调度的情况
(1)在执行操作系统内核程序的临界区
(2)原语执行中(关中断状态)
(3)中断处理中
3,调度算法
(1)FCFS:长作业有利,CPU繁忙有利,IO繁忙不利
(2)SJF:容易造成饥饿现象
(3)高响应比优先:给每一个进程安排一个响应比作为优先级(等待时间+要求服务时间)/要求服务时间
(4)时间片轮转:(一定是抢占式的)
(5)多级反馈队列:多个就绪队列,每一个队列有不同的优先级,队内可能有不同的调度算法(可能会导致饥饿),每一个进程都先进入优先级高的队列运行一个时间片,如果没有运行完毕就进入第二个队列,仅当优先级队列为空的情况下CPU才会运行优先级低的队列。
(6)优先级调度:优先级如何设计?系统进程 > 用户进程, IO型 > 计算型 ,
前台进程 > 后台进程
4,进程同步问题
1,同步与互斥是什么?
同步:是指一些进程的某些语句必须在另个进程的某些语句之前或之后运行
即进程之间的合作问题,有序推进
互斥:指进程之间的竞争关系,访问临界资源,需要互斥访问的资源时
临界资源:在一段时间内只能由一个进程使用。比如打印机
共享资源:在一段时间内可以共同使用(宏观上可以共同使用)比如硬盘
进程互斥的原则?空闲让进,忙则等待,有限等待,让权等待
2,如何实现同步与互斥?
(1)软件上:
单标志法:设置一个turn变量,每一个进程退出临界区之后,将turn变量的值设为对方的序号,主动让出资源 缺陷:两个变量只能交替访问临界区违反了空闲让进
双标志法先检查法:设置flag数组,要访问临界区时先检查flag数组,即检查对方是否在用,如果不在用的话,将自己对应值置为1,表示自己在用,退出临界区之后将flag数组对应位置为0, 缺点:先检查法在程序并发进行时容易造成两个进程同时进入临界区,违反了忙则等待
双标志法后检查法:与先检查相反,先将自己的flag值置为1,再检查别人的flag值。
缺点:容易造成空闲让进(两个进程都将自己的flag值置为1)
Peterson算法:
用flag数组和turn变量,先表示,后谦让,最后一个谦让的进程等待
但不满足有限等待
(2)硬件上:
中断屏蔽:通过关中断的方式
硬件指令:TSL指令和Exchange指令(一气呵成)
原理?
共享变量lock来协调对内存的访问,lock=0,可以访问,lock=1,不可以访问
当某一个进程想要访问内存时:复制lock的值到寄存器中,将lock置为1,然后检查寄存器中的值是否为零,如果不为零表示之前已经被上锁,内存中存在其他进程,则该进程之后循环检查(重复上面的操作),直到某一个时刻寄存器中lock变为0,则表明可以进入
每一个进程退出后,将lock置为0.
信号量:PV操作,通过原语实现的
信号量机制包括:
1,整形
S:记录资源数量
V\signal表示使用一个资源,使资源数-1,
p\wait表示使用释放一个资源,使资源数+1
当前没有资源时,进程会忙等,因为是通过原子操作完成的,忙等:上处理机时进入循环等待,直到被换下处理机。
2,记录型(能够完成让权等待)
加入链表L:连接所有等待资源的进程,进程会进入阻塞状态,等待其他释放资源的进程来唤醒自己,不会处于忙等状态
4,一些经典同步问题
(1)生产者消费者问题(同步问题)
1,双方对于缓冲区的访问是互斥的,缓冲区是临界资源,
2,生产者生产商品放入缓冲区,当缓冲区为满的时候不再放入。
3,消费者从缓冲区取走商品消费,当缓冲区为空的时候进行等待。
信号量:mutex:用于管理缓冲区的访问
信号量:empty:对于生产者的资源
信号量:full:对于消费者的资源
(2)读者-写者问题(互斥问题)
读者写者的优先级问题,当设置读者优先级更高时:
可以多个读者读,但只能有一个写者写文件,而且当该文件被读者读或者有其他写者进程写的时候,不可以有写者进程进入。
设置int型变量number记录写者进程的数量,当第一个读者进程进入时上锁,当最后一个读者进程退出时,解锁。
(3)哲学家进餐问题(互斥问题)
如何解决每一个进程需要多个同类资源的问题(预防死锁)
信号量:筷子的个数n
1,两只筷子同时拿(用mutex变量锁起来):破坏请求并保持
2,序号为奇数的哲学家先拿左手边的筷子,序号为偶数的哲学家先拿右手边的筷子:破坏循环等待
3,允许n-1个哲学家进餐(至少有一个哲学家有两根筷子)
5,进程之间不可剥夺资源分配不合理导致死锁
1,死锁是什么?
死锁是指一组进程之间互相等待对方资源,而自己的程序无法推进的问题
循环等待是死锁的必要条件,循环等待不一定会产生死锁,而死锁一定会存在循环等待现象。
2,死锁产生的四个必要条件
(1)互斥
(2)不可剥夺
(3)请求并保持
(4)循环等待
3,为什么会发生死锁现象?
(1)对不可剥夺的资源分配不合理
(2)程序推进顺序不合理
4,如何解决死锁?
1、死锁预防(既破坏四个必要条件)
(1)破坏互斥:虚拟化技术如spooling技术,成为逻辑上的共享资源
(2)破坏不可剥夺:当程序无法推进主动放弃自己占有的资源,或者由OS协助
会导致进程饥饿,降低系统的吞吐率
(3)破坏请求并保持:一次性申请所有资源
(4)破坏循环等待:给资源编号,按顺序申请资源
2、死锁避免:银行家算法
为系统定义不安全状态,当进入不安全状态时有可能会进入死锁状态,在运行过程中避免进入不安全状态,以避进入死锁状态
不安全状态:在当前状态下,无法找到一个分配顺序以满足所有进程的运行。
当有进程申请系统资源时,试着将资源分配给该进程,然后根据银行家算法来判断是否进入了不安全状态。
3、死锁的检测和解除
检测:用系统资源分配图和死锁定理:如果系统资源分配图不可完全化简,则判断系统进入了死锁状态。
解除:
(1)撤销进程法:通过撤销进入死锁的进程,知道解除死锁。
(2)资源剥夺法:挂起并抢占
(3)进程回退法:设置还原点,记录历史
如何决定撤销或者回退哪一个进程?
(1)优先级(2)执行时间(3)占用资源数(4)与用户的交互性
6,管程的应用
1,是什么?
对与资源有关的共享变量,以及对变量操作的封装。
是一种有OS实现的,使每个线程(或进程能够互斥访问临界资源的数据结构)
包括:(1)一组局部变量(2)对局部操作的过程(3)初始化语句
2,为什么要有管程?
因为信号量控制容易出错,使用不
当还会导致死锁,为了对信号量机制的改进
3,如何使用?
条件变量与信号量不同,不记录资源的数目,相当于阻塞队列的指针。
对条件变量的操作需结合对普通变量的条件判断,从而控制进程状态。
X.wait:将执行进程挂到x响应的等待队列上
X.signal:唤醒队列中的一个进程