操作系统考研复试复习-2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统考研复试复习-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:唤醒队列中的⼀个进程。