本文主要是介绍2022操作系统期末考点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
第一章(6分)
计算机系统的组成
计算机系统由硬件和软件组成:
- 硬件包括CPU、内存、IO设备和总线等;
- 软件通常分为应用软件、支撑软件、系统软件。
- 支撑软件:在 系统软件 和 应用软件 之间,提供应用软件设计、开发、测试、评估、运行检测等辅助功能的软件,有时以中间件形式存在。
※什么是操作系统
操作系统是管理和控制计算机系统内部各种硬件和软件资源、有效地组织多道程序运行的系统软件(或程序集合),是用户与计算机之间的接口。
多道程序设计技术是在计算机内存中同时存放几道相互独立的程序,使它们在管理程序控制下,相互穿插运行,两个或两个以上程序在计算机系统中同处于开始到结束之间的状态, 这些程序共享计算机系统资源。
操作系统是系统软件
基本职能是控制和管理系统内各种资源
有效地组织多道程序的运行
提供众多服务,方便用户使用(方便用户编程),扩充硬件功能
是裸机上的第一层系统软件,向下管理系统中各种资源,向上为用户和程序提供服务。
是由一系列程序模块和数据组成的,基本功能是管理系统内各种资源和方便用户使用,具体具有五大功能:存储管理、作业和进程管理、设备管理、文件管理、用户接口管理
操作系统的功能
1、存储管理
- 内存分配:主要是为每一道程序分配一定的内存空间。
-
- 需要记录整个内存的使用情况;
- 当用户提出申请时,按照某种策略实施分配,接收系统或用户释放的存储空间。
- 在制定分配策略的时候需要考虑提高内存的利用率
- 地址映射:在多道程序环境下,用户程序所设计的相对地址与装入内存后的实际占用物理地址不一样,CPU执行用户程序时,需要从内存中取出指令或数据,因此需要用到相对地址转化为内存的物理地址。这就是操作系统地址的映射功能。
- 内存保护:不同用户的程序都放在一个内存中,不能互相干扰,更不能侵占操作系统的空间,因此需要建立保护机制。程序运行时需要对所产生的每个访问内存的地址做合法性检查。如果地址不属于范围内成为地址越界,将发生中断并进行相应的处理。
- 内存扩充:实际上采取逻辑扩充内存的方法,这就是虚拟存储技术。
2、作业和进程管理:
- 用户的计算任务称为作业,程序的执行过程叫做进程。
- 进程是分配资源和处理机运行的基本单位
- 作业和进程的调度:作业调度--把选中的一批作业放进内存,并配合其他必要的资源,建立相应的进程;然后进程调度按照一定的算法从进程中选出一个合适的进程并在cpu上运行
- 进程的控制:进程是活动的实体,进程控制包括:创建、撤销、封锁、唤醒进程
- 进程通信:多个进程在活动过程中彼此间会发生相互依赖相互制约的关系,为保证系统中所有的进程都能正常活动,需要设置同步机制
3、设备管理:
- 缓冲区管理:解决CPU和外设速度不匹配的矛盾,提高各自的利用率
- 设备管理:根据用户的IO请求和相应的分配策略,为用户进行分配
- 设备驱动:实现CPU与外设的通信
- 设备无关系:设备的独立性
4、文件管理:
- 文件存储空间管理
- 文件操作的一般管理
- 目录管理
- 文件读写管理和存取控制
5、用户接口服务:
用户上机时直接用到操作系统提供的用户接口。
- 程序接口:系统调用接口,属于操作系统核心层的最外层
- 命令行接口:操作系统与用户的界面。在提示符之后用户从键盘上输入命令,命令解释程序并解释这些命令,然后把它们传递给操作系统的内部程序,执行相应功能;命令接口不属于操作系统的内核,相应的程序是在用户控件中运行的
- 图形用户接口:图形用户界面,不属于操作系统的内核,相应的程序是在用户空间中运行的
※基本操作系统
基本操作系统类型:批处理系统、分时操作系统、实时操作系统
分时系统的特点:交互、独立、及时、同时
实时操作系统的主要特点是:响应及时和可靠性高。
1、批处理系统
作业&作业步:作业是用户、定义计算机完成的工作单位,作业步是由作业控制语句明确表示的计算机程序执行过程
特点:
-
- 多道:内存中存放多个作业,并在外存上存放大量后备作业。---调度原则灵活,充分发挥系统资源的利用率,增加系统的吞吐量。但也会导致用户等待时间长
- 成批:运行过程中不允许用户与机器发生交互
2、实时系统:计算机能够及时响应外部事件的请求,并能在规定的时间内完成对该事件的处理。
目标:对外部请求在严格时间范围内做出反应,并有高可靠性和完整性
主要特点:资源的分配和调度首先要考虑实时性然后才是效率(实时操作系统的主要特点是:响应及时和可靠性高。)
典型:过程控制系统、信息查询系统、事务查询系统
3、分时系统:在分时操作系统中,一台计算机和许多终端设备连接。
- 分时:成若干程序对CPU时间的共享,分享时间的单位称为时间片 (时间片轮转法)
- 并行:两个或两个以上的事件或活动在同一时刻发生
- 并发:两个或两个以上的程序在同一时间内在同一CPU上执行叫做并发
特点:
-
- 同时性
- 交互性
--- 每个用户通过自己的终端向系统发出命令,请求完成某项工作。
--- 系统分析从终端设备发来的命令,完成用户提出的请求。
--- 用户根据系统提供的运行结果,向系统提出下一步请求。
这样重复上述交互会话过程,直到用户完成全部工作为止。
-
- 独立性
- 及时性:
实时性和分时性系统的差别
-
- 交互性:
分时系统提供给多个用户、是通用性很强的计算机系统;
而实时系统交互作用较差,一般来说是具有特殊用途的专用系统 - 实时性:
实时性系统对相应时间有严格限制,一般由控制系统或信息处理磁头所能接受的延迟时间来决定。
而分时性系统的要求是人们能够接受的等待时间为依据的 - 可靠性:实时性系统可靠性更高
- 交互性:
4、网络系统:两大支柱--计算机技术和通信技术,这两大技术互相结合的产物
计算机网络特征:
-
- 分布性: 计算机网络能将分布在不同地理位置的计算机进行互连,可将大型、复杂的综合性问题实行分布式处理。
- 自治性:网络系统中的各个资源多是松散耦合的,并不具备整个系统统一任务调度的功能。
- 互连性:各个不同地点的资源物理逻辑上连接在一起,实现网络通信和资源共享
- 可见性:计算机网络中的资源对用户来说是可见的啊
4、网络操作系统特性:
-
- 接口一致性
- 资源透明性
- 操作可靠性:利用硬件和软件资源在物理上分散的优点;对全网的共享资源进行统一管理和调度;当某处资源出现故障不能使用是,可以分配另一处同类资源完成用户请求
- 处理自主性
- 执行并行性:不仅可以实现本机上多道程序的并行执行,还可以实现网络系统中各节点机上执行的真正并行
5、分布式系统:把大量计算机组织在一起,彼此通过高速网络进行连接
特点:
-
-
- 透明性
- 灵活性:可根据用户的需求和使用情况对系统进行修改扩充
- 可靠性:包括可用性、安全性、容错性
- 高性能:执行速度快、响应及时、资源利用率高、网络通信能力强
- 可扩充性:根据需求扩充或缩减规模
-
在设计分时操作系统时,首先考虑的是(B)。
A。灵活性和可适应性
B.交互性和响应时间
C.周转时间和系统吞吐量
D.实时性和可靠性
(B)是基本的操作系统。
A.多处理器操作系统
B.分时操作系统
C.分布式操作系统
D、网络操作系统
※现代操作系统的特征
- 并发:多个活动在同一给定的时间间隔中进行
- 共享:资源被多个进程所共用
- 不确定性:各个事件发生顺序的不可预测性,是由多道程序系统中进程的并发性和资源共享型带来的必然结果
其中,并发和共享是操作系统的两个最基本的特征。
※现代操作系统的设计目标
有效性、方便性、可扩充性、开放性
设计现代操作系统的主要目标包括以下四方面:
(1)方便性,改进和完善用户接口,使计算机系统更方便使用;
(2)有效性,通过有效管理和分配软、硬件资源及合理组织计算机工作流程来改善资源利用率、提高系统吞吐量;
(3)可扩充性,以适应计算机硬件和体系结构的迅猛发展及其所对应的更高的功能和性能要求;
(4)开放性,支持不同厂家与不同类型的计算机及其设备的网络化集成和协同工作,实现应用程序的可移植性和互操作性。
早期的OS主要追求的是提高CPU、I/O设备和存储器设备等的使用效率,增加系统的吞吐量。
程序初启的过程
初启目的:将操作系统的副本读入内存,建立正常的运行环境
步骤:
- 硬件检测
- 加载引导程序:整个硬盘的第一个扇区是硬盘的引导扇区,加电后从这个扇区引导,所以他称作主引导记录块MBR。MBR中含有磁盘分区的数据和一段简短的程序,总共512B。
引导扇区中总共有三个汇编程序:
-
- bootsect.S Linux引导扇区的源代码,汇编后不能超过512B
- setup.S 辅助程序的一部分
- video.S 另一部分辅助程序,用于引导过程中的屏幕显示
- 初始化内核 :辅助程序setup为内核映像的执行做好了准备以后,就跳转到0x100000开始内核本身的执行,下面是内核初始化的过程:
-
- CPU本身初始化:如页式映射的监理等
- 基础设施初始化:内存管理和进程管理的建立和初始化
- 最上层部分初始化:根设备的安装与外部设备的初始化
4.用户登录
用户态初始化阶段,init程序在每个tty端口创建一个进程,用来支持用户登录。每一个进程都运行一个getty程序,检测tty端口等待用户登录。
※多道程序设计
提高系统资源的利用率和系统吞吐量是推动多道批处理系统形成和发展的主耍动力。
※多道程序设计是在内存中同时存放多道程序,他们在管理程序的控制下交替地在CPU上运行。
由于CPU执行指令的方式以流水线方式,即顺序执行,所以在每一时刻真正在CPU上执行的程序只有一个。
在CPU的调度程序的控制下,多个程序可以交替的在CPU上运行,从宏观上看,多个程序“同时“得到执行,实现了程序的并发执行。
允许多个程序(作业)同时进入一个计算机系统的内存并启动进行交替计算的方法,也就是,计算机中可以同时存放多道程序,从宏观上来看它们是并行的,多道程序都同时处于运行过程中,但都未运行结束,但是微观上是串行的,轮流占用CPU交替执行,引入多道程序设计技术的根本目的是提高CPU的利用率,充分发挥计算机系统部件的并行性。
程序并发执行的特征
- 失去封闭性:多个程序共享资源,因而资源的使用状态不再由一个程序决定,而受并发程序的共同影响。
- 程序与计算不再一一对应:一个共享程序可被多个用户作业调用,从而形成多个计算。
- 并发程序在执行期间相互制约:各程序的活动状态与所处的系统环境密切相关,具有执行-暂停-执行的活动规律
操作系统一般为用户提供了三种界面,它们是_命令界面、程序界面__和图形界面;
在UNIX系统中,只能在C程序中使用的接口系统调用
第二章-第四章 进程管理 (37分)
进程控制块
为了描述控制进程的运行,系统中存放进程的管理和控制信息的数据结构称为进程控制块(PCB Process Control Block),它是进程实体的一部分,是操作系统中最重要的记录性数据结构。它是进程管理和控制的最重要的数据结构,每一个进程均有一个PCB,在创建进程时,建立PCB,伴随进程运行的全过程,直到进程撤消而撤消。
进程
定义
一个具有独立功能的程序关于某个数据集合的一次运行活动
程序在并发环境中的执行过程
※引入进程的原因
描述程序动态执行过程的性质 , 提高资源的利用率和正确描述程序的执行情况
用程序这个静态概念不能如实反映程序并发执行过程中的特征。
进程的基本特征
- 动态性:进程是程序执行的过程,有生、有亡、有活动、有停顿,可以处在不同状态
- 并发性:多个进程实体存在于同一内存中,在一段时间内都得以运行(内部具有顺序性,并发性是指外部的并发性)
- 调度性:进程是系统中申请资源的单位,也是调度的单位
- 异步性:进程向前推进的速度是不可预知的,这也造成了进程之间的相互制约,从而使程序的执行失去再现性
- 结构性:进程具有一定结构,它由程序段、数据段、控制段等组成。
※进程的状态
三种最基本的状态(123)
- 运行状态:当前进程已经分配到CPU,程序在处理机上正在执行的状态
- 就绪状态:已经具备运行条件,处于等待分配CPU的状态
- 阻塞状态:进程因等待某种事件发生而暂时不能运行状态(不具备运行条件)
- 新建状态:进程刚刚被创建,尚未放入就绪队列;处于此种状态的进程还是不完全的,当创建进程的所有工作完成后,操作系统就把他放进就绪队列中。
- 终止状态:完成自己的任务而正常终止或者是出现某些错误故障而被迫中止。处于终止状态的进程不能再被调度执行,下一步的必然是被系统撤销,从而在系统中永久消失。
※进程状态的转化
新建-就绪:当就绪队列能够容纳新建进程的时候,操作系统就把一个新建的状态程序移到就绪队列中。(多数系统根据系统的资源对系统中最大进程数目做了限定)
就绪-运行:处于就绪状态的进程被调度系统选中,分配CPU后的状态;处于运行状态的进程也称为当前进程;当前进程在CPU上执行,他是真正活动的。
运行-阻塞:正在运行的进程因某种条件未满足而放弃对CPU的占用;不同的阻塞原因对应着不同的阻塞队列
阻塞-就绪:处于阻塞状态的进程所等待的事情发生了,进入就绪队列,与就绪队列中的其他进程竞争CPU。(不能从阻塞状态直接变成运行状态)
运行-终止:完成工作或被异常终止;处于终止状态的进程会暂时停留在系统中,以便父进程收集有关的信息,最终由父进程将他从系统中撤销。
唤醒
当被阻塞进程所期待的事件出现时,如它所启动的I/O操作已完成或其所期待的数据已到达,则由有关进程(比如,提供数据的进程)调用唤醒原语(Wakeup),将等待该事件的进程唤醒。
阻塞
正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新工作做等,则由系统自动执行阻塞原语(Block),使自己由运行状态变为阻塞状态。可见,进程的阻塞是进程自身的一种主动行为,也因此只有处于运行态的进程(获得CPU),才可能将其转为阻塞状态。
某进程由于需要从磁盘上读入数据而处 于阻塞状态。当系统完成了所需的读盘操 作后,此时该进程的状态将(D )
A. 从就绪变为运行 B.从运行变为就绪
C.从运行变为阻塞 D.从阻塞变为就绪
在一单处理机中,若有 5 个用户进程,在非管态的某一时刻,处于就绪状态的用户进程最多有5个,最少有0个
在采用优先级调度算法的单处理机系统中,请回答 以下问题:
(1)没有执行进程是否一定就没有就绪进程?
(2)没有执行进程,没有就绪进程,或者两者都没 有。是否可能?各是什么情况?
(3)执行进程是否一定是可运行进程中优先权最高的
(1)是。如果有就绪进程,调度程序必定会把CPU分配给其中的一个进程,因此必定会有执行进程。
(2)有可能系统中有执行进程,但无就绪进程,此时,除了执行进程外,系统中可能没有其他进程,或者有其他进程但这些进程都分别在等某个事件(如I/O操作)完成而均处于阻塞状态;前一种情况下,如果正在执行的进程终止或也因等待某个事件而进入阻塞状态,若其他进程还没被唤醒,则系统变为既没有执行进程也没有就绪进程的状态。
(3)不一定。在采用非抢占式优先级调度算法时,某个进程正在执行的过程中,若有一个优先权更高的进程进入就绪状态,由于不进行CPU抢占,执行进程便不再是可运行进程中优先权最高的进程。若采用抢占策略,则执行进程一定是可运行进程中优先权最高的
七状态模型
进程的同步与互斥
进程间的相互关系:
互斥:竞争统一资源而发生的相互制约
同步:协同完成同一任务
通信:进程直接进行通信,交换信息,合作完成一项工作
进程的异步性:各并发执行的进程是以各自独立的、不可预知的速度推进的。
同步
逻辑上相关的两个或多个进程为完成一项任务,通过协调活动来使用同一资源,从而产生的执行时序的约束关系,称为同步。
读进程和写进程并发地运行,由于并发必然导致异步性,因此“写数据”和“读数据”两个操作执行的先后顺序是不确定的。而实际应用中,又必须按照“写数据→读数据”的顺序来执行的。
如何解决这种异步问题,就是“进程同步”所讨论的内容。
同步亦称直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而产生的制约关系。
进程间的直接制约关系就是源于它们之间的相互合作。
互斥
逻辑上相互无关的两个或多个进程由于争用同一资源而发生的相互制约关系
概念
逻辑上无关的两个或多个进程由于争用统一资源而发生的相互制约关系
临界资源:一个时间段内只允许一个进程使用。
我们把一个时间段内只允许一个进程使用的资源称为临界资源。
许多物理设备(比如摄像头、打印机)属于临界资源。此外还有许多变量、数据、内存缓冲区等都属于临界资源。
对临界资源的访问,必须互斥地进行。互斥,亦称间接制约关系。
进程互斥指当一个选程访问某临界资时,另一个想要访问该临界资源的进程必须等待。当前访问临界资源的进程访问结束,释放该资源之后,另一个进程才能去访问临界资源。
进程间相互合作的关系是同步关系,而对资源争用的关系是互斥关系。
若干进程使用同一临界资源时必须互斥执行。
临界区指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段
临界
临界资源是一次仅允许一个进程使用的共享资源。各进程采取互斥的方式,实现共享的资源称作临界资源。属于临界资源的硬件有,打印机,磁带机等;软件有消息队列,变量,数组,缓冲区等。诸进程间采取互斥方式,实现对这种资源的共享。
临界区指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源又无法同时被多个线程访问的特性。当有线程进入临界区段时,其他线程或是进程必须等待(例如: bounded waiting等待法),有一些同步的机制必须在临界区段的进入点与离开点实现,以确保这些共用资源是被互斥获得使用,例如: semaphore。只能被单一线程访问的设备,例如:打印机。
临界区就是每个进程中访问临界资源的那段代码。五个并发进程都涉及了变量A,每一个进程中都有访问变量A的代码,所以每个进程中都有相关临界区,因此是五个临界区构成。
信号量
用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互斥、进程同步。
信号量其实就是一个变量(可以是一个整数,也可以是更复杂的记录型变量),可以用一个信号量来表示系统中某种资源的数量,比如:系统中只有一台打印机,就可以设置一个初值为1的信号量。
原语是一种特殊的程序段,其执行只能一气呵成,不可被中断。原语是由关中断/开中断指令实现的。软件解决方案的主要问题是由“进入区的各种操作无法一气呵成”,因此如果能把进入区、退出区的操作都用“原语”实现,使这些操作能“一气呵成”就能避免问题。
一对原语: wait(S)原语和signal(S)原语,可以把原语理解为我们自己写的函数,函数名分别为wait和 signal,括号里的信号量s其实就是函数调用时传入的一个参数。
wait、signal原语常简称为P、v操作(来自荷兰语proberen和 verhogen)。因此,做题的时候常扎wait(S)、signal(S)两个操作分别写为P(S)、v(S)
整型信号量
记录型信号量
S.value的初值表示系统中某种资源的数目。
对信号量s的一次Р操作意味着进程请求一个单位的该类资源,因此需要执行S.value--,表示资源数减1,当S.value <0时表示该类资源已分配完毕,因此进程应调用block原语进行自我阻塞(当前运行的进程从运行态>阻塞态),主动放弃处理机,并插入该类资源的等待队列s.L中。可见,该机制遵循了“让权等待”原则,不会出现“忙等”现象。
对信号量s的一次v操作意味着进程释放一个单位的该类资源,因此需要执行S.value++,表示资源数加1,若加1后仍是S.value <= o,表示依然有进程在等待该类资源,因此应调用wakeup原语唤醒等待队列中的第一个进程(被唤醒进程从阻塞态→就绪态)。
信号量机制实现进程互斥
信号量机制实现进程同步
信号量机制实现前驱关系
因为两个是私有信号量,一个是公有信号量,
两个私有信号量用来控制同步,一个公有信号量用来互斥,
例如full和empty就是用来控制同步的私有信号量,
再加一个公有的
所以三个
首先分析互斥还是同步(有相互联系的,即你发生我才发生),发现乒乓球是一个互斥量,所以初值为1,然后发现当中方或者日方有任意一方接球失误后,都换为对方发球,属于同步关系,其中有三个量,中方失误,日方失误,轮换发球(即同步关系)由于刚开始失误次数肯定都是0,又因为轮换发球属于同步关系初值为0,所以除了一个互斥量为1外,其余各部分初值为0
临界资源跟临界区的区别:
临界资源:只允许一个进程进行访问的资源,比如打印机;
临界区:使用临界资源的代码区;
所以这个题目的意思就是进程间互斥,针对同类临界资源的,而对应的代码段是独立的,所以各个进程只能访问各自的代码空间。
信号量的变化
水果问题
桌子上有个能放得下10个糖果的空盘子,爸爸不停地向盘中放牛奶糖与酥糖,儿子不停地从盘中取出牛奶糖吃,女儿不停地从盘中取出酥糖吃,规定三人不能同时从盘中取放糖果。试用信号量的P、V操作来实现三人的同步。
//苹果,橘子,盘子是临界资源 semaphore mutex = 1, plate = 5, apple = 0, orange = 0; void father() {while (true){buy fruits;wait(plate);wait(mutex);put in a fruit;signal(mutex);if (fruit == apple)signal(apple);elsesignal(orange);} } void boy() {wait(orange);wait(mutex);put out and eat an orange;signal(mutex);signal(plate); } void girl() {wait(apple);wait(mutex);put out and eat an apple;signal(mutex);signal(plate); }
理发师问题
// 理发师问题 // 临界资源:barber_sofa:理发椅,sofa_ed_num:被占用的沙发的数量,costumer:顾客数量 // mutex实现customer_num的互斥访问; // 收付款也是影响程序能否向下进行的互斥量:semaphore mutex = 1, barber_sofa = 1; semaphore pay = 0,receive = 0; int sofa_ed_num = 0; //被占用的沙发数量 void customer() {come in; //进店wait(mutex) //对临界资源sofa_ed_num的互斥访问if (sofa_ed_num >= N) {leave; //沙发全被占用,离开理发店signal(mutex); //customer_num 互斥访问结束}else {sofa_ed_num++; //沙发没有被全部占用,坐到沙发上signal(mutex); //customer_num 互斥访问结束wait(barber_sofa); //等待理发椅空出wait(mutex); //对临界资源sofa_ed_num的互斥访问sofa_ed_num--; //顾客离开沙发signal(mutex); //customer_num 互斥访问结束signal(customer); //顾客到来,唤醒理发师hair cut; //剪发signal(pay); //顾客付款wait(receive); //等待理发师收款siganl(barber_sofa); //顾客让出理发椅leave; //离开} }void barber() {while (true){wait(customer); //当customer=0时,等待顾客到来,同时睡觉//customer 不为0,则执行如下操作harcuting; //理发wait(pay); //等待顾客付款signal(receive); //理发师收款} }
死锁
死锁是指在一个进程集合中,每一个进程都在等待仅由集合中另一个进程才能引发的事件而无限期地僵持下去的局 面。
饥饿:在可预计的时间内,某个或某些进程永远得不到完成工作的机会,因为他们所需的资源总是被其他进程占有或抢占。死锁的进程一定处于阻塞状态(因为是得不到所需的资源)而饥饿的进程可以处在就绪状态(比如短作业有限调度中的长时间运行的大作业)。
活锁:一个或多个进程在轮询地等待某个不可能为真的条件为真,导致一直尝试失败尝试,但始终无法完成。处于活锁状态的进程没有被阻塞,但可以被调度运行,因而会消耗cpu地资源,是系统效能大大下降。
产生死锁的原因主要是: 资源有限且操作不当
(1) 因为系统资源不足。
(2) 进程运行推进的顺序不合适。
(3) 资源分配不当等。
只有一个进程是不会产生死锁的
死锁发生的四个必要条件如下:
在发生死锁时,这四个条件都会同时发生,只要有一个条件不满足,则死锁可以排除。
- 互斥条件:独占资源在一段时间内只能由一个进程所占有。进程对所分配到的资源不允许其他进程访问,若其他进程访问该资源,只能等待,直至占有该资源的进程使用完成后释放该资源;
- 占有且等待条件:进程在至少已经占有一个资源后又申请别的资源,由于该进程已经被另外的进程占有,此时进程被阻塞。但他仍继续等待,也继续占有原来的资源。
- 不可抢占条件:进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用后自己释放
- 循环等待条件:进程发生死锁后,必然存在一个进程-资源之间的环形链
这四个条件也不是完全不相关,比如第四个条件就包含着前面三个条件。
进程调度算法各种各样,如果选择不当,就会造成死锁。
×,只是会导致等待时间过长,根据发生死锁的四个条件可以发现,跟死锁没有关系
CPU属于可剥夺性资源,但一个进程已获得的资源,在未使用完之前,另一个进程要使用可以把它的资源剥夺过来,所以不会产生死锁。只有不可剥夺资源才会因为竞争资源而产生死锁
死锁的防止是系统预先确定一些资源分配策略,进程按规定申请资源,系统按预先规定的 策略进行分配,从而防止死锁的发生。
而死锁的避免是当进程提出资源申请时系统测试资源分配,仅当能确保系统安全时才把资源 分配给进程,使系统一直处于安全状态之中,从而避免死锁。
死锁的预防
是排除死锁的静态策略,是使产生死锁的四个必要条件不能同时存在,从而保证死锁不会发生。但是这种方式可能会降低资源的利用率和降低系统的吞吐量。
预防死锁的方法:
资源一次性分配:破坏“请求与保持”条件;
可剥夺资源:破坏“不可剥夺”条件;
资源有序分配:破坏“循环等待”条件;
解决死锁的方法即破坏上述四个条件之一,主要方法如下:
- 破坏互斥条件:但一般来说这个方法并不能用来预防死锁,因为某些资源的固有属性就是独占的
- 破坏占有且等待条件:预分配资源策略(一个进程的申请资源的系统调用先于其他的系统调用--资源的静态分配)但由于进程在执行时是动态的、不可预测的,不可能实现;且这样使用资源效率很低、降低了进程的并发性);空手申请资源策略:当这个进程不占有资源的时候才能申请资源——会出现饥饿状况。
- 破坏非抢占式条件:隐式抢占方式,如果一个进程占有某些资源,还要申请别的被占有的资源,那就处于等待状态,此时它所占的全部资源都可被占(这些资源被隐式释放了)。抢占等待者的资源:若一个进程申请某些资源,首先应该检查他所需要的资源是否可供使用,如果他所需的资源无法被分配,且它所占有的资源是别的同样在等待的资源所需的,那么它的资源可以被抢占过去。
- 破坏循环等待条件:资源有序分配,把全部资源事先按类编号,然后依序分配,是进程申请、占用资源不会形成环路;但是限制了对资源的请求,同时给所有资源编号也困难;因为遵循按次序分配,有些资源暂不使用也被分配,增加了进程对资源的占用时间。
某台计算机连接了8个相同的设备,有N个进程在竞争使用,每个进程最多会同时占用3个设备,请问当N大于等于多少时,系统可能发生死锁?
每个进程3台,不会产生死锁;对于三个进程,可以有两个进程分别获得3台,使其执行完释放后让第三个进程获得3台,所以也不会产生死锁;对于四个进程,假若每个进程各获得2台而同时需要另外一台,产生了死锁,所以产生死锁的最小值是4。
类似题型(1):假设现在有P个进程,每个进程最多需要m个资源,并且有r个资源可用。什么样的条件可以保证死锁不会发生
解:如果一个进程有m个资源它就能够结束,不会使自己陷入死锁中。因此最差情况是每个进程有m-1个资源并且需要另外一个资源。如果留下有一个资源可用,那么其中某个进程就能够结束并释放它的所有资源.使其它进程也能够结束。所以避免死锁的条件是:
r≥p(m-1)+1。
由此条件解上题:r=8,m=3,带入公式得:2p≤7。即当P小于等于3时才可保证死锁不会发生,所以可能会产生死锁的最小值是4。
类似题型(2):某系统中有3个并发进程,都需要同类资源4个,试问该系统不会发生死锁的最少资源数是多少
解:带入上述条件公式:r≥3*(4-1)+1=10。所以答案为10个。
死锁的避免
死锁的避免是动态策略,不限制进程的有关申请资源的命令,而是对进程发出的每个申请都加以检查,根据检查结果进行分配。
——银行家算法
资源分配图
用于检测死锁,如果在图中不含有环路,那么系统中就没有进程处于死锁状态;如果有环路,那么就有可能存在死锁。
- 在资源实体只有一个的时候,环路是死锁的充要条件;
- 每类资源实体不止一个是,环路时存在死锁的必要条件但不是充分条件。
※银行家算法
该算法需要检查申请者对各类资源的最大需求量,如果现存的各类资源可以满足当前它对各类资源的最大需求量时,就满足当前的申请。
换言之,仅当申请者可以在一定时间内无条件归还它所申请的全部资源时,才能把资源分配给它。这种算法的主要问题是,要求每个进程必须先知道资源的最大需求量,而且在系统的运行过程中,考察每个进程对各类资源的申请需花费较多的时间。另外,这一算法本身也有些保守,因为它总是考虑最坏可能的情况。
银行家算法步骤:
①检查此次申请是否超过了之前声明的最大需求数
②检查此时系统剩余的可用资源是否还能满足这次请求
③试探着分配,更改各数据结构
④用安全性算法检查此次分配是否会导致系统进入不安全状态
安全性算法步骤:
检查当前的剩余可用资源是否能满足某个进程的最大需求,如果可以,就把该进程加入安全序列,并把该进程持有的资源全部回收。
不断重复上述过程,看最终是否能让所有进程都加入安全序列告
死锁的检测
资源分配图
检测死锁的算法:
1)在资源分配图中,找出既不阻塞又不是孤点的进程Pi (即找出一条有向边与它相连,且该有向边对应资源的申请数量小于等于系统中己有空闲资源数量。如下图中,R1没有空闲资源,R2有一个空闲资源。若所有的连接该进程的边均满足上述条件,则这个进程能继续运行直至完成,然后释放它所占有的所有资源)。消去它所有的请求边和分配变,使之称为孤立的结点。在下图中, .P1是满足这一条件的进程结点,于是将P1的所有边消去。
2)进程Pi所释放的资源,可以唤醒某些因等待这些资源而阻塞的进程,原来的阻塞进程可能变为非阻塞进程。在下图中,P2 就满足这样的条件。根据1)中的方法进行一系列简化后,若能消去途中所有的边,则称该图是可完全简化的。
并不是系统中所有的进程都是死锁状态,用死锁检测算法化简资源分配图后,还连着边的那些进程就是死锁进程
从死锁中恢复
资源剥夺法。挂起(暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但是应防止被挂起的进程长时间得不到资源而饥饿。
撤销进程法(或称终止进程法)。强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。这种方式的优点是实现简单,但所付出的代价可能会很大。因为有些进程可能已经运行了很长时间,已经接近结束了,一旦被终止可谓功亏-一篑,以后还得从头再来。,
进程回退法。让-一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息,设置还原点。
调度
概念
处理机调度,就是从就绪队列中按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程的并发执行。
进程调度是真正让某个就绪状态的进程到处理机上运行,而作业调度只是使作业具有了竞争处理机的机会。
处理机调度可分为三级,它们是(作业调度)高级调度、(进程挂起与对换)中级调度和(进程调度)低级调度;
高级调度(作业调度):
按一定的原则从外存上处于后备队列的作业中挑选-一个(或多个)作业, .给他们分配内存等必要资源,并建立相应的进程(建立PCB),以使它(们)获得竞争处理机的权利。
高级调度是辅存(外存)与内存之间的调度。每个作业只调入一-次,调出一次。作业调入时会建立相应的PCB,作业调出时才撤销PCB。高级调度主要是指调入的问题,因为只有调入的时机需要操作系统来确定,但调出的时机必然是作业运行结束才调出。
内存调度(中级调度):
引入了虚拟存储技术之后,可将暂时不能运行的进程调至外存等待。等它重新具备了运行条件且内存又稍有空闲时,再重新调入内存。
这么做的目的是为了提高内存利用率和系统吞吐量。
暂时调到外存等待的进程状态为挂起状态。值得注意的是,PCB并不会一起调到外存, 而是会常驻内存。PCB中会记录进程数据在外存中的存放位置,进程状态等信息,操作系统通过内存中的PCB来保持对各个进程的监控、管理。被挂起的进程PCB会被放到的挂起队列中。
中级调度(内存调度),就是要决定将哪个处于挂起状态的进程重新调入内存。
一个进程可能会被多次调出、调入内存,因此中级调度发生的频率要比高级调度更高。
进程调度(低级调度):
低级调度(进程调度),其主要任务是按照某种方法和策略从就绪队列中选取-一个进程,将处理机分配给它。
进程调度是操作系统中最基本的一种调度,在- - 般的操作系统中都必须配置进程调度。进程调度的频率很高,-般几十毫秒- -次。
调度算法的性能指标
※调度算法
FCFS
优点:公平、算法实现简单
缺点:排在长作业(进程)后面的短作业需要等待很长时间,带权周转时间很大,对短作业来说用户体验不好。即,FCFS算法对长作业有利,对短作业不利
SJF(短作业优先)
优点:“ 最短的”平均等待时间、平均周转时间
缺点:不公平。对短作业有利,对长作业不利。可能产生饥饿现象另外,作业/进程的运行时间是由用户提供的,并不一定真实,不一定能做到真正的短作业优先
SRTN(最短剩余时间优先)
HRRN(高响应比优先)
高响应比优先算法:非抢占式的调度算法,只有当前运行的进程主动放弃CPU时(正常/异常完成,或主动阻塞),才需要进行调度,调度时计算所有就绪进程的响应比,选响应比最高的进程上处理机。.
综合考虑了等待时间和运行时间(要求服务时间)
等待时间相同时,要求服务时间短的优先(SJF的优点)
要求服务时间相同时,等待时间长的优先(FCFS的优点)
对于长作业来说,随着等待时间越来越久,其响应比也会越来越大,从而避免了长作业饥饿的问题
响应比 =(等待时间+要求服务时间)/ 要求服务时间
RR时间片轮转
按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片(如100ms)。若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾重新排队。
如果时间片太大,使得每个进程都可以在一个时间片内就完成,则时间片轮转调度算法退化为先来先服务调度算法,并且会增大进程响应时间。因此时间片不能太大。
另一方面,进程调度、切换是有时间代价的(保存、恢复运行环境),因此如果时间片太小,会导致进程切换过于频繁,系统会花大量的时间来处理进程切换,从而导致实际用于进程执行的时间比例减少。可见时间片也不能太小。
优先级调度算法
具有优先级的调度算法就有可能产生饥饿
非抢占式
抢占式
优点:用优先级区分紧急程度、重要程度,适用于实时操作系统。可灵活地调整对各种作业/进程的偏好程度。
缺点:若源源不断地有高优先级进程到来,则可能导致饥饿
多级反馈队列调度算法
1.设置多级就绪队列,各级队列优先级从高到低,时间片从小到大
2.新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片,若用完时间片进程还未结束,则进程进入下一级队列队尾。如果此时已经是在最下级的队列,则重新放回该队列队尾
3.只有第k级队列为空时,才会为k+1级队头的进程分配时间片
对各类型进程相对公平(FCFS的优点) ;
每个新到达的进程都可以很快就得到响应(RR的优点) ;
短进程只用较少的时间就可完成(SPF的优点) ;
不必实现估计进程的运行时间(避免用户作假);
可灵活地调整对各类进程的偏好程度,比如CPU密集型进程、1/0密集型进程
(拓展:可以将因I/O而阻塞的进程重新放回原队列,这样I/0型进程就可以保持较高优先级)
处理机调度可分为三级,它们是高级调度、中级调度和低级调度;
在一般操作系统中必须具备的调度是进程调度
在抢占调度方式中。抢占的原则主要有时间片原则、短作业优先、优先权原则。
下列选项中,降低进程优先级的最合理的时机是(B )
A.进程刚完成I/0操作,进入就绪队列 B.进程的时间片用完
C.进程从就绪状态转为运行状态 D.进程长期处于就绪队列中
在采用优先级调度算法的单处理机系统中,请回答以下问题:
(1)没有执行进程是否一定就没有就绪进程?
(2)没有执行进程,没有就绪进程,或者两者都没有。是否可能?各是什么情况?
(3)执行进程是否一定是可运行进程中优先权最高的?
(1)是。如果有就绪进程,调度程序必定会把CPU分配给其中的一个进程,因此必定会有执行进程。
(2)有可能系统中有执行进程,但无就绪进程。
此时,除了执行进程外,系统中可能没有其他进程,或者有其他进程但这些进程都分别在等某个事件(如I/O操作)完成而均处于阻塞状态;
前一种情况下,如果正在执行的进程终止或也因等待某个事件而进入阻塞状态,若其他进程还没被唤醒,则系统变为既没有执行进程也没有就绪进程的状态。
(3)不一定。
在采用非抢占式优先级调度算法时,某个进程正在执行的过程中,若有一个优先权更高的进程进入就绪状态,由于不进行CPU抢占,执行进程便不再是可运行进程中优先权最高的进程。
若采用抢占策略,则执行进程一定是可运行进程中优先权最高的。
内存管理(16)
MS—DOS 的存贮管理采用 单用户连续存贮管理
相联存储器的访问方式是 按内容访问
※存储器管理功能
为了实现存储器管理的目标:为OS中的多道程序的运行提供良好的环境,提高存储器的利用率,方便用户使用,并能从逻辑上扩充内存,存储器管理需要有以下功能:
- 地址映射:也称地址转换、重定位,能够将地址空间中的逻辑地址转换为内存空间中与之对应的物理地址。
- 内存分配:主要包含为每道程序分配内存空间;提高存储器的利用率,尽量减少不可用的内存空间(内部碎片、外部碎片);允许正在运行的程序申请附加的内存空间,以适应程序和数据的动态增长。
- 内存保护:内存保护的主要任务为:
-
- ①确保每道程序程序都仅在自己的内存空间执行,彼此互不干扰,因此需要对主存中的程序和数据进行保护,做到私有主存储区中的信息可读可写、公共区中的共享信息根据授权、非本进程中的信息不可读写。
- ②不允许用户程序访问OS的程序和数据,也不允许用户程序转移到非共享的其它用户程序中去执行(会覆盖其它程序的程序和数据)。
- 内存扩充:借助于虚拟存储技术,从逻辑上扩充内存的容量,使用户感觉到的内存容量比实际内存容量大得多。需要把磁盘作为主存的扩充,只把部分进程或者进程的部分内容装入内存。扩充容量有两种方式,分别为对换和虚拟技术。
※用户程序的主要处理阶段
编辑——编译——链接——装入——运行
编辑
在编辑方式下,用户将源程序输入机器内,存放在相应的源文件(如filel.c)中。
编译
用户键入编译命令,调用编译程序,对源文件filel.c 中的程序进行词法、语法分析及代码生成等一一系列加工,产生相应的目标代码。目标代码被存放在目标文件中,如file1.o。
链接
目标代码是不能被CPU执行的,还需要进行链接就是将编译或汇编后得到的一组目标模块及它们所需的库函数装配成一个完整的装入模块的过程,从而产生一个可执行文件。
装入
程序必须装入到内存才能运行。也就是说,创建活动进程的第一步就是把程序装入内存并建立进程的映像。
装入程序根据内存的使用情况和分配策略,将上述装入模块放入分配到的内存区中。这时可能需要进行重定位。
- 用户程序经编译之后的每个目标模块都以0为基地址顺序编址,这种地址称为相对地址或逻辑地址;
- 内存中各物理存储单元的地址是从统一的基地址开始顺序编址的,这种地址称为绝对地址或物理地址。
所以程序的逻辑地址与物理地址是不同的概念。
仅在分配内存之后,才根据实际分到的内存情况修改各个模块的相对地址。所以,这些模块并不是“钉死”在内存的某个部分,而是可以“上下浮动"”的。
因此,在程序中出现的涉及单元地址的指令、指针变量等,它们的值是与所装入内存的物理地址有关的。
程序装入内存的方式有以下三种:
①绝对装入方式。
由编译器负责地址转换(单道程序,无需操作系统),将装入模块存放到内存的指定位置中,装入模块中的地址始终与其内存中的地址相同。
即在装入模块中出现的所有地址都是内存的绝对地址。
②可重定位装入方式。
由装入程序进行地址转换(早期多道批处理阶段),根据内存当时的使用情况,决定将装入模块放在内存的什么地方。
装入模块内使用的地址都是相对地址。
③动态运行时装入方式。
运行时才进行地址转换(现代操作系统),为使内存利用率最大,装入内存的程序可以换出到磁盘上,以后再换入到内存中,但对换前后在内存中的位置可能不同。
也就是说,允许进程的内存映像在不同时候处于不同的位置。
重定位
程序和数据装入内存时,需要对目标程序中的地址进行修改,这种逻辑地址变成物理内存地址的过程叫做重定位。
逻辑地址:又称为相对地址,即用户编程所使用的的地址空间,逻辑地址都是从0开始编号,其有两种形式:
1.一维逻辑地址(地址),所有的程序和数据组织成一维的逻辑地址;
2.二维逻辑地址(段号:段内地址),主要涉及段的概念,即一个用户程序可以设计成多个段,每个段的地址都是从0开始的。(关于段的讨论不在此处展开)
物理地址:又称为绝对地址,即程序执行所使用的的地址空间,CPU在执行指令时必须要按照物理地址进行。因为物理地址是实实在在内存中的地址,虚拟技术扩充的是OS的逻辑地址。
静态重定位
是在目标程序再装入内存时,由装入程序对目标程序中的指令和数据的地址进行修改,即把程序的逻辑地址改成实际的内存地址。
优点:无需增加硬件地址转换机构,便于实现程序的静态链接
缺点:程序的存储空间只能是连续的一片区域,在重定位之后就不能再移动;各个用户很难共享内存中同一程序的副本
动态重定位(现代使用)
在程序执行期间,每次访问内存之前都进行重定位。
进程装入内存后,其内存控件中的内容与地址空间中的内容一样。该进程原封不动地装入内存中,当调度该进程在CPU上执行时,才进行相关的地址重定位。
常用硬件实现:包括一对寄存器——一个存放用户进程在内存的起始地址(基址寄存器),一个存放用户的逻辑地址的最大值(限长寄存器)
优点:程序占用的内存动态可变,不必放在连续的一块;比较容易实现及个进程对同意程序的副本共享使用。
缺点:需要硬件支持,增加了硬件成本
动态重定位装入的作业允许操作系统有条件的将其移动
※虚拟存储器(内存空间的扩充技术)
虚拟存储器概念
所谓虚拟存储器(Virtual Memory) 是用户能作为可编址内存对待的虚拟存储空间,它使用户逻辑存储器与物理存储器分离,是操作系统给用户提供的一个比真实内存空间大得多的地址空间。
一般情况下虚拟内存的大小大于物理内存与外部存储的大小总和,也与寻址空间有关
就是说,虚拟存储器并不是实际的内存,它的大小比内存空间大得多;用户感觉所能使用的“内存"非常大,这是操作系统对逻辑内存的扩充。
实现虚拟存储技术的物质基础是二级存储器结构和动态地址转换机构(DAT)。
经过操作系统的改造,将内存和外存有机地联系在一起,在用户面前呈现一个足以满足编程需要的特大内存空间,这就是所谓单级存储器的概念。
虚拟存储器实质上是把用户地址空间和实际的存储空间区分开来,当做两个不同的概念。
动态地址转换机构在程序运行时把逻辑地址转换成物理地址,以实现动态定位。
实现虚拟设备的硬件条件是什么?操作系统应设计哪些功能程序 ?
硬件条件是:配置大容量的磁盘,要有中断装置和通道
操作系统应设计好"预输入"程序,"井管理"程序,"缓输出"程序。
受两方面制约:
- 指令中表示地址的字长:机器指令中表示地址的二进制位数是有限的
- 外存的容量:用户的程序和数据必须完整的保存在外存中。
※特征
①虚拟扩充。虚拟存储器不是扩大物理内存空间,而是扩充逻辑内存容量。就是说,用户编程时所用到的地址空间可以远大于实际内存的容量。
②部分装入。每个进程不是全部一次性地装入内存, 而是分成若干部分。当进程要执行时,只需将当前运行需要用到的那部分程序和数据装入内存。
③离散分配。一个进程分成多个部分,它们没有被全部装入内存。即使装入内存的那部分也不必占用连续的内存空间。这样,一个进程在内存的部分可能散布在内存的不同地方,彼此并不连续。这样做,不仅可避免内存空间的浪费,而且为进程动态调入内存提供方便。
④多次对换。在一个进程运行期间,它所需的全部程序和数据分成多次调入内存。每次调入一部分, 只解决当前需要,而在内存的那些暂时不被使用的程序和数据,可换出到外存的对换区;甚至把暂时不能运行的进程在内存的全部映像都换出到对换区,以腾出尽量多的内存空间供可运行进程使用。被调出的程序和数据在需要时可以重新调入内存中(换入)。
虚拟存储器所具有的基本特征是虚拟扩充、系统调用、部分装入和离散分配。
对换技术(内存空间的扩充技术)
思想:除了操作系统占用的内存空间外,所剩余的全部内存只供给一个用户进程使用,其他进程都放在外存上。每次只调入一个进程进入内存运行,当这个进程用完分给他的时间片后,就把它放在外存上,系统在将另一个进程调入内存,如此轮转。
A.支持多道程序设计,算法简单,但存贮器碎片多。 (固定分区)
B.能消除碎片,但用于存贮器紧缩处理的时间长。 (可重定位分区)
C.克服了碎片多和紧缩处理时间长的缺点,支持多道程序设计,但不支持虚拟存贮。 (非请求分页)
D.支持虚拟存贮,但不能以自然的方式提供存贮器的共享和存取保护机制。 (请求分页)
E.允许动态连接和装入,能消除碎片,支持虚拟存贮。(段页式)
分区法
分区分配是为支持多道程序运行而设计的一种最简单的存储管理方式。在这种方式下,除操作系统占用内存的某个固定分区(通常是低址部分)外,把其余内存供用户程序使用,并且划分成若干分区,每个分区里容纳一个作业。 按照分区的划分方式,可分为固定分区法和动态分区法两种常见的分配方法。
固定分区法
固定分区法管理方式简单,所需操作系统软件和处理开销都小。
它的缺点是:
①内存空间利用率不高,有时浪费情况会相当严重,即存在碎片问题。
②要在系统生成时指定分区的个数,这就限制了系统中处于活动(不是阻塞的)状态的进程数;另外,在多数情况下,并不能预先知道所有作业对内存的需求,而分区大小是在系统生成时确定的。
可重定位分区分配
在可变式分区分配方案中,某一作业完成后,系统收回其主存空间,并与相邻空闲区合 并,为此需修改空闲区表,造成空闲区数减 1 的情况是 有上邻空闲区,也有下邻空闲区
紧缩
大量碎片的出现不仅限制了内存中进程的个数,还造成了内存空间的大量浪费。怎样使这些分散的、较小的空闲区得到合理使用呢?
最简单的办法是定时或在分配内存时把所有碎片合并为一个连续区。
实现的方法是:移动某些已分配区的内容,使所有进程的分区紧挨在一起,而把空闲区留在另一端。这种技术称为紧缩(或拼凑)。
采用紧缩技术的动态分区法也称为可重定位分区法。
由于紧缩过程中内存中的进程要“搬家”,因而所有对地址敏感的项都必须做适当修改,如基址寄存器、访问内存的指令、参数表和使用地址指针的数据结构等,采用动态重定位技术可以较好地解决这个问题。
利用紧缩法消除碎片,需要对分区中的大量信息进行传送,这要花费大量的CPU时间。为了减少进程移动的数量,可对紧缩方向加以改进。进程装入内存时,不是从上至下依次放置,而是采用“占两头,空中间”的办法。当紧缩时,各个进程按地址大小分别向两端靠拢,从而使空闲区保留在内存的中间部位。
- 第1种方案是当进程结束、释放所占用的分区时,如果它不与空闲区邻接,就立即进行紧缩。于是,空闲区总是保持连续的一片空间,不会出现分散的碎片。这样,对空闲区的管理和为进程分配内存分区就很容易。但是紧缩却花费很多时间。
- 第2种方案是在分配进程的分区时进行,即各个空闲区都不能满足该进程的需求时才进行紧缩。也就是说,回收分区时不进行紧缩,存在足够大的空闲区时也不做紧缩。这样,紧缩的次数就比第1种方案少得多。但空闲区的管理较前者复杂。
优点是可以消除碎片,能够分配更多的分区,有助于多道程序设计,提高内存的利用率。
它的缺点是:为消除碎片,紧缩花费了大量CPU时间,从而降低了处理器的效率;当进程大于整个空闲区时,仍要浪费定的内存;进程的存储区内可能放有从未使用的信息;进程之间无法对信息共享。
数据结构
空闲分区表
内存中每个空闲的分区占用该表的一项,每个表项的内容包括:分区号、分区大小、分区起始地址及该分区的状态等。当分配内存空间时就查表,如果找到满足要求的空闲分区,则实施分配。
空闲分区链
空闲分区链是使用链指针把所有的空闲分区链接成条链。 为此,在每个分区的开头要设置状态位和表示分区大小的项目,状态位标示该分区是否已分配出去:还要设置前向指针,用来链接前面一个分区;在每个分区的尾部要设置一个后向指针,用来链接后面个分区。 分区的中间部分是可以存放进程的空闲内存空间。当该分区分配出去后,就把状态位由“0”(空闲)改为“1”(已用)。
算法
最先适应算法
在这种算法中,空闲表是按地址排列的,即空闲分区起始地址小的分区在表中的序号也小。当要为进程分配内存空间时,就从该表的开头向下查,在各空闲分区中查找满足大小要求的可用分区。只要找到第一个足以满足要求的空闲分区就停止查找,并把它分配出去:如果该空闲分区与所需内存的大小-一样,则从空闲表中取消该项;如果该空闲分区大于所需内存,那么分出所需内存空间后还有剩余,则余下的部分仍留在空闲表中,但应修改分区大小和分区始址。
这种算法的优点是:便于释放内存时进行合并,且为大进程预留高地址部分的大空闲区。
缺点是:内存高地址部分和低地址部分的利用不均衡,且会出现许多很小的空闲分区,影响内存效率。
最佳适应算法
这种算法的空闲表是以空闲分区的大小为序、按增量形式排列的,即小分区在前,大分区在后。它在满足需要的前提下,尽量分配最小的空闲分区。这种算法产生的剩余空闲分区是最小的,但它不便于释放内存时与邻接空闲分区的合并,也同样会出现许多难以利用的小空闲分区。
循环适应算法
这种算法是最先适应算法的变种。它不从空闲表的开头查找,而从上次找到的可用分区的下一个空闲分区开始查找,从中选择满足大小要求的第一个空闲分区 。
该算法能使内存中的空闲分区分布得更均匀,减少查找空闲分区的开销。在实现时设置一个指针,用于指示下一次搜索的起始位置。它无法为大作业预留大的空闲分区。
最差适应算法
每次选最大的内存
碎片
在固定分区法和动态分区法中,必须把一个系统程序或用户程序装入一一个连续的内存空间中。
虽然动态分区法比固定分区法的内存利用率高,但由于各个进程申请和释放内存的结果,在内存中经常出现大量的分散的小空闲区。内存中这种容量太小、无法利用的小分区称作“碎片”或“零头”。
依据碎片出现的位置,分为内部碎片和外部碎片两种。
在一个分区内部出现的碎片(即被浪费的空间)称作内部碎片,如固定分区法会产生内部碎片。
在所有分区之外新增的碎片称作外部碎片,如在动态分区法实施过程中出现越来越多的小空闲分区,由于他们太小无法装入一个进程,因而被浪费。
※※分页、分段
允许程序的存储空间不一定连续,这样可把一个程序分散地放在各个空闲的内存块中,既不需要移动内存中的原有信息,又解决了外部碎片的问题,提高了内存的利用率。
分页存储管理
将内存空间分为一个个大小相等的分区(比如:每个分区4KB),每个分区就是一个“页框”。
将用户进程的地址空间也分为与页框大小相等的一个个区域,称为“页”或“页面”。
每个页面也有一个编号,即“页号”,页号也是从0开始。
(注:进程的最后一个页面可能没有一个页框那么大。因此,页框不能太大,否则可能产生过大的内部碎片)
逻辑地址表示
它由两部分组成:前一部分 表示该地址所在页面的页号p:后一部分表示页内位移d,即页内地址。
本图中所示的两部分构成的地址长度为32位。其中0~11位为页内地址,即每页的大小为4KB; 12~31 位为页号,表示地址空间中最多可容纳20个页面。注意,不同机器上地址字的长度是不同的,有的是16位,还有的是64位。一般来说,如果地址字长为m位,而页面大小为2^m字节,那么页号占m-n位(高位),而低n位表示页内地址。
对于某台具体机器来说,其地址结构是一-定的。 如果给定的逻辑地址是A,页面的大小为L,则页号p和页内地址d可按下式求得p = INT(A/L); d = A MOD L
;得到的结果可以用一个数对表示(p,d)
内存分配原则
在分页情况下,系统以块为单位把内存分给各个进程,进程的每个页面对应一个内存块, 并且一个进程的若干页可以分别装入物理上不连续的内存块中。
当把一一个进程装入内存时,首先检查它有多少页。如果它有n页,则至少应有n个空闲块才能装入该进程。如果满足要求,则分配n个空闲块,把它装入,且在该进程的页表中记下各页面对应的内存块号。可以看出,进程1的页面是连续的,而装入内存后,被放在不相邻的块中,如0页放在3#块,1页放在5#块,等等。
页表
在分页系统中,允许将进程的各页面离散地装入内存的任何空闲块中,这样就出现进程的页号连续、而块号不连续的情况。怎样找到每个页面在内存中对应的物理块呢?为此,系统为每个进程设立一张页面映像表,简称页表,见图5-15。
在进程地址空间内的所有页(0~n-1)依次在页表中有一个页表项,其中记载了相应页面在内存中对应的物理块号。进程执行时,按照逻辑地址中的页号查找页表中的对应项,找到该页在内存中的物理块号。页表的作用主要是实现从页号到物理块号的地址映射。从图5-15中的页表可知,页号3对应内存的10#块。
内存块表
操作系统管理整个内存,它必须知道哪些块已经分出去了,哪些块还是空闲的,总共有多少块等物理存储的情况。这些信息保存在称作内存块表的数据结构中,整个系统有一个内存块表。
每个内存块在内存块表中占一 项,表明该块当前空闲还是已分出去了:如果已分出去,是分给哪个进程的哪个页面了。
地址转换机构
通常,当进程需要访问某个逻辑地址中的数据的时候,分页地址映像硬件自动按页面大小将CPU得到的有效地址分成两部分:页号和页内地址(p,d)
。获得后,硬件自动检查索引号为p的索引页表,从该页表中获得该物理块号,再将它装入物理地址寄存器中。同时,将页内地址d直接送入物理地址寄存器的块内地址字段中。这样,物理地址寄存器中的内容就是由而这拼接的实际访问内存的地址。
可以看出,分页本身就是动态重定位形式。由分页硬件机构把每个逻辑地址与某个物理地址关联在一起。
采用分页技术不存在外部碎片,因为任何空闲的内存块都可分给需要它的进程。 当然,会存在内部碎片,因为分配内存时是以内存块为单位进行的。如果一个进程的大小没有恰好填满所分到的内存块,最后一个内存块中就有空余的地方,这就是内部碎片。
最坏情况下,一个进程有n个整页面加1字节,为它也得分n+1个内存块。此时,最后一块几乎都有内部碎片。
两次,一次页表,取到地址后再到内存中取数据
页面尺寸
选择最佳页面尺寸需要在几个互相矛盾的因素之间进行折中,没有绝对最佳方案。在分页系统中,每个进程平均有半个内存块被浪费,这就是内部碎片。
从这个意义上讲,似乎页面尺寸越小越好。然而页面越小,同一程序需要的页面数就越多,就需要用更大的页表,同时,页表寄存的装入时间就越长;页面小,意味着程序需要的页面多,页面传送的次数就多,而每次传送一个大页面的时间与传送小页面的时间几乎相同,从而增加了总体传送时间。
设进程的平均大小为s字节,页面尺寸为p字节,每个页表项占e字节。那么每个进程需要的页数大约为s/p,占用selp字节的页表空间。每个进程的内部碎片平均为p/2。因此由页表和内部碎片带来的总开销是
,最佳页面尺寸公式为:
分段存储管理
在存储器管理中,页面是 信息的 物理单位,分段是信息 的逻辑 单位。页面大小由系统确 定 , 分段大小由 用户程序确定。
把逻辑地址转变为内存的物理地址的过程称作重定位它分为静态重定位和动态重定位两种形式在现代操作系统中都采用动态重定位形式来实现这种地址转换。
分页系统中,将逻辑地址分成页号和页内地 址是由机器硬件(或地址变换机构)进行的 ,故分页系统的作业地址空间是一维的 ,在分段系统中,将逻辑地址分成段号和段 内地址是由_程序员__进行的,故分段系统的 作业地址空间是二维的
※※分页/分段存储管理 相同点与不同点
分页式管理:将内存分成固定大小的页,分配若干页将整个进程载入。页面可以不连续是其重要优点,不会产生外碎片,更有效地利用了内存,不过会产生一些内碎片,即分配给进程的最后一个页往往不能正好用完,不过在页面大小不是很大的时候可以接受。
分段式管理:将程序分为若干个段,如数据段和代码段,加以不同的保护。施加保护是分段式的优点,但其仍是向分区式管理一样的连续分配。
※内存保护措施
页的保护
(1)利用页表本身进行保护
每个进程有自己的页表,页表的基址信息放在该进程的PCB中。访问内存需要利用页表进行地址变换。这样,使得各进程在自己的存储空间内活动。
为了防止进程越界访问,某些系统还提供页表长度寄存器PTLR这个硬件,记载该页表的长度。
当进程访问某个逻辑地址中的数据时,分页地址映像硬件自动将有效地址分为页号和页内地址。在检索页表之前,先将页号与页表长度(即PTLR)进行比较。如果页号大于或等于页表长度,则向操作系统发出一个地址越界中断,表明此次访问的地址超出进程的合法地址空间。
(2)设置存取控制位
通常,在页表的每个表项中设置存取控制字段,用于指明对应内存块中的内容允许执行何种操作,从而禁止非法访问。一般设定为只读(R),读写(RW),读和执行(RX)等权限。如果一个进程试图写一个只 允许读的内存块时, 则会引起操作系统的一次中断一 非法访问性中断,操作系统会拒绝该进程的这种尝试,从而保护该块的内容不被破坏。
(3)设置合法标志
一-般在页表的每项中还设置合法/非法位。当该位设置为“合法”时,表示相应的页在该进程的逻辑地址空间中是合法的页:如果设置为“非法”,则表示该页不在该进程的逻辑地址空间内。
利用这一位可以捕获非法地址。操作系统为每个页面设置这一位,从而规定允许或禁止对该页的访问。
段的保护
①存取控制。在段表的各项中增加几位,用来记录对本段的存取方式,如可读、可写、可执行等。
❷段表本身可起保护作用。每个进程都有自己的段表,在表项中设置该段的长度限制。在进行地址映射时,段内地址先与段长进行比较,如果超过段长,便发出地址越界中断。这样,各段都限定自己的活动范围。另外,段表地址寄存器中有段表长度的信息。当进程逻辑地址中的段号不小于段表长度时,表示该段号不合法,系统会产生中断。从而每个进程也被限制在自己的地址空间中运行,不会发生一一个用户进程破坏另一个用户进程空间的问题。
❸保护环。它的基本思想是把系统中所有信息按照其作用和相互调用关系分成不同的层次(即环),低编号的环具有高优先权,如操作系统核心处于0环内:某些重要的实用程序和操作系统服务位于中间环:而一般的应用程序(包括用户程序)则在外环上。即每一层次中的分段有一个保护环,环号越小,级别越高。
在环保护机制下,程序的访问和调用遵循如下规则:一个环内的段可以访问同环内或环号更大的环中的数据段;一个环内的段可以调用同环内或环号更小的环中的服务。
※请求分页和简单分页
※不同
在分页存储管理方式中 :不具备页面对换功能,不支持虚拟存储器功能,在调度作业运行时 ,必须将它的所有页面一次调入内存 ,若内存没有足够的块, 则作业等待的这种分页管理方式被称为纯分页或基本分页存储管理方式.
而请求分页管理方式是支持虚拟存储的,具备了页面的对换功能。调度作业时是将它的一部分(而不是全部) 放入内存,当发现页面缺少时 会发出一个缺页请求 从外存调用页面文件进入内存.
基于以上所述:基于这一点,请求分页存储管理可以提供虚拟存储器,而分页存储管理却不能提供虚拟存储器。
※优缺点
优点:
(1)虚存量大,适合多道程序运行,用户不必担心内存不够的调度操作。动态页式管理提供了内存与外存统一管理的虚存实现方式。
(2)内存利用率高,不常用的页面尽量不留在内存。
(3)不要求作业连续存放,有效地解决了“碎片”问题。与分区式比,不需移动作业;与多重分区比,无零星碎片产生。UNIX 操作系统较早采用。
缺点:
(1)要处理页面中断、缺页中断处理等,系统开销较大。
(2)有可能产生“抖动”。
(3)地址变换机构复杂,为提高速度采用硬件实现,增加了机器成本。
基本分页存储管理概念
1) 一次性:要求将作业全部装入内存后方能运行。许多作业在每次运行时,并非其全部程序和数据都要用到。如果一次性地装入其全部程序,造成内存空间的浪费。
2) 驻留性:作业装入内存后,便一直驻留在内存中,直至作业运行结束。尽管运行中的进程会因I/O而长期等待,或有的程序模块在运行过一次后就不再需要(运行)了,但它们都仍将继续占用宝贵的内存资源。
请求分页存储管理概念
请求分页存储管理技术是在单纯分页技术基础上发展起来的,二者的根本区别在于请求分页提供虚拟存储器。
它的基本思想是:当一个进程的部分页面在内存时就可调度它运行;在运行过程中若用到的页面尚未在内存,则把它们动态换入内存。这样,就减少了对换时间和所需内存数量,允许增加程序的道数。
为了标示进程的页面是否已在内存,在每个页表项中增加一一个标志位,其值为1表示该页已在内存,其内存块可以访问;其值为0表示该页尚未装入内存,不能立即进行访问。
如果地址转换机构遇到一个具有标志位为0的页表项时,便产生一个缺页中断,告诉CPU当前要访问的这个页面还未装入内存,这不是用户程序的错误。
操作系统必须处理这个中断,即装入所要求的页面,相应调整页表的记录,然后再重新启动该指令。由于这种页面是根据请求而被装入的,所以这种存储管理方法也叫做请求分页存储管理。
通常在进程最初投入运行时,仅把它的少量几页装入内存,其他各页是按照请求顺序动态装入的。这就保证用不到的页面不会被装入内存。
当内存空间已满,而又需要装入新的页面时,根据置换功能适当调出某个页面,以便腾出空间而装入新的页面。
为实现请求分页,需要一定的硬件支持,包括:页表机制、缺页中断机构、地址变换机构。
Belady
所谓Belady现象是指:采用FIFO算法时,如果对—个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多但缺页率反而提高的异常现象。
Belady现象的原因是FIFO算法的置换特征与进程访问内存的动态特征是矛盾的,即被置换的页面并不是进程不会访问的。 先进先出算法(FIFO)。选择装入最早的页面置换。可以通过链表来表示各页的装入时间先后。FIFO的性能较差,因为较早调入的页往往是经常被访问的页,这些页在FIFO算法下被反复调入和调出,并且有Belady现象.
文件管理(20)
※文件及文件类型
根据不同角度,可以将文件划分为不同类别。
1、按性质和用途可分为:
1)系统文件:如内核,系统应用程序,数据;只允许用户执行,不能读写和修改。
2)库文件:只允许读和执行,如C子程序库。
3)用户文件:由用户建立的文件,如源程序、目标程序和数据文件等。只允许文件所有者和所有者授权用户使用。
2、按信息的保存期限可分为:
1)临时文件:即记有临时性信息的文件。用于系统在工作过程中产生的中间文件,一般有暂存的目录。正常工作情况下,工作完毕会自动删除,一旦有异常情况往往会残留不少临时文件。
2)永久性文件:其信息需要长期保存的文件。指一般受系统管理的各种系统和用户文件,经过安装或编辑、 编译生成的文件,存放在软盘、硬盘或光盘等外存上。
3)档案文件:系统或一些实用工具软件包在工作过程中记录在案的文档资料文件,以便查阅历史档案。
3、按文件中数据的形式可分为:
1)源文件:由源程序和数据构成的文件。通常由终端或输入设备输入的源程序和数据所形成的文件都属于源文件。
2)目标文件:把源程序经过相应语言的编译程序编译过,但尚未经过链接程序链接的目标代码所构成的文件。它属于二进制文件。通常,目标文件所使用的后缀名是“.obj”。
3)可执行文件:把编译后所产生的目标代码再经过链接程序链接后所形成的文件。
4、按存取控制属性可分为:
1)只执行文件:只允许被核准的用户调用执行,既不允许读,更不允许写。
2)只读文件:只允许文件主及被核准的用户去读,但不允许写。
3)读写文件:允许文件主和被核准的用户去读或写的文件。
(无保护文件。各个操作系统的保护方法和级别有所不同:DOS操作系统有系统、隐藏、可写三种保护;UNIX或Linux操作系统有九个级别的保护。)
5、按文件的逻辑结构可分为:
1)有结构文件(记录式文件):由若干个记录所构成的文件,如大量的数据结构和数据库。
2)无结构文件(流式文件):直接由字符序列所构成的文件,文件长度为所含字符数。如大量的源程序,可执行程序,库函数。
6、按文件的物理结构可分为:
1)顺序文件(连续文件):文件中的记录,顺序地存储到连续的物理盘块中,顺序文件中所记录的次序,与它们存储在物理介质上存放的次序是一致的。
2)链接文件:文件中的记录可存储在并不相邻接的各个物理块中,通过物理块中的链接指针组成一个链表管理。
3)索引文件:文件中的记录可存储在并不相邻接的各个物理块中,记录和物理块之间通过索引表项按关键字存取文件,通过物理块中的索引表管理,形成一个完整的文件。
4)Hash文件:通过散列函数实现存储的文件。
7、按文件的内容形式和系统处理方式可分为:
1)普通文件:由ASCII码或二进制码组成的文件。一般用户建立的源程序文件、数据文件、目标代码文件及操作系统自身代码文件、库文件等都是普通文件,它们通常存储在外存储设备上。
2)目录文件:由文件目录组成的,用来管理和实现文件系统功能的系统文件,通过目录文件可对其它文件的信息进行检索。目录文件也是由字符序列构成,可进行与普通文件一样的各种操作。
3)特殊文件(设备文件):特指系统中的各类I/O设备。为了便于统一管理,系统将所有的输入/输出设备都视为文件,按文件方式提供给用户使用。
※文件的功能
文件系统 = 文件管理程序 + 它所管理的全部文件 + 文件管理所需的数据结构
①文件管理。能够按照用户要求创建一个新文件,删除一个老文件,对指定文件进行打开、关闭、读、写、执行等操作。
②目录管理。为每个文件建立一个文件目录项,若干文件的目录项构成一个目录文件。根据用户要求创建或删除目录文件,对用户指定的文件进行检索和权限验证,更改工作目录等。
③文件存储空间管理:由文件系统对文件存储空间进行统管理 包括对文件存储空间的分配与回收,且为文件的逻辑结构与它在外存( 主要是磁盘)上的物理地址之间建立映射关系。
④文件的共享和保护。在系统控制下,一个用户可以共享其他用户的文件。为了防止对文件的未授权访问或破坏,文件系统应提供可靠的保护和保密措施,如采用口令、存取权限及文件加密等。为了防止意外事故对文件信息的破坏,应有转储和恢复文件的能力。
⑤提供方便的接口。为用户提供统一的文件操作方式,即用户只用文件名就可以对存储介质上的信息进行相应操作,从而实现“按名存取”。操作系统应向用户提供-一个使用方便的接口,主要是有关文件操作的系统调用,供用户编程时使用。
看待文件系统有不同的观点,主要是用户观点(即外部使用观点)和系统观点(即内部设计观点)。
- 从用户来看,文件系统应该做到存取文件方便,信息存储安全可靠,既能实现共享又可做到保密。
- 从系统角度看,它要对存放文件的存储空间实现组织、分配、信息的传输,对已存信息进行检索和保护等。
※文件系统的目标
在操作系统中,文件系统的主要目的是“实现对文件的按名存取”。
文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;
文件系统实现了“按名存取”,只要知道文件名就可以存取文件,而不必考虑文件存储在磁盘上什么地方。
文件系统模型
※文件的创建、修改、读写等功能
※文件的逻辑组织、物理组织
用户对文件的观察和使用是从自身处理文件中数据时采用的组织方式来看待文件组织形式。这种从用户关点出发所见到的文件组织形式称为文件的逻辑组织。
系统设计人员看待文件时要考虑文件具体在存储设备中如何放置、如何组织如何实现存取等细节,这与存储介质的存储性能有关。文件在存储设备上的存储组织形式称为文件的物理组织。
逻辑组织
文件的逻辑组织通常分为两种形式,即有结构文件和无结构文件。
就比如同一个文件放在磁盘和磁带上,磁盘可以采用索引型和顺序型,磁带上就只能采用顺序型了,这取决于磁带的存储介质特性
1)有结构文件
又称作记录式文件,它在逻辑上可被看成一组连续记录的集合,即文件是由若干个相关的记录组成。每个记录是一组相关的数据集合,用于描述一个对象某个方面的属性。
记录式文件按其记录的长度是否相同又可分为:定长记录文件和变长记录文件两种。
(1)定长记录文件:指文件中所有记录的长度都相同。文件的长度可用记录的数目来表示。定长记录处理方便,开销小,被广泛用于数据处理中。
(2)变长记录文件:指文件中各记录的长度不相同。在处理之前每个记录的长度是已知的。
有结构文件的逻辑结构:
1、顺序文件
文件的记录一个接一个地顺序排列(逻辑上),记录可以是定长的或可变长的。各个记录在物理上顺序存储或链式存储。根据记录是否按关键字存储可分为
- 串结构:记录之间的顺序与关键字无关,通常按照时间顺序
- 顺序结构:记录之间的顺序按关键字顺序排列
缺点:不定长记录查找困难,无法随机存取,而定长记录的顺序文件可以随机存取。
2、索引文件
为文件建立一张索引表,每个记录对应一个索引表项。本身是定长记录的顺序文件,可以随机存取。可将关键字或其他数据项作为索引号内容,使其可快速查找。注意每次增删,需要对索引表进行修改。
缺点:每个记录对应一个索引表项,索引表可能会很大,空间利用率低
3、索引顺序文件
同样为文件建立一张索引表,但不同的是一组记录对应一个索引项
为了进一步提高检索效率,可以为顺序文件建立多级索引表
2)无结构文件
无结构文件是指文件内部不再划分记录,它是由一组相关信息组成的有序字符流,即流式文件,其长度直接按字节计算。如大量的源程序、可执行程序、库函数等采用的文件形式是无结构文件形式。在UNIX系统中,所有的普通文件都被看做是流式文件,系统不对文件进行格式处理
物理组织
1)连续文件
连续文件(又称做顺序文件)是基于磁带设备的最简单的物理文件结构,它是把一个逻辑上连续的文件信息存放在连续编号的物理块(或物理记录)中。
连续文件的优点是在顺序存取时速度较快,常用于存放系统文件,如操作系统文件、编译程序文件和其它由系统提供的实用程序文件,因为这类文件往往被从头至尾依次存取。
但连续文件也存在如下缺点:
(1)要求建立文件时就确定它的长度,依此来分配相应的存储空间,这往往很难实现。
(2)不便于文件的动态扩充。
(3)可能出现外部碎片,就是在存储介质上存在很多空闲块,但它们都不连续,无法被连续的文件使用,从而造成浪费。
2)串连文件
为克服连续文件的缺点,可把一个逻辑上连续的文件分散存放在不同的物理块中,这些物理块不要求连续,也不必规则排列。为了使系统能找到下一个逻辑块所在的物理块,可在各物理块中设立一个指针(称为连接字),它指示该文件的下一个物理块。
串连文件克服了连续文件的缺点,但它又带来新的问题:
(1)一般仅适于对信息的顺序访问,而不利于对文件的随机存取。
(2)每个物理块上增加一个连接字,为信息管理添加了一些麻烦。
3)FAT文件
串连文件的缺点可通过把连接字放在一个内存表格中的方式加以克服。这种在内存中的表格就称为文件分配表(FAT,File Allocation Table)。
由于连接字保存在FAT表项中,因此整个盘块都可以用来存放数据。另外,也更容易实现随机存取了。与串连文件相似,在文件目录中要添加一个整数,标明该文件的起始盘块号。
这种方法的主要缺点是整个FAT必须在系统工作期间始终驻留在内存中,从而占用了较多内存空间。
当然,可以把这个表移到分页内存中,采用调页方式进行管理。但是,仍然要占用大量的虚存空间和盘空间,同时也会产生额外缺页问题。
4)索引文件
索引文件是实现非连续分配的另一种方案:系统为每个文件建立一个索引表。其中的表项指出存放该文件的各个物理块号,而整个索引表由文件说明项指出。
这种结构除了具备串连文件的优点之外,还克服了它的缺点。它可以方便地进行随机存取。但是这种组织形式需要增加索引表带来的空间开销。如果这些表格仅放在盘上,那么在存取文件时首先得取出索引表,然后才能查表、得到物理块号。这样就至少增加了一次访盘操作,从而降低了存取文件的速度,加重了 I/O负担。一种改进办法是同时把索引表部分或全部地放人内存。这是以内存空间为代价来换取存取速度的改善。
5)多重索引文件
为了用户使用方便,系统一般不应限制文件的大小。如果文件很大,那么不仅存放文件信息需要大量盘块,而且相应的索引表也必然很大。在这种情况下把索引表整个放在内存是不合适的,为此引出多重索引结构(又称多级索引结构)。在这种结构中采用了间接索引方式,即由最初索引项中得到某一盘块号,该块中存放的信息是另一组盘块号;而后者每一块中又可存放下一组盘块号(或者是文件本身信息),这样间接几级(通常为1~3级),最末尾的盘块中存放的信息一定是文件内容。例如,UNIX文件系统就采用了多重索引的方式。
这种方法具有一般索引文件的优点,但也存在间接索引需要多次访盘而影响速度的缺点。由于UNIX分时环境中多数文件都较小,这就大大减弱了其缺点所造成的不利影响。
※目录文件
索引节点,简称为 inode,用来记录文件的元数据,比如 inode 编号、文件大小、访问权限、修改日期、数据的位置等。索引节点和文件一一对应,它跟文件内容一样,都会被持久化存储到磁盘中。所以记住,索引节点同样占用磁盘空间
文件目录
包含有关文件的信息,信息主要有:属性,位置,所有权。这些信息主要是由OS进行管理。
目录管理的基本要求
- 从用户角度看待,目录在用户(应用程序)所需要的文件名和文件之间提供一种映射。
- 目录管理提供的是:按名存取。
文件的组成
- 文件由文件体和文件控制块(FCB)两部分。文件控制块FCB是系统为管理文件而设置的一个数据结构。
- FCB是文件存在的标志
FCB
文件控制块(FCB):文件控制块是用来存放文件各种信息的数据结构,以实现“按名存取”。
FCB的有序集合称为文件目录,一个FCB就是一个文件目录项。为了创建一个新文件,系统将分配一个FCB并存放在文件目录中,成为目录项。
FCB主要包含以下信息:
1)基本信息:如文件名、文件的物理位置、文件的逻辑结构、文件的物理结构等。
2)存取控制信息:如文件存取权限等。
3)使用信息:如文件建立时间、修改时间等。
一个文件系统中,FCB 占64B,一个盘块大小为1KB,采用一级目录,假定文件目录中有3200个目录项,则查找一个文件平均需要______次访问磁盘
3200个目录项需要占用的盘块数=3200×64B/1KB=200个。采用一级目录,平均访问盘块次数=(0+200)/2=100,
文件目录结构
- 单级目录结构:早期操作系统只建立一张目录表,每个文件占一个目录项,实现“按名存取”,但是不允许文件重名,不同用户文件不允许重名。
- 两级目录结构:分为主文件目录和用户文件目录,允许不同用户的文件重名。
- 多级目录结构(树形目录结构):不同目录下的文件可以重名,从根目录出发的路径为绝对路径,系统根据绝对路径开始一层一层向下找;从当前的目录出为相对路径,系统从当前路径出发。
优缺:层次结构清晰、不便于实现文件共享
- 无环图目录结构:允许不同文件名指向同一文件,甚至同一个目录。需要为每个共享结点设置一个共享计数器,当用户提出删除时,只会删除该用户的FCB、并使共享计数器减一,并不删除共享结点(为0时删除结点)。
注意:共享文件与复制文件的区别(共享文件中是同一文件,其中一个用户修改内容,那大家都能看见)
目录结构形式有以下这几种:
- 单层结构目录:所有文件都包含在同一目录,优点是便于理解和支持,缺点是多用户体验不好;
- 双层结构目录:先为每个用户做一个主文件目录(用户1,用户2,用户3...),用户n目录下才是用户的文件目录,比上面的就多了一个主文件目录而已;
- 树状结构目录:如果能理解将双层结构目录作为两层树来看待,那么将目录结构扩展为任意高度的树就显得自然了。树是最常用的目录结构,系统里的每个文件都有唯一的路径名。注意,树上不能有环。
- 无环图目录:虽然没有环,但是允许目录含有共享子目录的文件,同一文件或子目录可出现在两个不同的目录中。
- 通用图目录:可以形成环。(很少见)
文件目录
文件与文件控制块是一一对应的,把所有FCB组织在一起,就构成了文件目录,即文件控制块的有序集合。
给该目录也设定一个文件名,就可以通过查找文件目录找到该文件对应的目录项(即FCB)。
文件目录一般有一级目录结构、二级目录结构和多级目录结构。
目录文件:文件目录是需要长期保存的,为了实现文件目录的管理,通常将文件目录以文件的形式保存在外存空间,这个文件就被称为目录文件。目录文件是长度固定的记录式文件。
※※索引节点(文件管理)
在检索目录文件的过程中,只用到文件名,仅当找到一个目录项(查找文件名与目录项中文件名匹配)时,才需要从该目录项中读出该文件的物理地址。就是在检索目录时,文件的其他描述信息不会用到,也不需调入内存。
因此,有的系统(如UNIX)釆用文件名和文件描述信息分开的方法,文件描述信息单独形成一个称为索引结点的数据结构,简称为i结点。在文件目录中的每个目录项仅由文件名和指向对应的i结点的指针构成。
假定一个索引结点为128字节,指针为4个字节长,而状态信息占68个字节且每块大小为8KB,问在索引节点中有多大的空间给指针?使用直接指针、一次间接指针、二次间接指针、三级间接指针分别可以表示多大的文件?(8分)
由于索引结点为128字节,状态信息占68个字节,则用于指针的空间大小为:128-68=60
(字节)( 2分)
一次间接指针、二次间接指针、三级间接指针将占用索引结点中的三个指针项,因此直接指针项数为:60/4-3=12
(个)(2分)
使用直接指针时可以表示12*8196(8KB)=98304
(字节)的文件。1分
使用一次间接指针可以表示 8196/4=2048
,一个磁盘块可装入2048个指针项12*8196+2048*8096=98304+16580608=16678912
(字节)的文件 1分
使用二次间接指针可以表示 2048*2048=4M
(个)指针项 16678912+4M*8196=32GB
的文件 1分
使用三次间接指针可以表示 2048*2048*2048=8G
个)指针项32GB+8G*8196=16TB
的文件 1分
※文件的存储空间管理、(空闲)
存储管理
1、连续分配(顺序存储结构):
采用连续分配可把逻辑文件中的信息顺序存放到一组邻接的物理盘块中,这样形成的物理文件称为连续文件(或顺序文件)。
每个文件在磁盘上占有一组连续的块,形成一个线性排序,这种排序使访问磁盘时需要的寻道数和寻道时间最小。
连续分配可以用第一块的磁盘地址和连续块的数量来定义。如果文件有n块长并从位置b开始,那么该文件将占有块b, b+1, b+2, …, b+n-1。
一个文件的目录条目包括开始块的地址和该文件所分配区域的长度。
连续分配支持顺序访问和随机访问。
优点:实现简单;特别在顺序存取时速度较快,一次可以存取多个盘块,改进了I/O性能;也很容易直接存取文件中的任意一块。
缺点:① 不便于文件动态扩充,因为一个文件末尾后的盘块可能已经分配给其它文件,一旦增加,需要大量移动盘块。② 可能出现外部碎片。反复增删文件后会产生外部碎片(与内存管理分配方式中的碎片相似)。③ 很难在建立文件时就确定文件需要的空间大小,并依此来分配存储空间,所以适用于长度固定的文件。
实现连续盘块分配的策略:
① 最先适应算法 ② 最佳适应算法 ③ 最近适应算法
2、链接分配(链接存储结构):
把逻辑上连续的文件分散存放在不同的物理块中,这些物理块不要求连续,也不规则排列。
这种物理结构形式的文件称做链接文件或串连文件。
链接分配是釆取离散分配,消除了外部碎片,提高了磁盘空间的利用率。系统根据文件的需求,为它分配必需的盘块,当文件动态增长时,可以动态为它分配盘块,故而无需事先知道文件的大小。此外,对文件的增、删、修改也非常方便。
带来的问题:① 一般仅适于对信息的顺序访问,不利于对文件的随机存取。② 每个物理块上增加一个链接字。③ 因为链接指针可靠性变低。
链接分配可分为隐式链接和显式链接两种形式。
1)隐式连接:(只能遍历找到第一个存储的盘块)
每个文件对应一个磁盘块的链表;磁盘块分布在磁盘的任何地方,除最后一个盘块外,每一个盘块都有指向下一个盘块的指针,这些指针对用户是透明的。
- 隐式链接分配的缺点在于无法直接访问盘块,只能通过指针顺序访问文件,盘块指针也消耗了一定的存储空间。
- 隐式链接分配的稳定性也有问题,系统在运行过程中由于软件或者硬件错误导致链表中的指针丢失或损坏,会导致文件数据的丢失。
2)显式连接:(fat文件分配表)
是指把用于链接文件各物理块的指针,显式地存放在内存的一张链接表中。该表在整个磁盘仅设置一张,每个表项中存放链接指针,即下一个盘块号。在该表中,凡是属于某文件的第一个盘块号,或者每一条链的链首指针所对应的盘块号,均作为文件地址被填入相应文件的FCB的“物理地址”字段中。
由于查找记录的过程是在内存中进行的,因而不仅显著地提高了检索速度,而且大大减少了访问磁盘的次数。
由于分配给文件的所有盘块号都放在该表中,称该表为文件分配表(FAT)
3、索引分配(索引存储结构):
链接分配解决了连续分配的外部碎片和文件大小管理的问题。但是链接分配不能有效支持直接访问(FAT除外)。
索引分配解决了这个问题,它把每个文件的所有的盘块号都集中放在一起构成索引块(表),每个文件都有其索引块,这是一个磁盘块地址的数组。索引块的第i个条目指向文件的第i个块。目录条目包括索引块的地址。要读第i块,通过索引块的第i个条目的指针来查 找和读入所需的块。
- 索引分配除了具备链接文件的优点外,还克服了它的缺点,支持随机存取,且没有外部碎片。
- 但索引分配需要增加索引表,空间开销也会增大,所以存取文件的速度也会受到一定的影响。
索引块的大小是个重要问题,每个文件必须有一个索引块,如果索引块太小就无法支持大文件,可以釆用以下机制来处理:
1)多层索引:
多层索引使第一层索引块指向第二层的索引块,第二层索引块再指向文件块。这种方法根据最大文件大小的要求,可以继续到第三层或第四层。
例如,4096B的块,能在索引块中存入1024个4B的指针。两层索引允许1048576个数据块,即允许最大文件为4GB。
2)混合索引:
将多种索引分配方式相结合的分配方式。例如,系统既釆用直接地址,又采用单级索引或两级索引等方式。
索引块分为直接块和间接块,多重索引具有一般索引文件的优点,但也存在着间接索引需要多次访盘而影响速度的缺点。
混合索引:混合索引分配在UNIX系统中釆用,UNK SystemV的索引结点中,共设置了13个地址项,iaddr(O)–iaddr(12)。在BSD UNIX的索引结点中,共设置了13个地址项,它们都把所有的地址项分成两类,即直接地址和间接地址。
直接地址:
为了提高对文件的检索速度,在索引结点中设置10个直接地址项,即iaddr(O)–iaddr(9)来存放直接地址。每项中所存放的是该文件数据所在盘块的盘块号。假如每个盘块的大小为4KB,当文件不大于40KB时,便可直接从索引结点中读出该文件的全部盘块号。
一次间接地址:
对于大中型文件,只釆用直接地址并不现实。可再利用索引结点中的地址项iaddr(lO) 来提供一次间接地址,就是一级索引分配。一次间址块就是索引块,系统将分配给文件的多个盘块号记入其中。在一次间址块中可存放1024个盘块号,因而允许文件长达4MB。
多次间接地址:
当文件长度大于4MB+40KB(—次间址与10个直接地址项)时,系统釆用二次间接地址。用地址项iaddr(11)提供二次间接地址,就是两级索引分配方式。系统此时是在二次间址块中记入所有一次间址块的盘号。在釆用二次间址方式时,文件最大长度可达4GB。同理,地址项iaddr(12)作为三次间接地址,其所允许的文件最大长度可达4TB。
索引分配下,访问文件需要至少两次访问外存,首先要读取索引块的内容,然后再访问具体的磁盘块,因而降低了文件的存取速度。为了解决这一问题,通常将文件的索引块读入内存的缓冲区中,以加快文件的访问速度。
文件分配方式
空闲磁盘管理
1、空闲表法:
空闲表法属于连续分配方式,与内存的动态分配方式类似,为每个文件分配一块连续的存储空间。系统为外存上的所有空闲区建立一张空闲盘块表,每个空闲区对应于一个空闲表项,包括序号、该空闲区第一个盘块号、该区的空闲盘块数等信息。再将所有空闲区按其起始盘块号递增的次序排列。
- 空闲盘区的分配与内存的动态分配类似,同样可釆用首次适应算法、循环首次适应算法等。对释放的存储空间进行回收时,也釆取类似于内存回收的方法,即要考虑回收区是否与空闲表中插入点的前区和后区相邻接,对相邻接者应予以合并。
- 空闲表法特别适于存放连续文件,若存储空间有大量的小空闲区时,检索效率降低。还会产生外存的外部碎片,造成磁盘空间的浪费。
2、空闲链表法:
将所有空闲区域拉成一条空闲链,根据构成链所用的基本元素不同,可把链表分成空闲盘块链和空闲盘区链。
空闲盘块链是将磁盘上的所有空闲空间以盘块为单位拉成一条链。
- 当用户因创建文件而请求分配存储空间时,系统从链首开始,依次摘下适当的数目的空闲盘块分配给用户。
- 当用户因删除文件而释放存储空间时,系统将回收的盘块依次插入空闲盘块链的末尾。
这种方法的优点是分配和回收一个盘块的过程非常简单,但在为一个文件分配盘块时,可能要重复多次操作。
在每个盘区上除含有用于指示下一个空闲盘区的指针外,还应有能指明本盘区大小(盘块数)的信息。分配盘区的方法与内存的动态分区分配类似,通常釆用首次适应算法。在回收盘区时,同样也要将回收区与相邻接的空闲盘区相合并。
3、位示图法:
位示图是利用二进制的一位来表示磁盘中一个盘块的使用情况,磁盘上所有的盘块都有一个二进制位与之对应。当其值为“0”时,表示对应的盘块空闲;当其值为“1”时,表示对应的盘块已分配。
- 盘块分配:顺序扫描位示图,从中找出一个或一组其值为“0”的二进制位。将所找到的一个或一组二进制位,转换成与之对应的盘块号。修改位示图,令相应位为“1”。
- 盘块回收:将回收盘块的盘块号转换成位示图中的行号和列号。修改位示图,令相应位为“0”。
某操作系统的磁盘文件空间共有500块,若用字长为32位的位示图管理磁盘空间,试问:
(1)位示图需多少个字?
(2)第i字第j位对应的块号是多少?
(3)给出申请/归还一块的工作流程
(1)位示图需要的字数计算:INT(500/32)=16 个字。
(2)块号b=(i-1)*32+j
(3)申请的过程:顺序扫描位示图、找到空闲块并分配、修改位示图map[i,j]=1。
归还的过程:找到回收盘块在位示图中的行和列,修改位示图map[i,j]=0。
4、成组链接法:
空闲表法和空闲链表法都不适合大型文件系统,因为会使空闲表或空闲链表太大。在UNIX系统中釆用的是成组链接法,这种方法结合了空闲表和空闲链表两种方法,克服了表太大的缺点。
基本思想:把一组n个空闲扇区地址保存在第一个空闲扇区内,其后一个空闲扇区内则保存另一组n各空闲扇区的地址,如此继续,直至所有空闲扇区均予以链接。系统只需要保存一个指向第一个空闲扇区的指针。
例如:每50个空闲块为一组。
第一组的50个空闲块块号放在第二组的头一块中,第二组的其余49块是完全空闲的。第二组的50个块号又放在第三组的头一块中,以此类推,组与组之间形成链接关系。
表示存储器空闲空间的“位向量”表或第一个成组链块以及卷中的目录区、文件区划分信息都需要存放在辅存储器中,一般放在卷头位置,在UNIX系统中称为“超级块”。在对卷中文件进行操作前,“超级块”需要预先读入系统空间的主存,并保持主存“超级块”与辅存卷中“超级块”的一致性。
※磁盘管理
磁盘初始化
一台 PC 计算机系统启动时,首先执行的是(BIOS引导程序),然后加载(分区引导记录)。
在设备管理中,虚拟设备的引入和实现是为了充分利用设备,提高系统效率,采用(分区引导记录、配置系统,并执行分区引导记录)来模拟低速设备(输入机或打印机)的工作。
扇区是磁盘最小的物理存储单元,一般而言是每个扇区512B大小,但是操作通常不直接管理每一个扇区,而是通过将若干个扇区组成的一个更大的集合来去进行操作管理。
这个比扇区更大的集合,在Windows下叫做簇;在Linux下叫做块(block)。
一个新磁盘只是一个空白盘。
在磁盘能存储数据之前,必须分成扇区以便磁盘控制器能进行读和写操作,称为低级格式化(物理分区)。低级格式化为磁盘的每个扇区釆用特别的数据结构。每个扇区的数据结构通常由头、数据区域(通常为512B大小)和尾部组成。头部和尾部包含了一些磁盘控制器所使用的信息。
为使磁盘存储文件,操作系统还需要将自己的数据结构记录在磁盘上:
- 第一步将磁盘分为由一个或多个柱面组成的分区(即的C盘、D盘等形式的分区);
- 第二步对物理分区进行逻辑格式化(创建文件系统),操作系统将初始的文件系统数据结构存储到磁盘上,这些数据结构包括空闲和已分配的空间以及一个初始为空的目录。
引导块
计算机启动时需要运行一个初始化程序(自举程序),它初始化CPU、寄存器、设备控制器和内存等,接着启动操作系统。
为此,该自举程序应找到磁盘上的操作系统内核,装入内存,并转到起始地址,从而开始操作系统的运行。
自举程序通常保存在ROM中,为了避免改变自举代码需要改变ROM硬件的问题,故只在ROM中保留很小的自举装入程序,将完整功能的自举程序保存在磁盘的启动块上,启动块位于磁盘的固定位。拥有启动分区的磁盘称为启动磁盘或者系统磁盘。
坏块
磁盘有移动部件且容错能力弱,所以容易导致一个或多个扇区损坏。
产生坏块的原因:
- 天生的:部分磁盘甚至出厂时就有坏扇区;
- 继发的:即在使用过程中因外界干扰或故障造成的磁层损坏
处理方式
①控制器处理方式。
在磁盘出厂之前,对它进行检测,并把发现的坏块清单写在磁盘上。磁盘有若干备用扇区。在正常情况下,用户程序不使用这些扇区。当发现坏块时,对每个坏块都用一个备用扇区予以替代。
替代方式有直接替代和绕过坏块两种。
- 直接替代方式是对磁道上的扇区依次编号,在最后留出备用扇区,如留有2个备用扇区。如果发现某个扇区(如第9扇区)有缺陷,控制器就把一个备用扇区映像为第9扇区。这样,凡是对第9扇区的访问就由控制器映像到对应的备用扇区上。
- 绕过坏块方式是当发现坏块时,就绕过它,即不为它编号,接着从后面的扇区继续编号。由于坏块没有对应的扇区号,因此不会访问它。
在这两种情况下,控制器完全知道扇区的具体情况,它可利用内部表格(每个磁道一个)记下这些信息;或者重写每个扇区的扇区头,给出重新映射的扇区号。重写扇区头要做更多的工作,但可获得更好的性能,在旋转一圈中可以读出整个磁道。
当然,在日常操作中也会出现错误,并且纠错码也不能处理。此时,就重新读盘因为有些错误是暂时的,如磁头下面有灰尘,重读一次就会消除该错误。
如果控制器发现在某个扇区上反复出错,那么在该扇区完全坏掉之前,控制器会转换到备用扇区上。这样,数据不会丢失,甚至操作系统和用户都没有注意到这个问题。
②操作系统处理方式。
如果控制器没有能力对坏块重新映像,必须由操作系统解决坏块问题。操作系统首先通过读盘上的坏块表或亲自检测整个磁盘,获取坏块信息。一旦操作系统知道哪个扇区坏了,它就构建重映像表。如果操作系统也采用绕过坏块法,就要把第9扇区至本磁道最后一个扇区中的数据分别上移一个扇区。
为了保证坏块不出现在任何文件中,也不会出现在空闲块表或位示图中,操作系统可以创建一个秘密文件,其中包括所有的坏块。该文件并不进入文件系统,这样用户就不会意外地读到它。
(3)后备问题
与坏块相关的一个问题是后备。如果磁盘是逐个文件地进行后备,那么应当保证后备工具不把坏块文件也复制过去。为此,操作系统必须把坏块文件隐藏起来,即使后备工具也无法发现它。如果是逐个扇区地进行后备,那么就很难防止后备时出现读错误。
提高磁盘性能的一些方法
1)磁盘高速缓存:使用缓冲技术(内存、软缓冲);在硬盘中增加高速缓存(硬缓冲)
2)提前读(预输入)与延迟写(缓输出):置换技术、SPOOLing技术
3)优化数据分布:碎片整理、条块技术、交叉并行存取技术
4)虚拟盘:以内存的一定空间建立一个模拟的硬盘来工作,需要时将虚拟盘中的文件转存到实际硬盘中。虚拟盘由用户建立、控制管理和使用,高速缓存由系统控制和管理。
※磁盘调度算法
要使磁盘服务尽可能地快,就需要操作系统提供合适的磁盘调度算法,以改善磁盘服务的平均时间。
磁盘存取时间由寻道时间、旋转延迟时间、传输时间三部分组成。
磁盘调度的目的就是减少磁盘的存取时间
分为两种调度:
- 移臂调度:移动磁头寻找磁道柱面,是为了减少平均寻道时间。
- 旋转调度:读取的扇区旋转到磁头下,是为了减少平均旋转延迟时间。
设计磁盘调度算法应当考虑两个基本因素:
公平性:磁盘访问请求应在有限时间内得到满足。
高效性:尽量避免磁臂频繁来回移动,减少设备机械运动所带来的时间开销。
先来先服务调度算法
即按照访问请求的次序为各个进程服务,这是最公平而又最简单的算法,但是效率不高。因为磁头引臂的移动速度很慢,如果按照访问请求发出的次序依次读写各个磁盘块,则磁头引臂将可能频繁大幅度移动,容易产生机械振动,亦造成较大的时间开销,影响效率。
设:有一个请求磁盘服务的队列,要访问的磁道分别是:
98,183,37,122,14,124,65,67 磁头现在在53号磁道上
磁头共移动了640个磁道
最短寻道时间优先调度算法
SSTF算法以寻道优化为出发点,优先为距离磁头当前所在位置最近磁道(柱面)的访问请求服务。算法改善了平均服务时间,但缺点是:假设某一段时间外磁道请求不断,则可能有内磁道请求长时间得不到服务,缺乏公平性。
设:有一个请求磁盘服务的队列,要访问的磁道分别是:
98,183,37,122,14,124,65,67 磁头现在在53号磁道上
磁头共移动了236个磁道
扫描算法(双向扫描)
最短寻道时间优先算法只考虑访问磁道与磁头当前位置的距离,不考虑磁臂移动方向,而扫描算法则既考虑距离,也考虑方向,且以方向优先。
假设磁头处于最外磁道,并向内磁道移动。在移动的过程中,如果经过的磁道有访问请求,则为其服务,一直移动到最内层磁道,然后改变磁头移动方向,向外层磁道移动,同时为经过的请求服务,到达最外层磁道则再次改变方向,向内层磁道移动,到达最内层磁道再改变方向,如此反复扫描。
设:有一个请求磁盘服务的队列,要访问的磁道分别是:
98,183,37,122,14,124,65,67。磁头现在在53号磁道上,正向0磁道(内层)方向移动。
磁头共移动了236个磁道
循环扫描算法(单向扫描)
循环扫描算法是磁头只在一个方向进行扫描(由内向外),并响应进程的访问请求。当到达最外层磁道是,磁头直接快速移动至最内层磁道而不服务任何请求,然后再次由内向外扫描。
假设磁头只延由内向外的方向进行扫描,在移动的过程中,如果经过的磁道有访问请求,则为其服务,一直移动到最外层磁道。然后将磁头拉回最内层磁道,然后再次由内向外移动,如此反复。
设:有一个请求磁盘服务的队列,要访问的磁道分别是:
98,183,37,122,14,124,65,67。磁头现在在53号磁道上,固定由内向外方向移动(共200个磁道)。
磁头共移动了382个磁道
电梯调度算法
电梯调度算法是磁头在一个方向进行扫描时,如果该方向上没有访问请求,则停止扫描,并可以更改方向,扫描响应另一个方向的访问请求。
假设初始时,磁头处于最外磁道,并向内磁道移动。在移动的过程中,如果经过的磁道有访问请求,则为其服务,然后判断内磁道是否还有访问请求,如果有,则继续向内磁道移动并服务。如果没有,但反方向有访问请求,则立刻改变磁头移动方向,向外层磁道移动,同时为经过的请求服务,如此反复。
和扫描算法相比,电梯调度算法不需要扫描到最内层或最外层磁道。
设:有一个请求磁盘服务的队列,要访问的磁道分别是:
98,183,37,122,14,124,65,67 磁头现在在53号磁道上,正向内层磁道方向移动。
磁头共移动了222个磁道
设备管理(19)
分类与标识
分类
工作特性:存储设备+输入输出设备
传输速率的快慢:低速设备+中速设备+高速设备
共享属性:独占设备+共享设备+虚拟设备
从属关系:用户设备+系统设备
设备标识
系统按照某种原则为每一台设备分配唯一的号码,用作硬件(设备控制器)区分和识别设备代号,称为设备绝对代号(绝对地址)
在多道程序环境中,系统中的设备被多用户共享,用户在编写程序时不能通过绝对设备号来使用设备,只需向系统说明他要使用的设备类型,为此,操作系统为每类设备规定了一个编号——设备类型号。
用户程序需要向操作系统说明他要使用的设备是某一类的第几台,第几台是相对设备号。是用户自己规定的所用同类设备中的第几台,应与系统规定的绝对号相区别。
用户程序中提出使用设备的申请时,使用系统规定的设备类型号还是用户规定的相对设备号,由操作系统进行“地址转换”,变成系统中的设备绝对号。
IO软件的主要目标
设备独立性
用户程序与实际使用的物理设备无关,操作系统考虑设备不同而需要使用不同的设备驱动程序等问题。
这样,用户程序的运行就不依赖于特定设备是是否空闲,而由系统合理地进行分配,不论实际使用哪一台同类设备,程序都应正确执行。用户程序可在不同设备类型的计算机系统中运行,不致因设备型号的变化而影响程序的工作。
在已经实现设备独立性的系统中,用户编写程序时一般不再使用物理设备,而使用虚拟设备,由操作系统实现虚一实对应。
如在UNIX系统中,外部设备作为特别文件,与其他普通文件一样由文件系统统一管理,在用户面前对各种外设的使用如同对普通文件那样,用户具体使用的物理设备由系统统一管理。
统一命名
为了实现设备无关性,对文件和设备应统一命名,即它们的名字应该是一个简单、规范的字符串或整数,而不依赖于具体设备。
这样,用户不必知道哪个名字对应哪个设备。
层次结构
组成I/O软件的各个程序按照其功能和彼此接口,划分成若干层次。与用户IO程序相关的部分在高层,而直接与硬件动作相关的部分(如中断处理程序)在低层。
且在设计上尽可能采用统一的管理方法,使IO管理系统结构简练,性能可靠,易于维护。
效率高
为了提高外设的使用效率,除合理分配各种外部设备外,还要尽量提高外设和CPU,以及外设间的并行性,通常可采用通道和缓冲技术。
另外,还要均衡系统中各台设备的负载,最大限度地发挥所有设备的潜力。
※设备管理的功能
操作系统的设备管理应具备的主要功能是监视设备状态、进行设备分配、完成I/0操作和缓冲管理与地址转换
使用户所编制的程序与实际使用的物理设备无关,这是由设备管理的( A ) 功能实现的。
A.设备独立性B.设备分配C.缓冲管理D.虚拟设备
(1)监视设备状态
一个计算机系统中存在许多设备以及控制器、通道,在系统运行期间它们完成各自的工作,处于各种不同的状态。
例如,系统内共有三台打印机,其中一台正在打印,一台出现故障,另一台空闲。系统要知道三台打印机的情况,当有打印请求时,就能进行合理的分配,把空闲的打印机分出去。所以IO管理功能之一就是记住所有设备、控制器和通道的状态,以便有效地管理、调度和使用它们。
(2)进行设备分配
按照设备的类型(独占的、可共享或虚拟的)和系统中所采用的分配算法,实施设备分配,即决定把一台IO设备分给哪个要求该类设备的进程,并且把使用权交给它。
在大、中型系统中,还要分配相应的控制器和通道,以保证I/O设备与CPU之间有传送信息的通路。如果一个进程没有分到所需的设备或控制器、通道,那么,它就进入相应的等待队列。
完成这个功能的程序称作设备分配程序(或I/O调度程序)。
(3)完成I/O操作
通常,完成IO操作功能的程序叫做设备驱动程序。
在设置有通道的系统中,应根据用户提出的I/O要求,构成相应的通道程序。通道程序由通道指令构成,它们实现简单的IO控制和操纵。通道程序由通道去执行。
总之,系统按照用户的要求调用具体的设备驱动程序,启动相应的设备,进行IO操作;并且处理来自设备的中断。操作系统中每类设备都有自己的设备驱动程序。
(4)缓冲管理与地址转换
为使计算机系统中各个部分充分并行,不致因等待外设的输入/输出而妨碍CPU的计算工作,应减少中断次数。
同时,大多数IO操作都涉及缓冲区,所以系统应对缓冲区进行管理。
此外,用户程序应与实际使用的物理设备无关,这就需要将用户在程序中使用的逻辑设备转换成物理设备的地址。
逻辑设备名是由设备独立性软件统一命名,也就是从文件系统中直接看到的名字,例如/dev/tty等,操作系统通过逻辑设备表LUT完成逻辑设备名到物理设备名的映射
※设备管理对外围设备的控制层次
在一般大型计算机系统中,主机对外围设备的控制可通过通道、控制器和设备三个层次来实现。下述叙述中( 通道控制控制器,设备在控制器控制下工作)是正确的。
※※I/O系统的控制方式(区别,用于哪些设备)
按照I/O控制器功能的强弱以及和 CPU 之间联系方式的不同,可以把 I/O 设备的控制方式和通道控制方式分为四类:直接程序控制方式、中断驱动控制方式、直接存储器访问(DMA)控制方式和通道控制方式。
I/O控制方式发展的目标是尽量减少CPU对 I/O 控制的干预,把CPU从繁杂的 I/O 控制事务中解脱出来,以便更多地进行数据处理,提高计算机效率和资源的利用率。
它们之间的主要差别在于 CPU 与外围设备并行工作的方式和程度不同。
使用场景:
直接程序控制:只适合于 CPU 执行速度较慢,且外围设备较少的系统。
直接存储器访问控制(DMA):适合高速设备与主存之间的成批数据传送,小型、微型机中的快速设备均采用这种方式
通道控制方式:大型计算机需要连接大量的高速和低速设备
1、直接程序控制方式
直接程序控制方式由用户进程直接控制主存或 CPU 和外围设备之间的信息传送。
直接程序控制方式又称为询问方式,或忙/等待方式。
通过 I/O 指令或询问指令测试 I/O 设备的忙/闲标志位,决定主存与外围设备之间是否交换一个字符或一个字。
流程图概述直接程序控制方式的工作流程如下:
① 当用户进程需要输入数据时,通过 CPU 向控制器发出一条 I/O 指令,启动设备输入数据,同时把状态寄存器中的忙/闲状态 busy 置为1
② 用户进程进入测试等待状态,在等待过程中,CPU 不断地用一条测试指令检查外围设备状态寄存器中的 busy 位,而外围设备只有在数据传入控制器的数据寄存器之后,才将该 busy 位置为0,。
③ 处理器将数据寄存器中的数据取出,送入主存指定单元,完成一个字符的I/O操作,接着进行下一个数据的 I/O 操作
直接程序控制方式虽然简单,不需要多少硬件的支持,但由于高速的 CPU 和低速的 I/O 设备之间的速度上不匹配,因此,CPU 与外围设备只能串行工作,使 CPU 的绝大部分时间都处于等待是否完成 I/O 操作的循环测试中,造成 CPU 的极大浪费,外围设备也不能得到合理的使用,整个系统的效率很低。
因此,这种I/O控制方式只适合于 CPU 执行速度较慢,且外围设备较少的系统。
2、中断驱动控制方式
为了减少程序直接控制方式下 CPU 的等待时间以及提高系统的并行程度,系统引入了中断机制。
中断机制引入后,外围设备仅当操作正常结束或异常结束时才向 CPU 发出中断请求。
当CPU请求IO时,就直接发送IO读取的相关命令。如果当前设备正被占用,就排队,然后IO设备器会对依次对队列中的进行处理,处理完成后就发出中断命令,打断CPU原本的操作,转而去执行中断程序,比如将数据从数据寄存器转到CPU,然后从CPU转到内存中。
在 I/O 设备输入每个数据的过程中,由于无需 CPU 的干预,一定程度上实现了 CPU 与 I/O设备的并行工作。
仅当输入或输出完一个数据时,才需 CPU 花费极短的时间做中断处理。
存在的问题:由于I/O操作直接由 CPU 控制,每传送一个字符或一个字,都要发生一次中断,仍然占用了大量的 CPU 处理时间,因此可以通过为外围设备增加缓冲寄存器存放数据来减少中断次数。
上述两种方法的特点都是以 CPU 为中心,数据传送通过一段程序来实现,软件的传送手段限制了数据传送的速度。
接下来介绍的这两种I/O 控制方式采用硬件的方法来显示 I/O 的控制
3.直接存储器访问控制方式
直接存储器访问控制方式又称 DMA(Direct Memory Access)方式。为了进一步减少 CPU 对 I/O 操作的干预,防止因并行操作设备过多使 CPU 来不及处理或因速度不匹配而造成的数据丢失现象,引入了 DMA 控制方式。
DMA可以直接与内存相连,也就是说IO设备可以直接与内存交换数据,不要CPU的中转了。
在 DMA 控制器的控制下,采用窃取或挪用总线控制权,在设备和主存之间开辟直接数据交换通道,成批地交换数据,而不必让 CPU 干预。
DMA方式的特点:
① 数据传送以数据块为基本单位
② (内存与IO设备直接传递,不需要CPU中转)所传送的数据从设备直接送入主存,或者从主存直接输出到设备上
③ 仅在传送一个或多个数据块的开始和结束时才需 CPU 的干预,而整块数据的传送则是在控制器的控制下完成。
- DMA方式和中断驱动控制方式相比,减少了 CPU 对 I/O 操作的干预,进一步提高了 CPU 与 I/O 设备的并行操作程度。
- DMA方式的线路简单、价格低廉,适合高速设备与主存之间的成批数据传送,小型、微型机中的快速设备均采用这种方式,但其功能较差,不能满足复杂的 I/O 要求。
4、通道控制方式
通道,独立于 CPU 的专门负责输入输出控制的处理机,它控制设备与内存直接进行数据交换。
(是一种硬件,可以执行IO命令,有自己的指令和程序,通道可以执行IO指令,CPU只需要将相关的IO指令发送给通道控制器就可以了,通道会执行IO指令,完成对应的传输)
直接程序控制方式和中断程序控制方式适合于低速设备的数据传送,而 DMA 方式虽然适合于高速设备的数据传送,但一个 DMA 控制器只能控制少量的同类设备,这远远不能满足大型计算机系统的需要。
通常,一个大型计算机需要连接大量的高速和低速设备,通道控制方式可以满足这个要求。(DMA和通道控制方式的主要区别——能否满足大型计算机系统的既能处理高速设备又能处理低速设备的需要)
通道控制方式,实现了CPU、通道和I/O设备三者的并行操作,从而更加有效地提高整个系统的资源利用率。
例如,当 CPU 要完成一组相关的读(或写)操作时,只需要向 I/O 通道发出一条 I/O 指令,指出其所要执行的通道程序的首址和要访问的I/O设备,通道接收到该指令后,通过执行通道程序便可完成 CPU 指定的 I/O 任务。可见,通道只是在 I/O 操作的起始和结束时向 CPU 发出 I/O 中断申请,相对于之前的控制方式进一步减少了 CPU 的干预程度。
※I/O软件层次
每一层的功能为
1 用户空间I/O软件:用户空间中进行I/O调用,格式化I/O,它们以库函数形式出现。用户空间中另一个重要的I/O软件是SPOOLing系统;
2 与设备无关的I/O软件:提供所有设备的常用I/O功能,为用户层软件提供一个一致的接口,为设备驱动程序提供统一接口,I/O设备命名,设备保护,分配和释放独占设备,提供与设备无关的块大小,设备缓冲。
3 设备驱动程序:实现请求I/O的进程与设备控制器之间的通信,接收由I/O进程发来的命令和参数,并将命令中的抽象要求转换为具体要求,检查用户I/O请求的合法性,了解I/O设备的状态,及时响应由控制器或通道发来的中断请求,启动I/O设备
4 中断处理程序:唤醒被阻塞的驱动程序进程,保护被中断进程的CPU环境,转入相应的设备处理程序,中断处理,恢复被中断进程的现场。
四个层次:
①中断处理程序;
②设备驱动程序:
设备驱动程序是控制设备动作(如设备的打开、关闭、读、写等)的核心模块,用来控制设备上数据的传输。
一般来说,设备驱动程序应有以下4个功能:
①接受来自上层、与设备无关软件的抽象读/写请求,并且将该IO请求排在请求队列的队尾,同时还要检查I/O请求的合法性(如参数是否合法)。
②取出请求队列中队首请求,且将相应设备分配给它。
③向该设备控制器发送命令,启动该设备工作,完成指定的IO操作。
④处理来自设备的中断。
驱动程序有如下一些共同特点:
(1)驱动程序的主要作用是实现请求IO的进程与设备控制器之间的通信,将上层的IO请求经加工后送给硬件控制器,启动设备工作;把设备控制器中有关寄存器的信息传给请求IO的进程,如设备状态、I/O操作完成情况等。
(2)驱动程序与设备特性密切相关。通常,每个设备驱动程序只处理一种设备类型,至多是一类紧密相关的设备。
(3)驱动程序可以动态安装或加载。
在某些系统中,操作系统是单独的二进制程序,其中包括全部驱动程序。这种模式适于运行在计算中心,且设备几乎不发生变动的环境下。随着个人计算机时代的到来,IO设备千变万化,这种模式已不再满足应用的需要,即使用户手头有内核源码或目标模块,也很少对核心重新编译或连接。现在,在系统运行时可以动态加载驱动程序。当然,不同的系统处理加载驱动程序的方法是不同的。
(4)驱动程序与IO控制方式相关。常用的控制方式是程序轮询方式,中断方式和 DMA 方式。这些方式的驱动程序存在明显差别。对于不支持中断的设备,读/写时需要轮询设备状态,以决定是否继续传送数据。
例如:
- 打印机驱动程序在默认时轮询打印机的状态。
- 如果设备支持中断,则按照中断方式进行。
- 对于磁盘一类的块设备往往采用 DMA 控制方式,数据成块传送,一块数据传完后才发一次中断。
(5)驱动程序与硬件密切相关。为了有效地控制设备的打开、读/写等操作,驱动程序往往有一部分用汇编语言编写,甚至有不少驱动程序固化在ROM中。
(6)不允许驱动程序使用系统调用。
允许驱动程序与内核的其余部分交互作用,例如,可以调用某些核心过程分配和释放内存的物理页面,这些页面可用做缓冲区。还有些过程调用很有用,用来管理MMU(存储器管理部件)、计时器、DMA控制器、中断控制器等。
③与设备无关的操作系统I/O软件;
尽管有些1/O软件是设备专用的,但大部分仍是与设备无关的。设备驱动程序与设备无关软件之间的确切界限依赖于具体系统,因为一些本来可用设备无关方式实现的功能,由于效率或其他原因,实际上是在驱动程序中实现的。
图7-8给出了与设备无关软件所实现的典型功能。它的基本功能是执行所有驱动器共同的1/O功能和为用户级软件提供统一接口。
④用户级I/O软件。
多数IO 软件都在操作系统中,用户空间中也有一小部分。
通常,它们以库函数形式出现,例如用户编写的C程序中可以使用标准I/O库函数,如 printf, scanf等。经编译连接后,就把用户程序和相应的库函数连接在一起,然后装入内存运行。而库函数代码中要使用系统调用(其中包括IO系统调用),经过系统调用进入操作系统,为用户进程提供相应的服务。
用户空间中另一个重要的I/O软件是SPOOLing系统。如前所述,利用SPOOLing系统可在多道程序系统中实现虚拟设备技术。它不仅用于读卡机、打印机,还可用于其他场合。例如,在网络上传送文件往往要用网络精灵进程。若要发送一个文件到某个地方,用户把它放入网络的SPOOLing目录(专用的目录)中,随后网络精灵进程取出它并进行传送。USENET 是一种电子邮件系统,利用这种方式可实现文件传送。
综合起来看,当用户程序要从一个文件中读出一块时,需要请求操作系统提供服务。与设备无关软件先在高速缓存中查找所需的块,如果没有找到,就调用设备驱动程序,对硬件发出IO请求,让该进程封锁(等待),直至磁盘完成操作,产生中断信号;然后中断处理程序处理相应中断,取出设备状态,唤醒因等待IO完成而睡眠的进程,然后调度用户进程继续运行。
※通道技术与缓冲技术
通道技术
通道是独立于中央处理器的,专门负责数据I/O传输工作的单元。从现代计算机系统的结构上看,各种外部设备均有相应的设备控制器,这些设备控制器再通过通道连接在计算机系统的公共系统总线上。
通道对外部设备实行统一管理,它代替CPU对I/O操作进行控制,从而使CPU和外部设备可以并行工作。所以通道又称为I/O处理机。
采用通道这种I/O结构的最大优点是,可以实现中央处理器和各种外部设备并行工作。
采用通道之后,处理器和外部设备都能够访问主存储器。不过,当处理器和外部设备同时申请访问主存储器时,就要竞争存储周期。由主存储器的控制经路处理这些竞争,并保证这些访问同步有序地进行。
有了通道,利用中央处理器和外部设备之间以及各外部设备之间的并行工作能力,操作系统就可以让多个程序同时执行,并在同一时刻让各个程序分别使用计算机系统的不同资源。
通道技术一般用于大型机系统和那些对I/O处理能力要求比较严格的系统中。一般低档次的微机中没有通道。
缓冲技术
缓冲技术是用在外部设备与其他硬件部件之间的一种数据暂存技术,它利用存储器件在外部设备中设置了数据的一个存储区域,称为缓冲区。缓冲技术一般有两种用途,一种是用在外部设备与外部设备之间的通信上的,还有一种是用在外部设备和处理器之间的。
总之,引入缓冲技术的主要目的是:
①缓解CPU 与IO设备间速度不匹配的矛盾。
②提高它们之间的并行性。
③减少对CPU的中断次数,放宽CPU对中断响应时间的要求。
缓冲的基本思想很简单:读入一个记录之后,CPU正在启动对它的操作,输入设备被指示立即开始下面的输入,CPU和输入设备就同时忙起来了。这样,输入设备将数据或指令送入缓冲区,由缓冲区再很快地送到内存。CPU不断地从内存中取出信息进行加工处理,而输入设备也不断地把信息送进来。如果配合得当, CPU处理完一个记录,输入设备又送入下一个记录,二者就可充分地并行起来了。
那么为什么不直接把数据送入用户工作区,而要设置缓冲区来暂存呢?如果把用户工作区直接作为缓冲区则有许多不便。首先,当一个用户从工作区向设备输出或从设备向工作区输入时,工作区被长期占用而使其他用户无法使用。其次,为了减少输入输出次数,以减轻对通道和输入输出设备的压力。第三,缓冲区信息可供多个用户共同使用以及反复使用,减少了不必要的信息传递工作,提高了效率,方便了对缓冲区的管理。
在现代操作系统中,几乎所有的I/O设备在与处理机交换数据时都用了缓冲区。
缓冲区是一个存储区域,它 可以由专门的硬件寄存器组成 ,但由于硬件的成本较高,容量也较小,一般仅用在对速度要求非常高的场合 ,如存储器管理中所用的联想存储器;设备控制器中用的数据缓冲区等。
在 一般情况下 ,更多的是利用 内存作为缓冲区 ,如单缓冲区、双缓冲区、环形缓冲区和缓冲池。
※磁盘管理、磁盘调度技术
SPOOLing技术
SPOOLing技术可以实现设备的(C、虚拟)分配。
SPOOLing系统:又称为假脱机系统;在联机的情况下实现的同时外围操作的技术称为SPOOLing技术,或成为假脱机技术。
属于软件机制
SPOOLing系统由专门负责I/O的常驻内存的进程以及输入井、输出井组成;它将独占设备改造为共享设备,实现了 虚拟设备 功能。
此外,SPOOLing系统提供了非常重要的数据结构——作业池。
通常,SPOOLing系统把一些作业读到磁盘上,并等待它们运行。磁盘上的作亚池使操作系统酌情选择下面要运行的作业,以便提高CPU的利用率,SPOOLing系统是很多现代大型机系统的重要组成部分。
SPOOLing 系统突显上述优点是付出不少代价的,主要表现在:
①占用大量的内存作为外设之间传送信息用的缓冲区,它所用的表格也占用不少内存空间;
②占用大量磁盘空间作为输入开和输出井;
③增加了系统的复杂性。
假脱机( Spooling )打印与脱机打印有相似之处,但实际上其输出结果首先送往[__外部存储器__]保存,然后再在适当的时候将其调出打印出来。整个过程是由[_操作系统__]控制的。
接口管理(2)
用户和操作系统之间有哪几种类型的接口?各自的功能:
操作系统为用户提供两个接口:
系统调用
- 是操作系统提供的、与用户程序之间的接口;
- 一般位于操作系统核心的最高层;
- 当CPU执行用户程序中的系统调用的时候,处理机的运行状态就从用户态变成核心态,进而进入系统内部,执行它的有关代码,实现操作系统的对外服务
- 过程调用只能在用户态下运行,而系统调用可以实现从用户态到核心态的转变。
- 可分为五个类别:进程控制、文件管理、设备管理、信息维护、通信
库函数
本身并不属于操作系统的内核部分,运行在用户态下
库函数要获得操作系统的服务也要通过系统调用这个接口
目的是隐藏”访管“指令的具体细节,是操作系统的调用更为方便和抽象。
库函数是用户进程,是系统调用的上层。
很多操作系统都提供解决共性问题或执行公共操作的程序,通常称作系统使用程序或应用程序
命令接口
用户利用这些操作命令来组织和控制作业的执行或管理计算机系统。
※特权指令 & 非特权指令
所谓特权指令是指有特权权限的指令,由于这类指令的权限最大,如果使用不当,将导致整个系统崩溃。比如:清内存、置时钟、分配系统资源、修改虚存的段表和页表,修改用户的访问权限等。
为了保证系统安全,这类指令只能用于操作系统或其他系统软件,不直接提供给用户使用。
因此,特权执行必须在核心态执行。实际上,cpu在核心态下可以执行指令系统的全集。
为了防止用户程序中使用特权指令,用户态下只能使用非特权指令,核心态下可以使用全部指令。
当在用户态下使用特权指令时,将产生中断以阻止用户使用特权指令。所以把用户程序放在用户态下运行,而操作系统中必须使用 特权指令的那部分程序在核心态下运行,保证了计算机系统的安全可靠。从用户态转换为核心态的唯一途径是中断或异常。
硬盘接口
硬盘接口是硬盘与主机系统间的连接部件,作用是在硬盘缓存和主机内存之间传输数据;
分为:
1.IDE 电子集成驱动器,将硬盘控制器与盘体集成在一起的硬盘驱动器,普通PC的标准接口,现已被淘汰;
2、SCSI 小型计算机系统接口,广泛应用于 小型机 上的高速数据传输技术。SCSI接口具有应用范围广、多任务、 带宽 大、CPU占用率低,以及热插拔 等优点,但较高的价格使得它很难如IDE硬盘般普及,因此SCSI硬盘主要应用于中、高端 服务器和高档工作站中。
3、SATA 串口硬盘,是未来PC机硬盘的趋势, 串行接口 还具有结构简单、支持热插拔的优点;
这篇关于2022操作系统期末考点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!