【速成课系列】 操作系统( 三小时速成课)

(笔记更新到第三章 咕咕咕)
操作系统序论:

定义:软件
地位
基本特征

并行和并发的区别:
并行:同一个时刻两个进程同时进行
并发:给定的时间间隔中两个进程同时进行
最基本特征:并发、共享
主要功能:处理机管理、存储器管理、文件管理、设备管理
发展历程:
手工操作阶段(此阶段无操作系统)
缺:人机速度矛盾
批处理阶段(操作系统开始出现)
1.单道批处理阶段
2.多道批处理阶段(操作系统正式诞生)
目的:提高系统资源的利用率
多道批优缺点:
优:多道程序并发执行,资源利用率高
缺:不提供人机交互能力(缺少交互性)
分时操作系统(不可以插队,有了人机交互)
为不同程序分配了不同的时间片,提供了顺序执行的方法
优:提供人机交互(交互性)
缺:不能优先处理紧急事务
实时操作系统(可以插队)
硬实时系统:必须在被控制对象规定时间内完成(火箭发射 不发射后果严重)
软实时系统:可以松一些(订票时的网络如果略微延迟并不会很大的影响程序执行)
优:能优先处理紧急任务
从可靠性看实时操作系统更强,从交互性看分时操作系统更强
概念须知:
两种指令:
特权指令:不允许用户程序使用(只允许操作系统使用)。如IO指令、置中断指令
非特权指令:普通的运算指令
两种程序:
内核程序:系统的管理者,可执行一切指令、运行在核心态
应用程序:普通用户程序只能执行非特权指
令,运行在用户态
处理机状态:
用户态(目态):CPU只能执行非特权指令
核心态(又称管态、内核态):可以执行所有指令
用户态到核心态:
用户只有执行非特权指令权限,但要执行特权指令,此时硬件需要通过中断完成处理机状态的转化
核心态到用户态:特权指令psw的标志位0用户态1核心态常考谁在用户态执行,谁在核心态执行
原语(类比于原子)
1)处于操作系统的最低层,是最接近硬件的部分。
2)这些程序的运行具有原子性,其操作只能一气呵成(程序在运行时不能被打断
3)这些程序的运行时间都较短,而且调用频繁。
中断和异常

内中断(异常,信号来自内部):
①自愿中断——指令中断——如︰系统调用时使用的访管指令(又叫陷入指令,trap指令)
②强迫中断
硬件中断故障———如︰缺页
软件中断——如︰整数除以0
外中断(中断,信号来自外部)
①外设请求:如:I/O操作完成发出的中断信号
②人工干预:如用户强行终止一个进程

系统调用
系统给程序员(应用程序)提供的唯一接口,可获得OS的服务。在用户态发生,核心态处理
体系结构
①大内核:高性能
②微内核:维护方便
第2章 进程调度

进程管理
引入进程目的:为了更好地描述和控制程序并发执行,实现操作系统的并发性和共享性(进程是动态的,程序是静态的)
进程的定义:是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位(没有引入线程时 )
进程的组成:
PCB:保存进程运行期间相关的数据,是进程存在的唯一标志
(PCB常驻内存,进程创立之时即常驻内存)
程序段:能被进程调度到CPU的代码
数据段
进程的状态:
状态种类:
创建状态:进程在被创建
就绪态:进程已处于准备运行的状态,即进程获得了除处理机外的一切所需资源,一旦得到处理机即可运行。
运行态:进程正在占用cpu
阻塞态:
结束状态:进程正在从系统消失,被调出内存
状态变化:
就绪态→运行态
运行态→就绪态:
运行态→阻塞态:进程需要的某一资源还没有准备好
阻塞态→就绪态:由于已经阻塞,离开了cpu,需要重新调度
进程状态转化图:

