一、操作系统概述
二、进程管理
进程与线程:
进程: 程序的一次执行过程,是一个动态概念,是程序在执行过程中系统进行资源分配和调度的基本单位,程序是一个静态概念。
线程: CPU调度和分派的基本单位,它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
线程是进程的一部分,一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。同一进程中的各个线程都可以共享该进程所拥有的资源。
1、进程状态(三态模型、五态模型)
就绪(Ready)状态: 进程处于准备好运行的状态,一旦得到CPU就可以立即运行;
运行(Running)状态: 正在运行的进程所处的状态;
阻塞(Block)状态: 由于某些因素,导致该进程即使得到CPU也无法运行(还需要I/O设备),就会进入阻塞状态。
三态模型图注:等待状态下的程序缺少除CPU资源以外的其他资源,如用户指令或外设支持等资源;就绪状态的程序除了CPU资源以外的所有资源都已经准备就绪;处于就绪状态的程序需要排队获取CPU资源,且即使获取到了CPU资源,他们的运行时间也是有限的,因此,时间片到了以后就会从运行状态退出到就绪状态,而程序在运行时出现了某些资源的缺失则会退出至等待状态。
五态模型图注:该模型是三态模型的发展,将就绪状态分为了静止就绪和活跃就绪,静止就绪是该进程已经获得了CPU资源,但由于人为需要,由运行状态将其退出至就绪状态,如我们在听歌时突然来了电话,我们暂时将音乐关闭,这种人为的将程序由运行态转至的就绪态,即为静止就绪,再次调动该程序时,该程序就将由静止就绪转至活跃就绪进而被调用;此外,阻塞状态即为三态模型中的等待状态。
2、信号量与PV操作
1、前趋图
前趋图:描述哪些程序或者步骤可以并行,哪些程序或者步骤有先后关系,用于描述进程之间的执行顺序的一种有向无循环图。
图注:包饺子这一工序为例,首先将包饺子分为了五大步骤,并根据步骤间是否具有先后约束关系将其分为三个大的步骤,这样做的好处是明确了A,B,C三个步骤是平行的,他们之间可以并行,这样可以增大CPU的处理效率。
2、同步与互斥
互斥:资源只能被某一个进程使用,资源是互斥信号;
同步:资源能被多个进程异步使用,但是存在制约或顺序关系,资源是同步信号;
信号量:当S>=0时,代表可供并发使用的资源实体数;当S<0时,其绝对值表示正在等待使用临界区的进程数。
互斥(间接相互制约关系):一组并发的进程中一个或多个程序段,因共享某一个公有资源而导致他们必须以一个不允许交叉执行的单位执行,所以互斥信号量的取值只能是1或0,一般就表示是否在使用中。简而言之,互斥是要保证临界资源在某一时刻只能被一个进程访问,这些进程间就形成了间接制约关系。
同步(直接相互制约关系):异步环境下的一组并发进程因直接制约而互相发送消息,进程互相合作和等待,使得各个进程按一定的速度执行的过程。简而言之,进程之间是异步执行的,同步是说使各个进程按一定的制约顺序和速度执行,信号量是同步(如生产者和消费者模型,缓冲区的容量也就是空间资源S1就是同步信号,容量的最大值就是同步信号量的最大值)。多个进程间未完成某一共同任务时必须合作进行。比如一个进程用于输入数据,另一进程用于计算数据,只有输入进程拿到数据之后,计算进程才可进行计算,也就是说输入进程完成后才可进行计算进程,即输入进程直接制约计算进程(进程异步,输入进程和计算进程都可以去资源区看看,没有绝对的先后顺序,但是对于数据这个同步信号来说,就算计算进程先来了,但是还没有数据,你也没法计算,必须要先输入进程把数据输入进来后才行,所以才说进程是异步的,但是信号有一定的制约顺序,是同步信号)。
互斥实际用例:单缓冲区下生产者和消费者的关系即为互斥,即生产者将产品投入到市场的时间内消费者不能进行消费,只有当生产者完成产品的市场投放之后,消费者才能开始消费。
同步实际用例:多缓冲区下生产者和消费者的关系即为同步,即生产者将产品投入市场的同时,消费者也能够对产品进行消费,但若一方速度较快,则另一方需要停下来等待。
可以这样理解:
单缓冲区就是生产商品后,放入商店(这个商店是进完货才卖),这个商店的商品就算一个互斥信号,生产商去投放商品的时候,消费者还不能去购买(还没开业),等投放完成后(开业了),消费者就可以去购买了。
多缓冲区就是生产商品后,放入商店(这个商店是边进货边卖),这个商店的商品就算一个同步信号,商品还没到货的时候想,消费者也来了,那就先等着,等商品到货了再买。
3、PV操作
总结
p操作:挂起进程,申请操作,资源-1;
v操作:唤醒进程,释放资源,资源+1。
P操作:执行 P 操作的进程将进入等待队列;
V操作:执行 V 操作的进程将从阻塞队列中唤醒一个进程。
前趋图:箭头起始用v操作,箭头终端用p操作。
P(X):检查上一个进程是否完成;
V(X):唤醒当前进程指向的下一个进程。
PV一定是成对出现的。
图注:S代表信号量,根据控制对象的不同被赋予不同的值,信号量分为公用信号量和私用信号量
公用信号量:实现进程间的互斥,初值为1或资源的数目,所有进程公有资源的可用数量;
私用信号量:实现进程间的同步,初值为0或某个正整数,表示进程自己可用资源的数量。
公用信号量≠私有信号量(指数量)
P:S小于0,往进程队列中放,挂起进程,申请资源了,资源-1
V:S小于等于0,从进程队列取,唤醒进程,释放资源了,资源+1
P操作(是一个消耗操作):S自减一,然后判断是否小于零,若小于零则将该进程阻塞起来,并将其放入进程队列中,让进程处于等待状态,若不小于零,则表示可以往下面执行;该操作即为将进程“挂起”或“申请资源”。
V操作(是一个释放操作):S自增一,然后判断S是否小于等于零,若是,则从进程队列中拿出一个进程,并唤醒该进程,使其继续执行;若不是,则可以继续往下面的步骤执行;该操作即将进程“唤醒”或“释放资源”。
P操作:
if ( (s = s - 1) < 0 ) {挂起本进程/本进程等待; }
else {继续执行本进程; }
V操作:
if ( (s = s + 1) <=0 ) {
唤醒s的队列中的等待进程;
继续执行本进程;
}else {
不唤醒s的队列中的等待进程;
}
生产者—消费者问题
这是一个著名的同步模型,虽然生产者进程和消费者进程都是异步方式运行的,但它们之间必须保持同步,即不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品,这是一个单缓冲区情况。
我们来分析一下这个流程,前提是S1初值为1,S2初值为0。我们需要明白P操作减1,V操作加1,然后这个分析就变得没有那么困难了,我们先对初值进行一下说明:
a、S1的初值为1:是说明缓冲区还有一个空间可以使用,对于生产者而言,每一个缓冲区的一个空间就是一个资源,也就是说,一开始运行的时候,就允许生产者投放一个产品到缓冲区;
b、然后投放到缓冲区之后,我们来看消费者进程,P(S2):首先我们要进程一个判断,判断缓冲区中是否有产品,对消费者而言,缓冲区中有产品,就代表有一个资源可以使用,但是最初状态那个缓冲区中是没有资源的,所以S2的初值应该是为0。我们刚才都提到了资源的问题,就是信号量的一个值应该是表示资源的数量,但是就消费者和生产者而言,对于他们的资源是不同的,概念是不同的,生产者:缓冲区有多少个空格,就有多少个资源;而对消费者来说,缓冲区有多少个满的格,就有多少个资源,是刚好是相反,所以当消费者从缓冲区取出一个产品之后,对于生产者而已,就多了一个资源。
关于这个进程,我们可以这样来理解:
1、生产者:S1是空间资源,生产一个产品,做一个存操作,也就是P操作,P(S1),S1=S1-1,得到P(S1=0),这个进程还能进行,那么生产者把一个产品投放到缓冲区,S 2是产品,对于生产者而言,S2是增加的,也就是V操作,所以有V(S2)。
2、消费者:能取出一个产品,P(S2)操作,也就是V(S2)唤醒下一个进程P(S2),V(S2),S2初值为0, S2=S2+1>0,就可以激活P(S2),也就是一个V操作之后就能有一个P操作。
3、消费产品:从缓冲区取走产品后,S1是增加的,也就是V(S1)操作,然后,就激活了P(S1),让生产者继续投放产品到缓冲区;这是单缓冲区分析。
司机—售票员问题
1、首先,在司机进程使用P操作(S1=S1-1=-1),现在S1的值为-1,我们来查看P操作发现应该挂起本进程,也就是说司机进程暂时挂起,然后进入到售票员进程;
2、进入售票员进程后,先关车门,然后进行V操作(S1=S1+1=0),发现满足V操作的if条件,首先唤醒司机进程,然后继续执行售票员进程;
3、接着售票,售票后执行P操作(S2=S2-1=-1),发现满足P操作的if条件,暂时将售票员进程挂起;’
4、进入到司机进程;
5、启动车辆,正常行驶,到站停车,执行V操作(S2=S2+1=0),发现S2满足V操作if条件,唤醒售票员进程,同时继续执行本进程;
6、但是,现在可以发现司机进程已经执行完了,但是等待队列中还有售票员进程,于是就进入到售票员进程;
7、在售票员进程中,开车门,上下客,整个司机与售票员问题结束。
V操作的本质在于:一个进程使用完临界资源后,释放临界资源,使S加1,以通知其它的进程,这个时候如果S<0,表明有进程阻塞在该类资源上,因此要从阻塞队列里唤醒一个进程来“转手”该类资源。比如,有两个某类资源,四个进程A、B、C、D要用该类资源,最开始S=2,当A进入,S=1,当B进入S=0,表明该类资源刚好用完,当C进入时S=-1,表明有一个进程被阻塞了,D进入,S=-2。当A用完该类资源时,进行V操作,S=-1,释放该类资源,因为S<0,表明有进程阻塞在该类资源上,于是唤醒一个。
这个例子的一个PV步骤详解:
首先,S=2,当A进程运行,执行P操作,S-1=1,当B进程运行,执行P操作,S-1=0,当C进程运行,执行P操作,S-1=-1,此时判断S<0 ,那么C进程就被阻塞了,放入进程队列中等待,当D进程运行,执行P操作,S-1=-2,此次判断S<0,D进程也被阻塞,放入进程队列中等待;当A进程用完该类资源时,执行V操作,释放资源(这个时候只有B进程在使用资源,A进程已经释放了),S+1=-1,此时判断S<=0,是的,那就从阻塞队列中唤醒一个进程C,此时,B和C在使用资源(如果这个时候D要运行,还是执行P操作,S-1=-2,还是要进阻塞队列),如果这个时候,B或C用完,执行V操作(反正就是执行V操作情况下),释放资源,S+1=0,判断S<=0,继续唤醒D进程。
前驱图PV 操作
三种操作系统前驱图类型详细总结进程管理之 PV 操作_51CTO博客_计算机操作系统前驱图
1、单线前驱图(串联进程)
题干信息:使用 PV 操作控制进程 P1、P2、P3 执行的过程,设置 2 个信号量分别为 S1、S2 且初值均为零。分别列出 3 个进程的进程执行图来计算每个进程的 PV 操作。
P1、P2、P3 三个进程是串联关系,一一执行,只有前面的进程执行了后面的才可以执行,我们将这类前驱图归类为单线前驱图。
2、如何计算单线前驱图的 PV?
将节点分为前驱节点(首节点),中间节点,尾节点分别计算 PV。
2.1、计算前驱节点 PV
对于前驱的首结点 P1 进程,进程 P1 从初始状态执行操作的结果就是从阻塞队列中唤醒一个进程,即唤醒 P2,故其只有 V 操作,占用一个信号量 S1,进程 P1 执行 V(S1)操作。P1 进程执行图如下图所示:
2.2、计算中间节点 PV
对于中间节点 P2 进程,只有在前驱进程 P1 完成之后才可以执行,如果进程 P1 阻塞 P2 就无法正常执行,处于等待状态,故 P2 进程是从等待 S1 的信号量,运行本进程,结果就是唤醒另一个进程即 P3 进程,并占用一个信号量 S2。P2 进程执行图如下图所示:
2.3、计算尾节点 PV
对于 P3 进程,同理,只有在前驱节点 P2 执行完成将信号量 S2 传过来之后才可以执行,然后进程结束。P3 进程执行图如下图所示:
3、多线前趋图(并联进程)
3.1、并联进程趋于合并
题干信息:使用 PV 操作控制进程 P1、P2、P3、P4 并发执行的过程,设置 4 个信号量分别为 S1、S2、S3、S4 且初值均为零。分别列出 5 个进程的进程执行图来计算每个进程的 PV 操作。
3.1.1、计算前驱节点 PV
对于前驱的首结点,以 P1 进程为例,进程 P1 从初始状态执行操作的结果就是从阻塞队列中唤醒一个进程,即唤醒 P4,故其只有 V 操作,并占用一个信号量 S1,故进程 P1 执行 V(S1)操作,同理,P2、P3 进程与 P1 相同,三个进程分别各占三个信号量S1、S2、S3,进程执行图如下图所示:
3.1.2、计算中间节点 PV
对于中间节点进程 P4,只有在前驱进程 P1、P2、P3 都已经完成之后才可以执行,而进程 P1、P2、P3 均有可能在阻塞队列中,故进程 P4 需要先等待 P1、P2、P3 进程的执行(即 P 操作)接收信号量,然后执行 P4 自身进程唤醒 P5 操作(即 V 操作)占用一条信号量 S4。P4 进程执行图如下图所示:
3.1.3、计算尾节点 PV
对于 P5 进程,同理,需要接收到 P4 进程的信号量才可以运行,然后进程结束。P5 进程执行图如下图所示:
3.2、并联进程趋于展开
题干信息:使用 PV 操作控制进程 P1、P2、P3、P4、P5 执行的过程,设置 5 个信号量分别为 S1、S2、S3、S4、S5 且初值均为零。分别列出 5 个进程的进程执行图来计算每个进程的 PV 操作。
3.2.1、计算前驱节点 PV
前驱节点进程 P1跟之前我们讲到的一样,这里不再赘述。
3.2.2、计算中间节点 PV
对于进程 P2,需要等到 P1 的信号量 S1,并唤醒 P3、P4 进程分别占用信号量 S1、S2。P2 进程执行图如下图所示:
对于进程 P3,需要等到进程 P2 的信号量 S2 才可以执行,然后激活进行 P4,占用一个信号量 S4。P3 进程执行图如下图所示:
对于进程 P4,需要等到进程 P2、P3 的信号量 S3、S4 才可以执行,然后激活进程 P5,并占用一个信号量 S5。P4 进程执行图如下图所示:
3.2.3、计算尾节点 PV
对于尾节点进程 P5,需要等到进程 P4 的信号量 S5 才可以执行,直到进程结束。P5 进程执行图如下图所示:
前趋图PV操作的解题思路
1、首先将信号量标记到每个进程的前趋图上;
2、根据箭头起始用v操作,箭头终端用p操作来确定PV;
P(X):检查上一个进程是否完成;
V(X):唤醒当前进程指向的下一个进程;
标记的基本原则是:从结点标号小的开始标。如:P2引出两条线,则这两条必然是S2与S3,而由于指向的分别是P3P4,所以S2对应指向P3的箭头,S3对应指向P4的箭头。
如上图P2进程:
ab对应的是进程P2,P2是P1完成后才执行,所以看到a我们需要知道执行P2之前我们需要检查P1是否完成,所以a应该填P(S1),如果P1完成则执行P2,执行完成P2之后我们需要指向下一个进程,也就是P3和P4,则我们需要去唤醒P3和P4,b填V(S3)、V(S4)。
前驱图例题
图注:这种例题通过观察箭头的指向来解题,箭头起始用v操作,箭头终端用p操作,有几个箭头就用几次。
系统采用PV操作实现进程的同步与互斥,若有n个进程共享k台打印机,没有进程占用时,信号量的初始值为k,也就是K台打印机资源,当k个进程刚好占用完K台打印机时,也就是信号量为0,如果n大于k,那么现在还有n-k个进程是没有打印机资源的 ,也就是被阻塞的进程,来一个进程,资源就-1,所以就是负数。如5个进程共享两个资源,信号量范围就是[-3,2],两个资源用完就会有三个进程在等待。
信号量S,当S为正时,表示可用的资源数,当S为负时,表示正在等待的进程数。
n个进程,k个资源,信号量S的取值范围[-(n-k),k]
生产者消费者模型例题
例一:
答案:A、C
解析:从实际角度出发,S1是书,S2是钱,Sn是购书人,P让资源减少,V让资源增加。
n个购书者进程:把它拆开看嘛,就当成一个嘛,就是一个购书者进入书店,进程开始,购书人资源Sn是减少的(意思就是这个人在使用中),也就是P操作,开始购书,付款,付款的时,书增加,也就是V操作,V(S1),钱减少,也就是P操作,P(S2);付款结束,这个购书者进程就结束,购书人资源就增加了(相当于这个人空下来了);
收银员进程:b1就是书减少,P(S1),收费后,钱增加,V(S2)。
例二:某企业的生产流水线上有2名工人P1和P2,1名检验员P3。P1将初步加工的半成品放入半成品箱B1;P2从半成品箱B1取出继续加工,加工好的产品放入成品箱B2;P3从成品箱B2去除产品校验。假设B1可存放n件半成品,B2可存放m件产品,并设置6个信号量S1、S2、S3、S4、S5和S6,且S3和S6的初值都为0。采用PV操作实现P1、P2和P3的同步模型如下图所示,则信号量S1和S5( );S2、S4的初值分别为( )。
问题1选项
A.分别为同步信号量和互斥信号量,初值分别为0和1
B.都是同步信号量,其初值分别为0和0
C.都是互斥信号量,其初值分别为1和1
D.都是互斥信号量,其初值分别为0和1
问题2选项
A.n、0
B.m、0
C.m、n
D.n、m
答案:C、D
解析:
这是一个典型的生产者消费者问题,P1为生产者,P2即是消费者又是生产者,P3为消费者,B1和B2为缓存区。
对于B1每次执行前都只P(S1),访问完B1后,执行V(S1),从这种结构来看,P(S1)……V(S1)的作用是:保证进程只有一个同时访问B1(因为在访问的时候占用资源B1,访问完资源B1后又里面释放,不释放的话,别的进程就无法访问,那就是互斥),所以S1应为互斥信号量,其初始值应为1;同样S5应该与S1类似。
在将物品放入B1前执行P(S2),再从B1取走物品后执行V(S2),说明该信号量S2应为同步信号量,执行P(S2)时先判定B1中是否有存储空间,如果有则放入物品,没有则进行等待;V(S2),是在从B1拿走物品后执行,即:当从B1中取出1件商品后,B1就有一个空间,接下来通过V(S2)来唤醒队列中等待向B1中放物品的进程。由于B1可以放n件物品,所以S2应该为n;S4与S2相似,所以S2应该为m。
S1信号量是互斥信号量,它确保B1的使用是互斥使用;
S5信号量是互斥信号量,它确保B2的使用是互斥使用;
互斥信号量的取值只能是1或0。简而言之,互斥是要保证临界资源在某一时刻只能被一个进程访问。
S2与S4是同步信号量,S2在P1开始放入半成品时执行P操作,代表资源占用,而在P2取出产品时执行V操作,代表资源释放,这说明S2对应的资源是B1的容量n。同理S4对应m。
信号量S1是互斥信号量,表示半成品箱B1当前有无生产者使用,所以初值为1。
信号量S5是互斥信号量,表示成品箱B2当前有无生产者使用,所以初始值为1。
信号量S2表示半成品箱B1的容量, S2的初值为n。当生产者P1不断将半成品放入B1时,应该先测试B1是否有空位,所以生产者P1使用P(S2),当消费者P2从B1取出一件半成品时,B1就空出一个空位,所以消费者P2使用V(S2)释放空间。
同理,信号量S4表示半成品箱B2当容量,所以S4的初值为m。当生产者P2完成一件产品放入B2时,应先测试B2是否有空位,所以生产者P2使用P(S4),当消费者P3从B2取出一件产品时,B2就空出一个空位,所以消费者P3使用V(S4)释放空间。
整理:
先分析各个信号量代表的资源,然后从实际来讲,一下就可以得出每个信号量的初始值:
S1:半成品箱B1的使用状态——初始值1
S2:半成品箱B1的容量——初始值n
S3:半成品——初始值0
S4:成品箱B2的容量——初始值m
S5:成品箱B2的使用状态——初始值1
S6:成品——初始值0
例三:
生产者消费者模型题的解题思路
1、理清各个信号量所代表的资源;
2、同一个进程里某个信号量既有P操作,又有V操作,那这个信号是互斥的,互斥信号量初始值一般为1,其他情况就是同步信号量,同步信号量初值是0或n;
3、记住P操作有一个检查资源的行为,资源减少,V操作有唤醒下一个进程的行为,资源增加;
4、先进行V操作的信号量初始值一般为0,先进行P操作的是信号量初始值一般为n。
4、死锁问题
若单个进程需要n个资源,有k个进程,则不会发生死锁的最少资源总数为k*(n-1)+1
产生死锁的四个必要条件:
互斥:进程互斥
请求保持:各个进程保持自己的资源,并等待别人释放更多的资源给自己
不剥夺:系统不会把已分配给某个进程的资源剥夺掉分配给其他进程
环路等待:如总共有三个进程,A等待B,B等待C,C等待A;诸如此类的,等待的进程形成了一个闭合环状
死锁的预防(打破四大条件):
预先静态分配法
资源有序分配法
死锁的避免:
银行家算法:
银行家算法涉及到的题型:
图解:解决该类问题,首先将系统所剩资源数计算出来,然后将每个进程还差的资源数计算出来,进行比较之后,将系统资源分配给差的最少的进程,进而让其释放资源,然后进行下一个所需资源较少的进程的分配,由此将进程执行的顺序计算出来。
解法:
注意:第二行第二列的现有资源就是上面求出来的剩下的资源数
由于P2还需资源数小于剩下的资源数,而且需要的刚好是R2,而剩下的资源数中R2刚好有1个,所以首先执行P2进程,否则会产生死锁。P2执行完不但会把刚刚给他分配完的资源释放出来,还会把以前占有的资源给分配出来,所以系统当前资源为系统剩余资源加上已经分配的资源。
5、进程调度
(1)调度方法
三、存储管理
1、分区存储组织
首次适应法:按地址顺序放在第一个可以放下该作业的空白区块
最佳适应法:将空白区块按照从小到大的顺序,放在第一个可以放下该作业的空白区块
最差适应法:将空白区块按照从大到小的顺序,放在第一个可以放下该作业的空白区块
循环首次适应法:每次分配都会记录下位置,下次分配的时候从记录的位置开始,放在第一个可以放下该作业的空白区块(把空闲区连成环状,顺次分配)。
2、页式存储组织
概念:把用户程序分成等分大小的n个页(并将其编号),再在地址空间中以nk为基数划分等大小的块(同样将其编号,块号又称页帧号),每一个页面对应一个块,运行用户程序时不再将整个程序进行运行,而是根据需要分批次将页调入到块中运行,而页和块之间的对应关系用页表来记录。
页表是用来记录它们之间的映射关系,即用户程序的多少页对应着内存中的多少号块。
逻辑地址和物理地址的页内地址是相同的,因为调用的时候是以页为单位,以页为单位的偏移量不会有变化。
求物理地址,要先把逻辑地址当中的页号和页内地址分开,要把它们分开,首先
页面大小(B)=2n,则一个页的页内地址有n位,而在逻辑地址(二进制)中高于n位的部分就是页号,得到页号之后进行查表,得到相应的页帧号,物理地址=页帧号+页内地址(该式子中的“+“是拼接)。
页的大小=2n
逻辑地址=页号+页内地址
物理地址=页帧号+页内地址
都是用二进制来表示的
求物理地址时,需要先将逻辑地址中的页号和页内地址分开。
页面大小为4K,4K=212(4 * 1024B=2^2*2^10),说明一个页的页内地址有12位,高于12位的部分为页号,12位对应的是二进制数位。由于逻辑地址为十六进制5A29H,每1个十六进制对应4个二进制位,所以页内地址是A29,则页号是5。由页表可知,页号为5对应的物理块号为6。所以物理地址是6A29H,第一题选D。
淘汰的页号应选择在内存内的页面,所以在页号0、1、2、5中选择。由于局部性原理,刚刚被访问过的页面的访问位为1,不能被淘汰,只能淘汰访问号为0的页面,所以淘汰1号页,即第二题答案选B。
先看访问位,再看修改位,状态位为0的都不选择
3、段式存储组织
段式存储包括段号和段内地址两个部分。
段式存储按函数之间的逻辑对内存进行划分,页的大小固定,段大小不固定。
段表中存储段号、段长和基址。基址:就是该段在地址的起始位置。
如:可以将main主函数作为一个段,然后将第一个子函数作为一个段,然后将第二个子函数作为一个段......
4、段页式存储组织
段页式存储是结合了段式和页式的一种存储组织,将内存先分段,再分页;
优点:空间浪费小,存储共享容易,存储保护容易,能够动态连接;
缺点:由于管理软件的增加,复杂性和开销也随之增加,需要的硬件以及占用的内容也有所增加,使得执行速度大大下降(程序在执行时要先查段表,再查页表,使得系统资源消耗增加)。
5、快表
相联存储器是按内容存储,速度极快,高速缓存器即cache。
6、页面置换算法
1.产生背景:当程序的需要与系统资源的供给发生矛盾时的一种解决方案,即将不用的页面淘汰掉,置换为需要执行的页面;
2.页面置换算法的内容:
(1) 最优(OPT)算法:尚处于理论层面,它是在整个事情发生之后,即已经知道访问序列是怎么样的之后,根据这个序列来分析算出什么时间点淘汰什么样的页面可以取得最高效率。属于马后炮,一般是访问的需求和顺序完全发生后,再推算如何置换是最优的,属于理论层面上的最优算法,但是实际应用中我们不可能提前预知所有的访问需求及其顺序,不可能未卜先知,所以该方法不具有普遍性。主要的应用场景是用来测试其他算法的结果与该最优算法的差距大小从而评判其他算法的优良程度。
(2) 随机(RAND)算法:随机淘汰一个页面,性能不稳定
(3) 先进先出(FIFO)算法:淘汰页面时选择最先进入内存的页面,有可能产生“抖动”(抖动即:把经常用到的页置换出去,要用的时候发现没有内存了,造成进程中断)。按道理如果希望某个程序效率更高,给它分的页数应该更多,但是在先进先出算法中反而有可能适得其反,效率可能因此降低。
(4) 最近最少使用(LRU)算法:即在保证最近使用的页面不被中断的情况下,将最少使用的页面淘汰,根据使用情况判定,最近使用的是不会被淘汰的,不会产生“抖动”。
先进先出算法的例子:
解析:
缺页:要访问的页面并不在内存中;
换页:当发生缺页时,内存已满,需要将内存中的某页调换成需要的页。
缺页中断:在请求分页系统中,可以通过查询页表中的状态位来确定所要访问的页面是否存在于内存中。每当所要访问的页面不在内存时,会产生一次缺页中断,此时操作系统会根据页表中的外存地址在外存中找到所缺的一页,将其调入内存。
中断程序判断,内存中是否有空闲内存块:
如果有,就调入该内存块,并且修改页表项。
如果没有,则启动调度算法选择一个页面淘汰。调入该页面。
如果这个淘汰的页面有被修改过,那么就要把它重新写进外存。没有修改就直接淘汰。(从外存调入内存,是进行的复制。)
这里也可以结合页面变换表及状态位、访问位、修改位的那种图来理解。
上图中,3个页面长度(即内存队列)的时候,按访问序列走,访问页4占一个内存队列,出现一次缺页中断(也就是内存中没有页4,未命中),访问页3再占一个内存队列,出现一次缺页中断(内存中也没有页3,未命中),访问页2再占一个内存队列(此时已经占满3个内存队列了),出现一次缺页中断(内存中也没有页2,未命中),访问页1再占一个内存队列,出现一次缺页中断(内存中也没有页1,未命中),且此时内存队列没有空闲块,按
先进先出算法,把页4淘汰,然后现在进来的是页1(此次内存中的是页3、2、1),再访问页4,继续缺页,因为刚才已经淘汰了,页4进内存,淘汰页3,(此次内存中的是页2、1、4),以此类推。
对比FIFO和LRU:
没有使用快表指的是每读一次程序块需要先在内存中查表后才能读取相应内存块,所以每一个块需要进行两次内存的访问(第一次是查页表,第二次是取数据)。总共有6个块,所以有12次内存的访问(在页式存储结构中,每一个页面对应一个块),第一题答案选B。
在缺页中断中,无论指令占有几个块(跨了几个页),默认都是一次性读取,只产生1次缺页中断。而数据类型的操作数A在2号页有一半,3号页也有一半,所以产生2次缺页中断。同理,操作数B也产生2次缺页中断,所以总的缺页中断次数为5,第二题答案选C。
7、例题
四、文件管理
1、索引文件结构
(1)一般的索引文件结构有13个结点,编号从0到12。
(2)在索引结点的文件结构中,分为直接索引、一级间接索引、二级间接索引和三级间接索引。
(3)索引的分类主要考虑文件本身容量的扩展问题。
(4)索引结点存放的是13个物理地址,地址对应盘块,盘块存储内容。
(5)间接索引的级别越高,访问效率越低。
索引0到9这十个索引称为直接索引,直接对应物理盘块,每一个物理盘块都对应了索引文件的内容,而索引10则称为间接索引,里面只存储地址,如一个物理盘块的地址大小为4B,而一个物理盘块的大小为4k,则每个物理块可以对应地址项个数为4k\4B,等于1024,代表着1024个物理盘块的地址,则该索引内可以存储的文件大小为4k*1024;索引11则是二级间接索引,即索引的内容还是索引,再索引的内容才是物理盘块,二级间接索引存储的文件大小即为:4k*1024*1024;虽然分级越多存储的内容越多,但相应的,效率也会更低。
分析:
逻辑块号0~4是直接索引,5~6是一级间接索引,7是二级间接索引,每个地址大小为4B,磁盘索引块和磁盘数据块大小都是1KB,那么一个磁盘索引块或磁盘数据块就能有1KB/4B个地址项,也就是256个地址项,一级间接索引就是索引节点指向的物理块用来存放地址项, 可以表示256个地址项,即256个物理块,表示的逻辑块号范围为:5~260,
那么逻辑块号5指向的磁盘块是被分成256个,号范围是5~260,逻辑块号6指向的磁盘块也是被分成256个的,号范围261~516,二级索引即索引节点指向的物理块,存放的是一级索引的地址块地址,一共有256个地址块用来存放一级索引,每个块又存放256个地址项,共有2562=65536个地址项,因此可以表示的逻辑块号范围:517~66052号。
看上图右侧,先不要管方框中的编号,那些编号是磁盘块的物理块编号,逻辑块号5指向的磁盘块有256个地址项,编号是5~260,所以逻辑块号5的对应的是58,逻辑块号6指向的磁盘块有256个地址项,编号是261~516,所以261对应的是187。
2、文件和树型目录结构
3、空闲存储空间的管理
空闲区表法:用一个表记录哪些位置是空闲的,以便管理。
空闲链表法:将空闲区链成一条链表,需要进行空间分配的时候,从这条链表划出相应的空间出来。
位示图法(重点):所有存储区域分成无数个物理块,然后用1表示的区域代表已占用,0表示的区域代表未占用。
成组链接法:以分组和分链的方式。
注:4195号物理块是放在第4196位的,因此4196/32=131.125,因此物理块的使用情况应该在第132个字中描述。
对于字描述,第几个是从第一个开始数,而对于位置描述,从0位置开始数。
4、例题
五、设备管理
1、数据传输控制方式
数据传输控制方式:主要指内存和外设之间的数据的传输控制问题。
解决方式包括:
程序控制方式:又称程序查询方式,是CPU介入最多的机制,外设处于被动的方式,不会主动反馈信息,如是否完成等信息,而是由CPU主动发出查询指令,进而对信息进行查询。
程序中断方式:很多方面和程序控制方式一样,但比程序控制方式的主动性强,效率高,有中断机制,完成某些任务后会向系统发送中断指令,效率更高。
DMA方式:又称直接存取控制方式,有专门的DMA控制器管控外设和主存之间的数据交换,效率更高,只要是外设和主存之间的数据交换过程,就由这个控制器进行管控,即主存与I/O设备间传送一个数据块的过程不需要CPU的任何干涉,只需要CPU在过程开始启动(向设备发出一条“传送一块数据”的命令)与过程结束时处理(CPU通过轮询或中断得知过程是否结束和下次操作是否准备就绪)。
通道和输入输出处理机一般用专用计算机解决,不做讨论。
设备管理的五个层次:
由上到下依次是:
(1)用户进程
(2)与设备无关的系统软件
(3)设备驱动程序
(4)中断处理程序
(5)硬件
设备驱动程序相当于设备接口,中断处理程序是硬件处理程序
2、虚设备与SPOOLING技术
SPOOLING技术的核心在于开辟了缓冲区,把要输出或要输入的数据先缓存起来,解决了外设的低速和内部系统的高效之间的瓶颈差异。
虚设备与SPOOLING技术往往是在磁盘上开缓冲区来解决速度上的矛盾和差异。
例如:四个人通过远程手段准备使用一台打印机,而这台打印机在同一段时间内只能让一个用户使用,若一个用户正在使用该打印机,另一名用户试图使用该打印机时就会提示该打印机被占用,,事实上这样做使得打印机的技术非常的低,而面对这个问提,采用了SPOOLING技术的打印机会进行如下操作:给打印机创建一个缓存区,每一个用户在打印时都会进入缓存区,而从缓存区到真正打印则需要挨个排队,即打印机在打印时不再排斥其他用户的打印操作,而是将其缓存起来,在将当前操作完成后立即进行第二个操作,这样做不仅使得用户的操作界面变得更为友好,也极大的提高了打印机的打印效率。
3、微内核操作系统
作用:提升系统稳定性
把内核做的更小具有许多好处与优势,如提高了可靠性,稳定性,安全性;因为操作系统作为核心的系统软件,如果操作系统出现故障,就会影响整个系统的运行,将内核做的更小就会降低故障的发生率。
4、缓冲技术
单缓冲区、多缓冲区
在解题过程中,我们可以发现需要用到计算机组成原理中的流水线知识。因为进行处理时,每个数据要经过3个步骤:读入缓冲区、送至用户区、处理。这三个步骤中,有两个步骤是需要用到缓冲区的,这两个步骤执行时,缓冲区都不可以开始下一个磁盘区的处理工作,所以三个步骤可合并为两个:读入缓冲区并送至用户区、处理,使用双缓冲区时,从磁盘向缓冲区中传送数据的工作可通过两个缓冲区持续交替进行。
5、磁盘调度
先进行移臂调度,然后进行旋转调度
可以这样理解:先由外向内然后又内向外找柱面(类似把一个圆柱形蛋糕按柱面切分成多个,俯视图是同心圆那种),然后再旋转柱体找扇区号、磁头号(盘面号)。
注意:因为处理顺序是R2,R2,R3这样的,所以R1处理完成后,磁头转到R4的开始处,并不会去处理R4,而且要继续找到R2去处理,所以磁盘要再转一圈才能找到R2。
总结:
读时间=旋转一周的时间/块数
处理n个记录的最长时间=(n-1)* (转一周的时间+读的时间)+最后一个块的读和处理时间
处理n个记录的最短时间=n*(读的时间+处理时间)
例:
例:
六、作业管理
1、作业控制块JCB
2、作业调度方法
小重点