前言
操作系统模块属于基本知识范畴,通常会在单选题中出现,约占2~5分左右。主要知识结构如下图示:
一、基本知识点
操作系统是计算机系统中的核心系统软件,负责管理和控制计算机系统中硬件和软件资源,合理地组织计算机工作流程和有效利用资源,在计算机和用户之间起接口的作用。
操作系统的特征包括:并发性、共享性、虚拟性、不确定性
操作系统的功能包括:进程管理、文件管理、存储管理、设备管理和作业管理
1.1、操作系统类型
大型机操作系统 | 大型机操作系统,通常体积比极大,主要面向多个作业多同时处理,具有强大的I/O能力 |
服务器操作系统 | 服务器操作系统用户应用服务的服务器,通常为若干用户服务,允许用户共享硬件和软件资源 |
多处理器操作系统 | 将多个CPU连接成单个操作系统,通常需要采用的操作系统是配有通信、连接和一致性等专门功能等操作系统 |
个人计算机操作系统 | 个人计算机的操作系统,用于服务单个用户的作业处理 |
掌上计算机操作系统 | PAD、手机等掌上电子产品使用的操作系统 |
嵌入式操作系统 | 嵌入式操作系统常应用于家电等功能单一的设备,不允许用户安装软件,而是嵌入到硬件中 |
传感器节点操作系统 | 传感器是内建有无线电的电池驱动的小型计算机,通常由事件驱动,可以响应外部事件或者内部周期性事件 |
实时操作系统 | 实时操作系统特点是将时间作为关键参数,实时收集数据并用有关数据控制机器,通常还必须满足严格的最终时限 |
智能卡操作系统 | 智能卡是一种包含一块CPU芯片的信用卡,有非常严格的运行能耗和存储空间限制,通常只有单项功能,如电子支付 |
1.2、操作系统结构
单体系统 | 整个操作系统在内核中以单一程序的方式运行,整个操作系统以过程集合的方式编写,链接成一个大型的可执行二进制程序,各个过程之间可能会相互影响,任何一个过程崩溃可能会导致整个系统崩溃 |
层次式系统 | 将操作系统分成多层次,上层基于下层提供的服务来实现上层的功能,不需要关心下层是如何实现的 |
微内核 | 层次式系统大多数层次都在内核,微内核结构是只将核心的微内核模块运行在内核,其余模块作为普通用户进程运行在用户空间 |
客户端-服务器模式 | 微内核思想的变体是将进程划分为服务器和客户端两类,服务器提供某种服务,客户端使用服务,客户端使用服务时构造一个消息发给合适的服务器,通常服务器和客户端不在一个计算机器上 |
虚拟机 | 在裸机上运行并且具备了多道程序功能,该系统向上层提供若干虚拟机,每台虚拟机和裸机相同,所以在每台虚拟机上都可以运行一台裸机所能够运行的任何类型的操作系统 |
外核 | 与虚拟机克隆真实机器不同,另一种策略是对机器进行分区。外核的程序在内核态运行,任务是为虚拟机分配资源,并确保每个虚拟机使用的资源不会被其他虚拟机使用 |
1.3、典型操作系统
1.3.1、批处理系统
原理:通过把用户提交的作业分类,将一批中的作业编成一个作业执行序列
特证:用户脱机使用计算机、成批处理、多道程序运行
1.3.2、分时操作系统
原理:采用分时技术、使多个用户同时以会话方式控制自己程序运行,每个用户都感到各自独立的系统。分时技术把处理器的运行时间分成很短的时间片,按时间片轮流把处理器分配给各联机作业使用。若某个作业在分配给它的时间片内不能完成其计算,则该作业中断,把处理器让给另一个作业使用,等待下一轮时再继续运行
特征:交互性、多用户同时性、独立性
1.3.3、实时操作系统
原理:实时操作系统往往是专用的,系统与应用很难分离,紧密结合在一起。实时系统不强调资源利用率,而更关心及时性、可靠性和完整性
特征:提供即时响应、高可靠性
1.3.4、网络操作系统
原理:按照网络架构的各个协议标准进行开发、包括网络管理、通信、资源共享、系统安全和多种网络应用服务等。在网络系统中,各计算机等操作系统可以互不相同,它需要有一个支撑异种计算机系统之间进程通信等网络环境,以实现协同工作和应用集成
特征:互操作性、协作处理
1.3.5、分布式操作系统
分布式操作系统要求有个统一的操作系统,实现操作系统的统一性,负责全系统的资源分配和调度,为用户提供统一的界面。它是一个逻辑是紧密耦合的系统,目前还没有真正实现的网络操作系统
二、进程管理
2.1、进程及状态变化
2.1.1、进程和程序
进程是程序的一次执行,是一个动态的概念,程序是静态的概念,是指令的集合,具有动态性和并发性;程序是进程运行所对应的运行代码,一个进程对应于一个程序,一个程序可以同时对应于多个进程。
2.1.2、进程的组成
进程是进程资源分配、调度和管理的最小单位,进程由程序、数据和进程控制块(Process Controll Block,PCB)组成,进程是计算机状态的一个有序集合。
进程控制块:PCB是进程存在的唯一标识,PCB描述了进程的基本情况,包括:调度信息和执行信息,PCB随着进程的建立而产生,随着进程的完成而销毁。
2.1.3、三态模型和五态模型
三态模型是将进程划分为三种状态:
运行态:占有处理器正在运行
就绪态:具备运行条件,等待系统分配处理器执行
阻塞态(等待态):不具备运行条件,正在等待某个事件的完成
通常各个状态之间可能会相互转换
运行态-》等待态:等待使用资源
等待态-》就绪态:进程所需要的资源得到满足,或某个事件已经发生
运行态-》就绪态:CPU时间片结束,或者出现更高优先级的进程
就绪态-》运行态:CPU空闲选择一个就绪态的进程运行
五态模型
五态模型相比于三态模型,分别在就绪和阻塞状态加了一个挂起(静止)状态,实际场景中,进程不会一直在内存中,有时需要将进程挂起,对换到磁盘镜像区中,使之暂时不参与进程调度,起到平滑系统操作负荷的目的。
挂起就绪和挂起阻塞状态表示进程目前不在内存中,而是在二级存储器(外存、外存储器、辅存)中,只有当它被对换到内存中才会被调度执行。
阻塞态-》挂起阻塞态:如果当前不存在活跃就绪进程,那么至少有一个等待态进程将被对换出去称为挂起阻塞态;操作系统根据当前资源状况和性能要求,可以决定把阻塞态进程对换出去称为挂起阻塞态;
挂起阻塞态-》挂起就绪态:引起进程等待的事件发生后,相应的挂起阻塞态进程转换成挂起就绪态;
挂起就绪态-》就绪态:当内存中没有活跃就绪态进程,或者挂起就绪态进程具有比活跃就绪态进程更高优先级,系统把挂起就绪态进程转成就绪态;
就绪态-》挂起就绪态:操作系统根据当前资源状况和性能要求,可以决定把就绪态进程对换出去成挂起就绪态;
挂起阻塞态-》阻塞态:当一个进程等待一个事件时,原则是不需要把它调入内存,当一个进程退出后,内存有了一大块自由空间,而某个阻塞态进程具有较高的优先级,并且操作系统已经得知导致它阻塞的事件即将结束,此时可以发生状态变化
2.2、前驱图
前驱图是一个由结点和有向边构成的有向无循环图。该图通常用于表现事务之间先后顺序的制约关系。
结点:可以表示一个语句、一个程序段或是一个进程
有向边:结点间的有向边表示两个结点之间存在的前趋关系
在计算机中,经常采用流水线方式执行指令,每一条指令都可以分解为取指、分析 和执行三步。
取指操作为 Ai,分析操作为 Bi 和执行操作为 Ci(i=1,2,3)。
如图 2-4 所示为三个任务各程序段并发执行的前驱图。
开始结点:A1 没有前趋结点,不受任何制约,可以直接执行;终止结点: C3 没有后继结点;
直接制约:同操作中,多个步骤之间的制约关系,也可以说是“同步的进程之间的制约关系”。如图 A1、B1、C1 是一条指令的取指、分析、执行的三个步骤,所以它们之间的关系是直接制约。
间接制约:多个操作之间,相同步骤的制约关系,也可以说是“互斥的进程之间的制约关系”。如图A1、A2、A3 之间就存在间接制约的关系。
并行执行: B1和A2、C1和B2和A3、 C2和B3,
2.3、PV操作
PV操作是实现进程同步与互斥的常用方法。
P操作的定义:S=S-1,如S>=0,则执行P操作的进程继续执行;如S<0,则置该进程为阻塞状态(因为无可用资源),并将其插入阻塞队列。
V操作的定义:S=S+1,如S>0,则执行V操作的进程继续执行;如S<=0,则从阻塞状态唤醒一个进程,并将其插入就绪队列,然后执行V操作的进程继续。
PV操作控制进程的并发执行时,在前驱图中,一条路径对应一个信号量,在路径的源端进程中,应该对与该路径对应的信号量做V操作,而在路径的终端进程中,应该对与该路径对应的信号量做P操作。
2.3.1、利用PV操作实现互斥
互斥控制是为了保护共享资源,不让多个进程同时访问这个共享资源,也就是阻止多个进程同时进入访问这些资源的代码段,这个代码段称为临界区,这种只允许一个进程访问的资源称为临界资源。
伪代码如下:P(信号量) -》 临界区 -》V(信号量)
互斥操作只允许一个进程进入,所以信号量S初始值为1,S的值表示可允许进入的进程数,当S < 0时,其绝对值就是等待使用临界资源的进程数,也就是等待队列中的进程数。当一个进程从临界区出来执行V操作(S = S + 1),此时唤醒一个等待的进程。
2.3.2、利用PV操作实现同步
最简单的同步形式是进程A在另一个进程B到达L2之前,不应前进到超过点L1,这样就可以伪代码如下:
进程A:...... -》L1:P(信号量)-》......
进程B:...... -》L2:V(信号量)-》......
要确保进程B执行V操作之前,不让进程A的运行超过L1,就要设置信号量S的初始值为0,这样如果进程A先执行到L1,那么执行P操作(S=S-1)后,S<0,则停止执行。直到进程B执行到L2时,执行V操作(S=S+1),唤醒A以继续执行。
2.4、管程和线程
管程由管程名、局部子管程和变量说明、使用共享资源并在数据集上进行操作的若干进程,以及对变量赋初值的语句4个基本部分组成。
执行过程:每一个管程管理一个临界资源,当有几个进程调用某管程时,仅允许一个进程进程进入管程,其他调用着必须等待。方法是通过调用特定的管程入口进入管程,然后通过管程中的一个过程使用临界资源。当某进程通过调用请求访问某临界资源而能满足时,管程调用相应同步原语使该进程等待,并将它排在等待队列上,当使用临界资源的进程访问完该临界资源并释放之后,管程又调用相应的同步原语唤醒等待队列中的队首进程,为了表示不同的等待原因,设置条件变量,条件变量不能取任何值,只是一个排队栈。
线程是进程的活动成分,是处理器分配资源的最小单位,它可以共享进程的资源与地址空间,通过线程的活动,进程可以提供多种服务或实现子任务并行。采用线程机制的最大优点是节省开销、创建时间短。
三、内存管理
3.1、基本概念
地址空间
进程用于寻址内存的一套地址集合,每个进程都有属于自己的地址空间,并且这个地址空间独立于其他进程的地址空间
虚拟内存
每个程序拥有自己的地址空间,这个空间被分割成多个块,每个块称作一页,每页都是连续的地址范围。这些页映射到物理内存,但并不是所有的页都必须在内存中才能运行程序。当程序引用到一部分在物理内存中的地址空间时,由硬件立刻执行必要的映射。当程序引用到一部分不在物理内存的地址空间时,由操作系统负责将缺少的部分装入物理内存并重新执行失败的指令。
逻辑地址
相对地址,相当于指向主存物理真实地址的指针,是一个相对地址
物理地址
物理中真实存在的绝对地址
地址重定位
逻辑地址转换成主存的物理地址的过程叫地址重定位,主要有静态重定位和动态重定位
静态重定位:在程序执行之前进行地址重定位,即装入内存时重定位
动态重定位:在程序执行期间,在每次存储访问之前进行地址重定位
3.2、内存管理的方法
内存管理分为连续分配和离散分配两种方式,连续分配方式是分区方式管理;离散分配是页式、段式或者段页式管理;
1、分区管理
固定分区:将主存空间划分成若干个连续区域进行管理,每个连续区域大小不定,不过一旦分配好后主存中的分区个数和大小就不会再变。在固定分区方式下,每个分区用来装入一个作业,由于主存中有多个分区,就可以同时在每个分区装入一个作业,适用于多到程序系统。优点是实现简单、无外部碎片
可变分区:不预先划分内存分区,在进程装入内存时根据进程的大小动态建立分区,并使分区的大小正好适合进程的需求,所以系统分区的个数和大小是不固定的
2、分页管理
虚拟地址空间按照固定大小划分成若干个页面,在物理内存中对应的单元成为页框,页面和页框的大小通常是一样的。RAM和磁盘之间的交换总是以整个页面为单元进行的。
分页的存储步骤为:先将逻辑空间等分为页,并从0开始编号;再将物理空间等分为页帧或者叫块或页框,大小和页一致;分配内存时以块为单位将进程中的若干页面装入多个可以不相邻的块中。
页内地址包含页号和偏移量(页内地址),页内地址位数决定页的大小;
逻辑地址=页号&偏移量;(&号是连接符号,是将页号作为逻辑地址的最高位)
页表是用于虚拟地址到物理地址的映射,虚拟地址包括页号和偏移量,虚拟页号可以作为页表的索引,以找到该虚拟页面对应的页表项,由页表项可以找到页框号,然后把页框号拼接到偏移量的高位端,以替换掉虚拟页号,形成内存中的物理地址。
页表的作用就是将虚拟页面映射为页框,页表就是一个函数,参数是虚拟页号,结果是物理页框号,虚拟地址中将虚拟页号替换为物理页框号就形成了物理地址。
3、分段管理
段是信息的逻辑单位,含有一组完整的信息,分段的目的是为了满足用户的需求。分段的作业地址空间是二维的,程序员在标识一个地址时,既需要给出段名又需要给出段内地址。
分页时页大小是固定的,分段时段段大小不固定,依据逻辑信息组的长度而定,每个段内都是一个完整的逻辑信息组。
段的地址结构包括段号和偏移量(段内地址),段内地址的位数决定了段的大小。
逻辑地址=段号&偏移量;
分段的逻辑地址转换为物理地址是,是相当于段号&段内地址转换为基址 + 段内地址
段表和页面的逻辑类似,存储了段号到物理地址到基址到映射关系。物理地址是基址+段内地址,而不是基址&段内地址,由逻辑地址得到段号、段内地址,再根据段号和段表求出基址,再由基址+段内地址即可得物理地址。
4、段页式管理
段页式管理方式是先将程序进行分段,然后在每个段内再进行分页处理,原理和分段、分页的一致。
段页式地址结构为:段号、段内页号、页内地址
地址映射时通过段号可以从段表中找到物理地址的基址,也就是页表的起始地址;
通过段内页号+页表起始地址可以得到页块的地址;
再通过页块地址+页内地址就可以得到完整的物理地址。
分段、分页和段页方式的比较
段式 | 页式 | 段页式 | |
划分方式 | 分段(段不定长),每个作业一张段表 | 分页(页定长),每个进程一张也表 | 先将内存分为等长页,每个作业一张段表,每段对应一组页表 |
虚地址 | 段内偏移,(S, d) | 页内偏移,(P,d) | 段号,段内页号,页内偏移(S,P,d) |
虚实转换 | 段表内找出起始地址,加段内偏移 | 页表内找出起始地址,然后加页内偏移 | 先在段表中找到页表的起始地址,然后在表中找到起始地址,最后加页内偏移 |
优点 | 简化了任意增长和收缩的数据段管理,利用进程间共享过程和数据 | 消除了页外碎片 | 结合了段式和页式的优点,便于控制存取访问 |
缺点 | 段外碎片降低了利用率 | 存在页内碎片 | 提高复杂度,增加硬件存在页内碎片 |
3.3、连续内存可变分区分配算法
1、首次适配算法(最先适配算法)
存储管理器沿着段链表进行搜索,从开始沿后一直搜索直到找到第一个合适的空闲区,如果空闲区比实际需要的大则进行分割一部分给程序使用。
2、下次适配算法
在首次适配算法的基础上进行来优化,每次找到空闲区后记录当前的位置,下次查询时直接在上一次的位置处开始查询即可
3、最佳适配算法
从头到尾搜索整个链表找到可以容纳进程的最小空闲区,缺点是会产生大量的小空闲区无法分配,产生较多的碎片
4、最差适配算法
和最佳适配算法相反,每次都是找出最大的空闲区进行分配,避免产生较多的碎片,保证比较大的程序可以分配
5、快速适配算法
针对常用大小的空闲区维护单独的链表,比如4K、8K、12K等,这样在需要分配内存时就可以快速的找到对应大小的空闲区的位置
3.4、页面置换算法
当发生断页中断时,操作系统必须在内存中选择一个页面将其换出内存,以便为即将调入的页面腾出空间。如果要换出的页面在内存驻留期间已经被修改过,就必须把它写会磁盘以更新该页面在磁盘上的副本,如果该页面没有被修改过,那么它在磁盘上的副本已经是最新的,不需要回写。直接用调入的页面覆盖被淘汰的页面就可以了。
当发生缺页中断时,虽然可以随机选择一个页面来置换,但是如何每次都选择不经常使用的页面会提升系统的性能,如果一个被频繁使用的页面被置换出内存,很可能它在很短时间内又要被调入内存,会带来不必要的开销。
1、最优页面置换算法
最优页面置换算法是将每个页面首次被访问前所需要执行的指令数作为标记,当需要置换时,优先置换需要执行指令数最多的页面,相当于按指令顺序进行排序,最后被访问的页面最先被置换。目前该算法还无法实现只能理论存在,因为操作系统无法知道每个页面下一次访问的时机。
2、最近未使用页面置换算法(NRU)
大部分操作系统为每一个页面设置了两个状态位。当页面被访问(读或写)时设置R位;当页面被写入(修改)时设置M位,这些位包含在每个页表项中。
NRU算法随机地从类编号最小的非空类中挑选一个页面淘汰。含义是在最近一个时钟滴答中淘汰一个没有被访问的已修改页面比淘汰一个被频繁使用的干净页面要好。NRU算法主要优点是易于理解和能够有效被实现。
3、先进先出页面置换算法(FIFO)
开销最小的页面置换算法是FIFO算法,由操作系统维护一个所有当前在内存中的页面的链表,最先进入的页面放在表尾,最早进入的放在表头。当发生缺页中断时。淘汰表头的页面并把新调入的最新进入的页面放在表尾。
4、第二次机会页面置换算法
FIFO算法可能会把经常使用的页面置换出去,第二次机会页面置换算法进行了优化,检测最老页面的R位,如果R位为0,那么这个页面又老又没使用,可以立刻置换掉;如果是1,就将R位清0,并把该页面放到连表的尾部,修改它的装入时间使他就像刚装入的一样,然后继续搜索,第二次机会算法就是寻找一个在最近的时钟间隔内没有被访问过的页面,如果所有页面都没有被访问过,该算法就是FIFO算法。
5、时钟页面置换算法
第二次机会算法经常需要在链表中移动页面,既降低了效率又不是很有必要,一个更好的办法是将所有的页面都保存在一个类似钟面的环形链表中,一个表针指向最老的页面,发生缺页中断时,首先检查表针指向的页面,如果R位是0就淘汰该页面,并把新的页面插入这个位置,然后把表针前移一个位置;如果R位是1就清除R位并把表针前移一位,重复这个过程直到找到一个R位为0的页面为止。
6、最近最少使用页面置换算法(LRU)
在前面几条指令中频繁使用的页面很可能在后面的几条指令中被使用。反过来说已经很久没有使用的页面很可能在未来较长时间内不会被使用。当缺页中断时,置换未使用时间最长的页面。
实现LRU需要在内存中维护一个所有页面的链表,最近最多使用的页面在表头,最近最少使用的页面在表尾。困难的是在每次访问内存时都必须要更新整个链表。在链表中找到一个页面,删除它,然后把它移动到表头是一个比较耗时的操作。
四、文件管理
普通文件分为ASCII文件和二进制文件,ASCII文件由多行正文组成,最大优势是可以显示打印,还可以用任何文本编辑器进行编辑,而二进制文件打印出来是无法理解的、充满混乱字符的一张表。二进制文件有一定的内部结构,只有相应的程序才了解内部结构。
文件访问方式有顺序访问和随机访问
顺序访问:进程从头按顺序读取文件的全部字节或记录,不能跳过某一些内容,也不能不按顺序读取,顺序访问是可以返回到起点的,需要时可多次读取该文件。
随机访问:可以不按顺序读取文件中的字节或记录,或者按照关键字而不是位置来访问记录。
4.1、磁盘
磁盘和内存相比每个二进制位的成本低了两个数量级,而且空间还要大两个数量级,但是磁盘唯一的问题就是随机访问数据的时间大约慢了三个数量级,低速的原因时磁盘上一种机械装置。
磁盘涉及的概念如下:
磁盘:磁盘的表面由一些磁性物质组成,这些磁性物质可以用来存储二进制数据
磁道:磁盘的盘面被划分成一个个同心圆,每一个同心圆就是一个磁道
磁头:读取磁盘内容的设备,一个机械臂上通常有多个磁头,多个磁头是共同进退的
扇区:磁道上一个弧形是一个扇区
柱面:多个盘面上相同大小的磁道形成一个柱面,或者说多个磁头转一圈的范围就是一个柱面
4.2、磁盘空间管理
磁盘存储文件通常是分块存储,因为连续存储的话当文件扩大时,需要在磁盘上移动文件,效率比较低。
4.3、磁盘碎片整理
4.4、磁盘臂调度算法
磁盘读写耗时主要涉及三个要素:寻道时间(将磁盘臂移动道适当的柱面的时间)、旋转延迟(等待适当扇区旋转道磁头的时间)、传输时间
其中寻道时间占据大多数时间,所以提高磁盘读写效率的方式就是提高寻道的效率。
假设磁盘请求的柱面的顺序为98,183,37,122,14,124,65,67,且当前磁头处于53柱面
主要的寻道算法有以下几种:
4.4.1、先来先服务算法(FCFS)
按每次接收请求的顺序处理请求,该算法比较简单,处理顺序就是请求的顺序。
则处理顺序为:98->183->37->122->14->124->65->67, 寻道的总距离为45 + 85 + 146 + 85 + 108 + 110 + 59 + 2 = 640
4.4.2、最短寻道优先算法(SSF)
SSF算法的原则是每次从请求队列中找到最近的位置去访问,但是可能会存在“饥饿”现象,也就是请求较早但是距离较远的访问请求要到最后才能处理。
按照SSF算法,案例的处理顺序为:65->67->37->14->98->122->124->183,寻道的总距离为:12 + 2 + 30 + 23 + 84 + 24 + 2 + 59 = 236
4.4.3、扫描算法(Scan)(电梯算法)
扫描算法类似于电梯的运行算法,即每次按一个方向到达顶端之后开始转向往另一个顶端开始扫描。这样就避免了处于距离较远的位置很难访问到的情况。
按照扫描算法的原则,且假设当前的方向是从大到小的方向,则案例的处理顺序为:37->14->0->65->67->98->122->124->183, 寻道总距离为:16 + 23 + 14 + 65 + 2 + 31 + 24 + 2 + 59 = 53 + 183 = 236
4.4.4、循环扫描算法
循环扫描算法是在扫描算法的基础上进行了改进,是每次扫描都是按小到大一个方向进行扫描,当扫描到最大位置时立马从0开始进行扫描。
按照循环扫描算法的原则,处理顺序为:65->67->98->122->124->183->199->0->14->37,寻道总距离为:12 + 2 + 84 + 24 + 2 + 59 + 16 + 199 + 14 + 23 = 382
五、I/O管理
六、死锁
系统资源分为可抢占资源和不可抢占资源。可抢占资源可以从拥有它的进程中抢占而不会产生任何副作用,存储器就是一类可抢占的资源;不可抢占资源是指在不引起相关的计算失败的情况下,无法把它从占有的进程处抢占过来。
6.1、死锁简介
死锁的定义为:如果一个进程集合中的每个进程都在等待只能由该进程集合中的其他进程才能引发的事件,那么该进程集合就是死锁的。
死锁的必要条件:
1、互斥条件:每个资源要么已经分配给了一个进程,要么就是可用的,不能同时分配给多个进程;
2、占有和等待条件:已经得到了某个资源的进程可以再请求新的资源,占有的资源不会被释放;
3、不可抢占条件:已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显式地释放;
4、环路等待条件:若干进程形成环形链,每个都占有对方要申请的下一个资源
以上四个条件任何一个不满足就无法形成死锁。
6.2、死锁的检测和恢复
死锁的恢复可以通过利用抢占来恢复、利用回滚恢复和杀死进程恢复等方式
6.3、死锁的避免和预防
死锁的避免可以通过银行家算法来避免;
死锁的预防可以采用破坏死锁的几大必要条件的方式
1、破坏互斥条件
2、破坏占有并等待条件
3、破坏不可抢占条件
4、破坏环路等待条件
6.4、银行家算法和鸵鸟算法
6.4.1、银行家算法
银行家算法是指在分配资源之前先看清楚资源分配后释放会导致系统死锁,如果会死锁,则不分配;否则就分配。按照银行家算法思想,当进程请求资源时,系统就按如下原则分配资源:
1、当一个进程对资源的最大需求量不超过系统的资源数时,可以接纳该进程;
2、进程可以分期请求资源,但请求的总数不能超过最大需求量;
3、当系统现有的资源不能满足进程尚需资源数时,对进程的请求可以推迟分配,但总能式进程在有限的时间里得到资源;
4、当系统现有的资源能满足进程尚需资源数时,必须测试系统现存的资源能否满足该进程尚需的最大资源数,若能满足则按当前的申请量分配资源;否则也要推迟分配
6.4.2、鸵鸟算法
鸵鸟算法是把鸵鸟头埋到沙子里,假装根本没有问题发生。
标签:操作系统,--,软考,地址,算法,内存,进程,页面 From: https://www.cnblogs.com/jackion5/p/17207191.html