线程:
引入目的:为了更好的使用多道程序并发执行,提高资源利用率和系统吞吐量
特点:是程序执行的最小单位,基本不拥有任何系统资源(调度的基本单位)。但由于线程不拥有系统资源,因此资源分配的最小单位还是进程。
⭐处理机调度(大题):
概念:是对处理机进行分配,即从就绪队列中按照定的算法(公平、高效)选择一个进程并将处理机分配给它运行,以实现进程并发地执行。
分类:
高级调度(作业调度)(次数少)
中级调度(内存对换)(次数中等)
低级调度(进程调度)(次数多)
1、高级调度:
又称为:作业调度
调度对象:作业
功能:根据算法,决定将外存上处于后备队列的哪几个作业调入内存,为他们创建进程、分配必要的资源,并将它们放入就绪队列。
适用系统:适合多道批处理系统,不适合分时系统和实时系统。
运行频率:较低
2、低级调度
又称为:进程调度
调度对象:进程
功能:根据算法,决定就绪队列中的哪个进程应获得处理机,并由分派程序将处理机分配给被选中的进程。
适合系统:适合多道批处理系统,分时系统和实时系统。
运行频率:中
3、中级调度
又称为:内存调度
调度对象:进程
功能:把那些内存中暂时不能运行的进程调至外存等待 ,此时进程的状态为就绪驻外存状态(挂起状态),相当于存储器管理中的对换功能,目的就是提高内存利用率和系统吞吐量。
运行频率:最高
调度方式:
剥夺式(抢占式):进程1在运行,进程2优先级比进程1高,进程2直接上处理器
(原则1:优先级原则,允许优先级高的并且是新到的进程可以抢占当前进程的处理机。
原则2:短进程原则
原则3:时间片原则)
非剥夺式(非抢占式):进程1在运行,即使进程2优先级比进程1高,进程2也得等待进程1执行完上处理器
调度准则
CPU利用率
系统吞吐量:单位时间内cpu完成作业的数目
周转时间:作业的完成时间-提交时间
等待时间:进程与等待处理机的时间之和
响应时间:从提交到第一次开始运行的时间
算法:
先来先服务(FCFS):
算法原理:按照作业(进程)到达的先后次序来进行调度,谁先来,谁就先被调度。
缺点:忽略了作业的运行时间
短作业优先(SJF):
算法原理:以作业的长短来计算优先级,作业越短优先级越高,作业长短以所要求的运行时间来衡量。
缺点:必须预先知道作业的运行时间、对长作业不利,未考虑作业的紧迫程度。
例题:

解:“作业被调度进入运行后不再退出"意为非抢占式调用,job2到来时也得等待job1执行完
①job1最先达到,运行60分钟,此时job2-6已经全部提交,此时从job2-6中挑选运行时间最短的,那么顺序依次为1→5→6→3→4→2
标准流程如图(要写出作业号、提交时间、运行时间、开始时刻、完成时刻、周转时间):

②周转时间=完成时间-提交时间
平均周转时间=1/n *(N1+N2+……+Nn)
(n为作业过程总数,N1、N2为周转时间)
优先级调度算法:
算法原理:FCFS、SJF两种算法都不能反映进程的紧迫程度。而优先级调度算法是外部赋予进程相应的优先级,来体现出进程的紧迫程度,紧迫性进程优先运行
(如何确定优先级:
1、利用某一范围内的一个整数,优先数
2、响应比的大小,谁响应比大,谁优先级就大——高响应比优先调度算法)
高响应比优先调度算法
时间片轮转
适合系统:分时系统
算法原理:基于时间片的轮转,非常公平,就绪队列中的每一个进程每次仅仅运行一个时间片,并且每个进程是轮流运行。
首先按照FCFS策略把就绪进程排成一个就绪队列,设置时间片,从第一个进程开始分配处理机,第一个进程的时间片执行完后,再从就绪队列中新的队首进程开始。若进程已经运行完,注意此时第一个进程就已经不在就绪队列的队首,而是从就绪队列中删除。若未执行完只是时间片完了,则是调度程序把它送往末尾去了。
多级反馈队列调度算法
算法原理(调度机制):
设置多个就绪队列,每个队列赋予不同的优先级,第一个队列优先级最高,并且首先调度最高优先级,也就是第一个队列里面的所有进程,仅当第一个队列空闲时,才开始调度第二个队列中的进程运行。优先级越高的队列,时间片越小。
多进程同步
引入原因:协调进程之间的相互制约关系
制约关系:
①同步:亦称直接制约关系,是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而等待、传递信息所产生的制约关系。
②互斥:也称间接制约关系。当一个进程进入临界区使用临界资源时,另一个进程必须等待,当占用临界资源的进程退出临界区后,另进程才允许去访问此临界资源。
临界资源:—次仅允许一个进程使用的资源(打印机,共享缓冲区,共享变量,公用队列等)
临界区:在每个进程中访问临界资源的那段程序
(是程序段,非区域)
临界区互斥(必背):
原则:
空闲让进:如果有若干进程要求进入空闲的临界区,次仅允许一个进程进入。
忙则等待:任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待。
有限等待:进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区。
让权等待:如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”现象。
基本方法:信号量:利用pv操作实现互斥
死锁
产生的原因:非剥夺资源的竞争和进程的不恰当推进顺序(与饥饿的区别)
(饥饿:缺乏某一资源并一直没得到满足)
定义:多个进程因竞争资源而造成的─种僵局,如果没有外力,这些进程将无法推进
解决方法:
预防死锁(破坏死锁的四个必要条件):
破坏互斥条件
破坏不剥夺条件
破坏请求和保持条件
破坏循环等待条件
避免死锁:
①安全状态
②⭐银行家算法
检测死锁:利用死锁定理
解除死锁:
资源剥夺法:争夺资源而陷入死锁,直接剥夺资源以解决
撤销进程法:直接取消发生矛盾的进程
进程回退法:回到死锁前的状态
进程调度 练习
(不想做题 呜呜呜┭┮﹏┭┮)
①短作业优先调度算法

解:“作业被调度进入运行后不再退出"意为非抢占式调用,job2到来时也得等待job1执行完
①job1最先达到,运行60分钟,此时job2-6已经全部提交,此时从job2-6中挑选运行时间最短的,那么顺序依次为1→5→6→3→4→2
标准流程如图(要写出作业号、提交时间、运行时间、开始时刻、完成时刻、周转时间):

②周转时间=完成时间-提交时间
平均周转时间=1/n *(N1+N2+……+Nn)
(n为作业过程总数,N1、N2为周转时间)
②短作业优先调度&以优先数为基础的抢占式调度

解:“两道作业”,即进程只允许在内存中同时存在两个;优先数为基础的抢占式调度,其中优先数数值越小,执行优先级越高(也有不一样的,注意题目要求);
执行流程:
10点A到达进入内存,cpu运行至10:20;
10:20b作业到达,b优先数小于A(A未运行完),因此将A挤下处理器,B开始运行,A剩余20分钟;
10:30C作业到达,但短作业优先,50分钟比AB剩余运算时间20分钟都长,不会调用内存,因此无事发生;
10:50:B作业执行完成,内存空余了1,CD都已经到,短作业优先结合A剩余时长比较,此时A剩20,C50,D20,那么D进入准备调用处理机,但D的优先小于A,因此A先在cpu运行;
11:10:A作业运行完毕,内存空余,d作业进入内存,D优先数大于C,继续调度C,至12:00结束
12:00:D作业运行,执行完20分钟至12:20结束

③最高优先级、时间片轮转、FIFO、短作业优先四种情况下的平均周转时间计算

由于几乎同时到达:
(1)最高优先级优先算法:

注意周转时间=完成时间-提交时间,建议列表,答案为110/5=22;
(2)时间片轮转算法:首先按照FCFS(先来先处理)策略把就绪进程排成一个就绪队列,每个程序只执行一个时间片的时间,完全执行完后从就绪队列删除;(F应该是E)

(2+12+20+16+30)/5=18
(3)FIFO (先到先服务)
最简单的顺序运行

注意是周转时间,(6+14+18+28+30)/5=19.2
(4) 短作业优先 (运行时间短先服务)

(2+6+12+20+30)/5=14
临界资源与临界区
1)临界资源:一次仅允许一个进程使用的资源。
2)临界区:在每个进程中访问临界资源的那段程序。
进程的同步与互斥
1)同步:同步亦称直接制约关系,是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而等待、传递信息所产生的制约关系。
2)互斥:互斥也称间接制约关系。当一个进程进入临界区使用临界资源时,另一个进程必须等待,当占用临界资源的进程退出临界区后,另进程才允许去访问此临界资源。
同步机制应遵循以下准则:
(1)空闲让进∶如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。
(2)忙则等待:任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待。
(3有限等待:进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区。
(4)让权等待∶如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”现象。
(先前已经总结过,因此不标黑划重点)
信号量:
信号量机制是一种有效实现进程同步和互斥的工具
信号量的物理意义∶
(1)信号量的值:
大于0:表示当前资源可用数量
小于0︰其绝对值表示等待使用该资源的进程个数
(2)信号量初值为非负整数变量,代表资源数。
(3)信号量值可变,但仅能由P、V操作改变。
P/V操作原语
1)P操作原语 P(S)
(1)P操作一次,S值减1,即S=S-1(请求分配一资源 即消耗一个资源); 如S=5P(S),那么S=4
(2)如果S≥0,则该进程继续执行;如果S<0表示无资源,则该进程的状态置为阻塞态,把相应的PCB连入该信号量队列的末尾,并放弃处理机,进行等待(直至另一个进程执行v (S)操作)。
2) V操作原语(荷兰语的等待)V(S)
(1)v操作一次,s值加1,即S=S+1(释放一单位量资源); S=5。.V(S),S=6;
(2)如果S>0,表示有资源,则该进程继续执行; 如果S<0,则释放信号量队列上的第一个PCB所对应的进程(阻塞态改为就绪态),执行V操作的进程继续执行。
进程间简单同步与互斥的实现
1)用P,V原语实现互斥的一般模型
设互斥信号量mutex初值为1
2)用P、V原语操作实现简单同步的例子
S1缓冲区是否空(0表示不空,1表示空),初值S1=0;
S2缓冲区是否满(0表示不满,1表示满),初值S2=0;
3)生产者——消费者问题(os典型例子) ︰ mutex互斥信号量,初值为1;full满缓冲区数,初值为0; empty空缓冲区数,初值为N;
什么是死锁
死锁:多个进程循环等待它方占有的资源而无限期地僵持下去的局面。
产生死锁的原因:
1)系统资源的竞争
通常系统中拥有的不可剥夺资源,其数量不足以满足多个进程运行的需要,使得
进程在运行过程中,会因争夺资源而陷入僵局,如磁带机、打印机等。只有对不可剥夺资源的竞争才可能产生死锁,对可剥夺资源的竞争是不会引起死锁的。
2)进程推进顺序非法
进程在运行过程中,请求和释放资源的顺序不当,也同样会导致死锁。
例:并发进程P1、P2分别保持了资源R1、R2,而进程P1申请资源R2,进程P2申请资源R1时,两者都会因为所需资源被占用而阻塞。
3)死锁产生的必要条件
互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放)。
请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求。而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被链中下一一个进程所请求。

当死锁产生的时候一定会有这四个条件, 有一个条件不成立都不会造成死锁。其中互斥使用资源时无法破坏的
生产者消费者问题:
一组生产者和一组消费者共享一个初始为空,大小为n的缓冲区,只有当缓冲区没满时,生产者才能把消息放入缓冲区,否则必须等待,只有当缓冲区不空时,消费者才能从中取出消息,否则必须等待,只允许一个生产者放入消息,或者一个消费者取出消息。
①找到题目中的同步/互斥关系
生产者的放---消费者的取 互斥关系
生产者生产---消费者取 同步关系
②设 :
semaphore mutex=1(临界区信号量 互斥)
当semaphore mutex=1时可以调用
semaphore empty=n (空闲缓冲区)
semaphore full=0 (缓冲区)
producer(生产者):
while (1)
{
produce an item in nextp;//生产
P(empty)//检验是否有空闲缓冲区①
P(mutex)//检验临界区信号量②
add next p to buff//行为
V(mutex)
V(full)
}
①和②能互换顺序吗?
先执行2,那么访问缓冲区,②执行完mutex=0,此时若①中empty已经=0,那么p(emtpy)无法执行(即无空闲缓冲区),此时会陷入死锁。
consumer(消费者):
while (1)
{
p(full) //获取缓冲区单元
p(mutex)//进入临界区
remove an item from buffer;
v(mutex);//释放临界区
v(empty);//消费数据
}
解决死锁的一般办法:
解决死锁的三种方法:死锁的预防、避免、检测与恢复。
1.死锁预防的基本思想和可行的解决办法
1.死锁预防的基本思想:打破产生死锁的四个必要条件的一个或几个。
2.避免死锁的策略:在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而避免死锁。(运行过程尽量避免)
3.死锁的检测及解除 (死锁发生后解决)
无需采取任何限制性措施,允许进程在运行过程中发生死锁。通过系统的检测机构及时地检测出死锁的发生,然后采取某种措施解除死锁。
具体的死锁预防(破坏四大条件):
1)破坏互斥条件
如果允许系统资源都能共享使用,则系统不会进入死锁状态。但有些资源根本不能同时访问,如打印机等临界资源只能互斥使用。所以,破坏互斥条件而预防死锁的方法不太可行,而且在有的场合应该保护这种互斥性。
2)破坏不剥夺条件
当一个已保持了某些不可剥夺资源的进程,请求新的资源而得不到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请。这意味着,一个进程已占有的资源会被暂时释放,或者说是被剥夺了,或从而破坏了不可剥夺条件。
3)破坏请求和保持条件
采用预先静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不把它投入运行。一旦投入运行后,这些资源就一直归它所有,也不再提出其他资源请求,这样就可以保证系统不会发生死锁。
这种方式实现简单,但缺点也显而易见,系统资源被严重浪费,其中有些资源可能仅在运行初期或运行快结束时才使用,甚至根本不使用。而且还会导致“饥饿’现象,当由于个别资源长期被其他进程占用时,将致使等待该资源的进程迟迟不能开始运行。
4)破坏循环等待条件
为了破坏循环等待条件,可采用顺序资源分配法,首先给系统中的资源编号规定每个进程,必须按编号递增的顺序请求资源,同类资源一次申请完。也就是说,只要进程提出申请分配资源Ri,则该进程在以后的资源申请中,只能申请编号大于Ri的资源。
死锁避免的重要算法:银行家算法
银行家算法是最著名的死锁避免算法。它提出的思想是:把操作系统看做是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。 操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量、如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
银行家算法的描述:
设Request(i)是进程Pi的请求向量,如果Request(i)[j]=k,表示进程Pi需要K个R(j)类型的资源。当Pi发现资源请求后系统将进行下列步骤
(1)如果Request(i)[j] <= Need[i,j],边转向步骤2),否则认为出错,因为它所请求的资源数已超过它所宣布的最大值。
(2)如果Request(i)[j] <= Available[i,j],便转向步骤3),否则,表示尚无足够资源,Pi需等待。
(3)系统试探着把资源分配给进程Pi,并需要修改下面数据结构中的数值;
Available[j] = Available[j] - Request(i)[j];
Allocation[i,j] = Allocation[i,j] + Request(i)[j];
Need[i,j] = Need[i,j] - Request(i)[j];
银行家算法的数据结构描述:
可利用资源矢量Available:含有m个元素的歎组,其中的每一个元素代表一类可用的资源数目。Availblel[j]=K,则表示系统中现有Rj类资源K个。(可用资源)
最大需求矩阵Max:为n*m矩阵,定义了系统中n个进程中的每一个 进程对m类资源的最大需求。Max[i, j]=K,则表示进程需要Rj类资源的最大数目为K。
分配矩阵Allocation:为n*m矩阵,定义了系统中每一类资源当前已分配给每一进程的资源数。AlloCation[i,j]= K,则表示进程i当前已分得Rj类资源的数目为K。
需求矩阵Need:为n*m矩阵,表示每个进程尚需的各类资源数。Need[i, j]=K,则表示进程i还需要Rj类资源的数目为K。
银行家算法题目举例:
①判断该状态是否安全&再提出请求能否分配

(1)第一步:未分配资源和尚需资源比较,只有p0符合,那么先运行p0,运行完后已分配的释放,变为2 4 4 1
第二步:2 4 4 1满足P3,同样运行完释放,available变为2 5 7 2,只能满足p4 重复至最终答案,可以得到一个安全序列P0→P3→P4→P2→P1,因此该状态安全。
(2)注意更新矩阵,再提出(0,3,2,1)请求,那么尚需资源need=need-request,变为(0430);未分配资源available=available-request(2110)(此时若need、available有一项资源<0了,那么直接不予分配),再重复(1)中寻找安全序列的过程,但发现P0执行完后无法分配,处于不安全状态,因此不能分配。
(这题网上找的 还以为没例题 尴尬)

(1)从图中数据我们可以利用银行家算法的四个数据结构,来描述当前的系统状态(最大资源需求,已分配资源,需求资源数,空闲资源数)

因为系统资源R=(17,5,20)而系统分配给这几个线程的资源为Allocation=(15,2,17) 则可以求出Available=(2,3,3)(1)在T0时刻,由于Availabel大于等于Need中 P5 所在行的向量,因此Availabel能满足 P5 的运行,在 P5 运行后,系统的状态变更为如下图所示(即当P5运行完成后,其最大所需满足,全部释放,available变为(5,4,7),之后依次进行):

因此,在T0时刻,存在安全序列:P5,P4,P3,P2,P1(并不唯一)
(2)P2请求资源,P2发出请求向量Request(i)(0,3,4),系统根据银行家算法进行检查; ① P2 申请资源Reuqest(i)(0,3,4)<=Need中 P2 所在行向量Need(i)(1,3,4)
② P2 申请资源Reuqest(i)(0,3,4)>=可以利用资源向量Availabel(2,3,3),所以,该申请不给于分配
(3)P4请求资源,P4发出请求向量Request(i)(2,0,1),系统根据银行家算法进行检查;
①Reuqest(i)(2,0,1)<= Need(i)(2,2,1)
② Reuqest(i)(2,0,1 <= Availabel(2,3,3)
③对 P4 的申请(2,0,1)进行预分配后,系统的状态为:

可利用资源向量Availabel=(0,3,2),大于Need中 P4 所在行的向量(0,2,0),因此可以满足 P4 的运行。P4 运行结束后,系统的状态变为:

同理依次推导,可计算出存在安全序列P4,P5,P3,P2,P1(并不唯一)
(4)P1请求资源,P1发出请求向量Request(i)(0,2,0),系统根据银行家算法进行检查;
①Request(i)(0,2,0)<= Need(i)(3,4,7)
② Request(i)(0,2,0)<= Availabel(2,3,3)
③对 P1 的申请(0,2,0)进行预分配后,系统的状态为:

由于Availabel不大于等于 P1 到 P5 任一进程在Need中的需求向量,因此系统进行预分配后处于不安全状态,所以对于 P1 申请资源(0,2,0)不给予分配。
注意:因为(4)是建立在第(3)问的基础上的所以Available=(0,3,2)-(0,2,0)=(0,1,2)
第三章 内存管理:
引入目的:更好的支持多道程序的并发执行,提高系统性能
主要功能:
内存空间的分配与回收
存储的保护和共享:保证各道作业在各自的存储空间内运行,互不干扰。
地址转换:在多道程序环境下,程序中的逻辑地址与内存中的物理地址不可能一致, 因此存储管理必须提供地址变换功能,把逻辑地址转换成相应的物理地址。
内存扩充:利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存。
用户程序的主要处理阶段
1).编辑阶段:创建源文件
2).编译阶段:由编译程序将用户源代码编译成若干目标模块,生成目标文件
3).链接阶段:由链接程序将编译后形成的一组目标模块及所需的库函数链接在一起,形成一个完整的装入模块。生成可执行文件(形成逻辑地址)
4).装入阶段:由装入程序将装入模块装入内存运行。
5).运行阶段:得到结果
相关概念:
程序的装入:
①绝对装入(逻辑地址必须和实际的内存地址完全一样)
②静态重定位(地址变换在装入时一次完成)
③动态重定位(地址变换在执行程序的时候再完成)
程序的链接:静态链接、装入时链接、运行时链接
地址空间:
逻辑地址空间(地址空间从0开始)
物理地址空间(内存中物理单元的集合)
管理方式:
连续分配管理方式:
单一连续分配:分配到内存固定的区域(有内部碎片)
固定分区分配:分配到内存不同的固定区域,分区可以相等可
固定分区分配可以不等(内部碎片)
动态分区分配:
可变分区存储管理:按程序需要进行动态划分
★动态分区的分配策略算法:①首次适应(最佳):空闲分区以地址递增的次序链接。分配内存时顺序查找,找到大小能满足要求的第一个空闲分区(增大查找开销)。②最佳适应空闲分区按容量递增的方式形成分区链,找到第一个能满足要求的空闲分区(外部碎片过
多)③最坏适应:空闲分区以容量递减的次序链接。找到第一个能满足要求的空闲分区,即挑选出最大的分区(对大进程不利)。④邻近适应:由首次适应算法演变而成。不同之处是,分配内存时从上次查找结束的位置开始继续查找。
⭐非连续分配管理方式(考大题):
⭐基本分页式存储管理:
基本分段式存储管理:
段页式
内存扩充: