操作系统笔记

操作系统

第一章

1.1操作系统定义

操作系统:指控制和管理整个计算机系统的硬件和软件资源(是软件,管理软件硬件),并合理地组织调度计算机的工作和资源的分配;以提供给用户和其他软件方便的接口和环境;它是计算机系统中最基本的系统软件。

image-20240504203018918

操作系统向上层提供的服务:

​ 1.GUI:图形化用户接口

​ 2.联机命令接口(交互式命令接口):特点:输入一个命令执行一个命令

​ 3.脱机命令接口(批处理命令接口):特点:一次执行一堆命令

​ 4.程序接口:可以在程序中进行系统调用来使用程序接口,普通用户不可直接使用

image-20240504204105289

操作系统实现对硬件的拓展

​ 将CPU、内存、磁盘、显示器、键盘等硬件合理地组织起来,让各种硬件能够相互协调配合,实现更多更复杂的功能

小结

image-20240504204456072

1.2操作系统特征

​ 操作系统包含并发、共享、虚拟、异步四个基本特征,其中并发和共享是最基本的特征,并且二者互为存在条件。

image-20240504204753569
并发

​ 并发:指两个或者多个事件在同一时间间隔内发生。(宏观上是同时发生、微观上是交替发生)

​ 操作系统的并发性:指操作系统中 ‘’同时‘’ 运行着多个程序,在宏观上看是同时运行的,在微观上看是交替运行的。

​ 区别 并行:两个或多个事件在同一时刻发生。单核Cpu同一时刻只能执行一个程序,程序只能并发执行;多核Cpu可以同时执行多个程序,程序间可以并行执行。

共享

​ 共享即资源共享,指系统中资源可以供内存中多个并发执行的进程共同使用。

共享的两种方式

​ 1.互斥共享:系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源。
​ 2.同时共享:系统中的某些资源,允许一个时间段内由多个进程“同时”对它们进行访问。

虚拟

​ 虚拟是指把一个物理上的实体变为若干个逻辑上的对应物。物理实体 是实际存在的,而逻辑上 对应物 是用户感受到的。

​ 虚拟技术:1.空分复用技术 2.时分复用技术

异步

​ 异步是指,在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性。

小结
image-20240504210645712

1.2操作系统的发展和分类

image-20240505203616451
手工操作阶段

​ 用户独占全机,人机速度矛盾导致资源利用率极低

批处理阶段

​ 1.单道批处理系统:引入了脱机 输入/输出 技术 , 由监督程序负责输入输出。
​ 优点:缓解了一定程度的人机速度矛盾,资源利用率得到提升。
​ 缺点:内存中同一时间只能有一道程序运行,CPU有大量时间等待I/O完成。 源利用率仍然很低

​ 2.多道批处理系统:操作系统正式诞生,可以一次向内存中读入多到程序。
​ 优点:多道程序并发执行、共享计算机资源,资源利用率大幅度提升
​ 缺点:没有人机交互功能

分时操作系统

​ 计算机以时间片为单位,轮流为各个进程提供服务,用户可以与计算机进行交互。

​ 优点:用户的请求可以及时被响应解决了人机交互问题,允许多个用户公用一台计 算机,各个用户对计算机的操作系统相互独立。
​ 缺点:操作系统对每个进程是绝对公平的,不能优先处理一些紧急任务

实时操作系统

​ 优点:可以优先响应一些紧急任务

​ 在实时操作系统的控制下,计算机系统接收到外部信号后及时进行处理,并且要在严格的时限内处理完事件。实时操作系统的主要特点及时性可靠性

image-20240505210107069
其他操作系统
image-20240505210148317
小结

image-20240505210221863

1.3.1操作系统的运行机制

​ 指令:CPU能够识别、执行的最基本的命令(二进制机器指令)

​ 负责实现操作系统的程序称为内核程序,许多的内核程序称为操作系统内核,简称内核,内核是最接近硬件的部分。其他的程序称为应用程序(QQ)

特权指令和非特权指令

​ 特权指令:不允许用户直接使用的指令,如:内存清零指令、关中断指令等。特权指令 只允许内核程序使用

​ 非特权指令:允许用户直接使用的指令,如加法指令、减法指令等。

​ CPU在设计和生产的时候就划分了特权指令和非特权指令。

内核态 和用户态

​ 当CPU处于内核态时,此时运行的程序是内核程序,可以执行特权指令。
​ 当CPU处于用户态时,此时运行的程序是应用程序,只能执行非特权指令。

​ 在CPU中有一个寄存器叫程序状态字寄存器(PSW),其中一个二进制位 来区分状态。

​ 从内核态转化到用户态是通过执行一条特权指令——修改PSW 来实现的。操作系统主动让出CPU使用权。

​ 从用户态转化位为内核态是由中断引发的,硬件自动完成变态过程。操作系统强行夺走CPU使用权。

小结
image-20240505212507989

1.3.2中断和异常

​ 中断是操作系统内核 夺回CPU使用权的唯一途径。

中断的类型

​ 内中断:与当前执行的指令有关,中断信号来指CPU内部(如应用程序执行特权指令、除数为零、应用系统执行陷入指令

​ 外中断:与当前执行的指令无关,中断信号来自CPU外部(如时钟中断)

image-20240506200858450

​ 不同的中断信号,需要用不同的中断处理程序来处理。当CPU检测到中断信号后,会根据中断信号的类型去查询“中断向量表”,以此来找到相应的中断处理程序在内存中的存放位置。

小结
image-20240506201025185

1.3.3系统调用

​ 系统调用是应用程序请求操作系统内核服务的途径。

​ 操作系统内核对共享资源进行同一管理,并向上提供系统调用,进程要使用共享资源只能通过系统调用向内核发出请求。凡是与共享资源有关的操作都需要进行系统调用(比如存储分配,I/O操作、文件管理)

系统调用的过程

​ 1.传递系统调用参数
​ 2.执行陷入指令(用户态)
​ 3.执行相应的内核程序处理系统调用(核心态)
​ 4.返回应用程序

小结
image-20240506202423193

1.4操作系统的体系结构

​ 大内核 (宏内核)结构: 既保留了与硬件紧密接触的部分又保留一些对系统资源管理的功能

​ 微内核结构:内核只保留与硬件紧密接触的部分

image-20240506203139001image-20240506203445265

区别
image-20240506203747603

分层结构:分为分多次,每层可以单向调用更低一层的结构

​ 优点:便于调试和验证、便于扩充和维护、各层调用接口清晰固定
​ 缺点:只能调用相邻低层,难以合理定义各层边界、不可跨层调用,效率低

模块化结构:将内核划分为多个模块,内核=主模块+可加载模块;主模块:只负责 核心功能如进程调度、内存管理;可加载模块:可以动态加载新模块到 内核无需重新编译整个内核。

​ 优点:模块间逻辑清晰易于维护,确定模块间接口后可多模块同时开发。 支持动态加载新的内核模块,增强OS适应性任何模块之间可以直 接调用其他模块,效率高。

​ 缺点:模块之间相互依赖难以调试验证。模块之间接口的定义未必合理实用

大内核结构:所有系统功能都放在内核里

​ 优点:性能高,内核内部各种功能可以直接调用。

​ 缺点:内核庞大功能复杂,难以维护。大内核中某个模块出错可能导致整个 系统崩溃

微内核结构:只把中断、原语、进程通信等核心功能放入内核。把进程管理、文件管 理、设备管理等功能以用户进程形式运行在用户态。

​ 优点:内核小功能少易于维护,内核可靠性高内核某个功能模块出错不会 导致整个系统崩溃

​ 缺点:性能低,需要频繁切换用户态/内核态用户态下的各个功能模块不 能直接相互调用,需要通过内核的“消息传递”来间接通信

外核:内核负责进程调度,进程通信等功能,外核负责为用户进程分配未经抽象的硬件 资源,且由外核保证资源使用安全

​ 优点:分配“不抽象”的硬件资源使得进程可以更加灵活的使用硬件资源。减 少了虚拟硬件资源的“映射层”,提升了效率

​ 缺点:降低了系统的一致性,使系统更加复杂

1.5操作系统的引导

引导过程

​ 1.CPU从一个特定的主存地址开始,取指令,执行ROM中的引导程序(进行硬件自检、开机)

​ 2.将磁盘的第一块(主引导记录)读入内存,执行磁盘引导程序,扫描分区表

​ 3.从活动分区(又叫主分区,即安装了操作系统的分区)读入分区引导记录并执行程序

​ 4.从根目录下找到操作系统初始化程序(启动管理器)并执行,完成开机的一系列动作

image-20240507200020261

1.6虚拟机

​ 虚拟机:使用虚拟化技术,将一台物理机器虚拟化为多态虚拟机器,每台虚拟机器都可以独立运行一个操作系统。需要用到虚拟机管理程序。

两类虚拟机管理程序VMM

​ 第一类VMM:直接运行在硬件上,把硬件资源分配给不同的操作系统。

​ 只有虚拟机管理程序运行在内核态,可以使用特权指令,操作系统运行在用户态,当操作系统需要使用特权指令时需要被VMM截获,转化 ,然后再返回给操作系统。

image-20240507202904954

第二类VMM:运行在一个宿主操作系统上

​ 这类VMM想要给客户操作系统分配资源时,只能向宿主操作系统请求资源分配,然后由VMM进行再分配。

image-20240507203640715

区别:

image-20240507204755787

第二章进程与线程

2.1.1进程的概念

​ 程序:静态的,是存放在磁盘里的可执行文件即一系列指令的集合

​ 进程:动态的,是程序的一次执行过程

进程进程实体的运行过程,是系统进行资源分配和调度的一个独立单位

2.1.2进程的组成

​ 进程由PCB、程序段和数据段组成。

PCB

​ 操作系统管理进程时,会把进程的相关信息存储到PCB中。

PCB时进程存储在的唯一标志,当进程被创建时,操作系统为其创建PCB,当进程结束时,会对PCB进行回收

image-20240508203825754
程序段和数据段

程序段、数据段是进程给进程自己使用的,与进程自身的运行逻辑有关。

image-20240508204035928

2.1.3进程的特征

image-20240508204809901
小结
image-20240508205041828

2.1.4进程的状态与转换

进程的状态

创建态:进程被创建时状态为创建态,在这个阶段操作系统会为进程分配资源。

就绪态:进程被创建完成后进入就绪态,此时进程已经具备运行条件,但是没有CPU资 源,暂时不能运行。

运行态:一个进程在CPU上运行时处于运行态,CPU会执行该进程对应的程序。

阻塞态:在进程运行过程中,可能会 请求等待某个事件发生(如资源分配、其他进程响 应)。在这个事件之前进程无法继续进行,系统会停止该进程的CPU使用,进程 进入阻塞态。

终止态:进程在运行完成时可以发出 exit指令 请求系统终止该进程,此时进程会进入终 止态,操作系统会让该进程下CPU,并且回收内存空间等资源,最后还要回收 该进程的PCB。

就绪态、运行态、阻塞态是进程的三种基本状态。

进程状态的转化

image-20240508212108334

image-20240508212222879image-20240508212123670image-20240508212130619

image-20240508212423458
进程的组织

​ 为了把处于同一个状态下的各个进程统一管理,操作系统会将各个进程的PCB组织起来。

链接方式

​ 将不同的指针指向状态相同的不同进程

image-20240508212735240
索引方式

​ 操作系统会给不同状态的进程建立索引表,每个索引表的表项会指向相应的PCB

image-20240508212916459 image-20240508212929645
小结
image-20240508213013611

2.1.5进程通信

​ 进程通信指的是进程之间产生数据交互。一个进程不可以直接访问其他进程的内存地址空间,所有进程通信需要有操作系统的支持。

共享存储

​ 进程可以申请一片共享空间,其他进程也可以访问此区域,进程之间可以在此区域实现资源共享。为了避免出错,各个进程对共享空间的访问是互斥的(一个访问的时候其他不能访问)

​ 基于存储区共享:操作系统在内存中划分一块共享存储区,数据的形式、存储位置都由通信进程控制而不是操作系统,这种共享方式通信速度很快,属于高级通信方式。

​ 基于数据结构共享:共享空间是一个数据结构比如一个数组,这种共享方式速度慢,限制多,属于低级通信方式。

image-20240509204807217
消息传递

​ 进程之间的数据交换会以格式化的消息为单位,进程通过操作系统提供的”发送消息“/”接收消息“两个原语进行数据交换。

​ 格式化信息:image-20240509204928363

直接通信方式:发送者需要指明接收进程的ID。

间接通信方式:通过”信箱“进行间接通信。

管道通信

​ 管道:是一种特殊的共享文件 (pipe文件)实际是在内存区中开辟大小固定的缓冲区。管道只能采取半双工通信,某段时间内只能实现单向传输,如果要实现双向通信,需要同时设置两个管道。各个进程只能互斥的访问管道(由操作系统实现)。

​ 当管道写满时,”写进程“ 将阻塞直到 ”读进程“将管道中的数据取走,可以唤醒”写进程“

​ 当管道读空时,”读进程“ 将阻塞直到 ”写进程“向管道中写入数据,可以唤醒”读进程“

管道中的数据一旦被读出就会彻底消失,当多个进程读同一个管道时可能会发生错乱。一个管道允许多个”写进程“,一个读进程; 也允许多个写进程,多个读进程但是系统会让读进程轮流从管道中读取数据

​ 与共享空间通信方式不同的是,管道通信遵循先进先出式存取文件,而共享空间可以在任意位置存取文件。

image-20240509205923861
小结
image-20240509211509819

2.1.6线程的概念和特点

​ 没有引入线程的时候,程序执行流的最小单位是进程。引入线程之后程序执行流的最小单位是线程。

​ 线程是基本的CPU执行单元,也是程序执行流的最小单位。引入线程之后,进程可以并发,而且进程内的各个线程也可以并发,提高了系统的并发性。引入线程之后,进程只作为除CPU之外的系统资源分配单元(把内存资源、打印机资源分配至进程,而不分配给线程)。

引入线程机制后的变化

image-20240625130519309

线程的属性

image-20240625130956910

线程的实现方式

用户级线程:只支持进程,不支 持线程。线程是由线程库来实现的

image-20240625131440442

​ 线程的管理是由应用程序通过线程库来完成的。线程切换不需要CPU的变态。操作系统只能感受到进程的存在,而不能意识到进程的存在。

​ 优点:用户级线程的切换在用户空间既可以完成,不需要切换到核心态,线程管理系统开销小,效率高。

​ 缺点:一个线程被阻塞,整个进程会被阻塞,并发度不高,多个线程不可以在多核处理器上并行运行。

内核级线程:操作系统支持的线程。

image-20240625132709644

​ 线程的管理工作由操作系统完成。线程切换会引起CPU的变态,操作系统可以意识到内核级线程的存在。

​ 优点:当一个线程被阻塞之后,其他线程可以继续执行,并发能力强,多线程可以在多核处理机上并发执行。

​ 缺点:一个进程可能会对应多个内核级线程,线程切换由操作系统内核完成,需要变态,因此线程管理的成本高,开销大。

多线程模型

一对一模型:一个用户级线程映射到一个内核级线程,每个用户进程有着与用户级线程同样数量的内核级线程

image-20240625133744294

​ 优点;当一个线程被阻塞之后其他线程还可以继续执行。并发能力强,多线程可以在多核处理及上并行执行。

​ 缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。

多对一模型:多个用户级线程映射到一个内核级线程。且一个进程只被分配一个内核级线程。

image-20240625134108038

​ 优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高

​ 缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行

​ 操作系统只“看得见”内核级线程,因此只有内核级线程才是处理机分配的单位

多对多模型:n用户及线程映射到m个内核级线程(n >= m)。每个用户进程对应m个内核级线程。

image-20240625134511157

​ 优点:克服了多对一模型并发度不高的缺点(一个阻塞全体阻塞),又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。

小结
image-20240625134723785

2.1.7线程的状态与转换

​ 类似于进程的状态转换,主要关注就绪态、运行态、阻塞态

image-20240626141630023

类似于进程的PCB,每个线程都有保存线程信息的TCB

image-20240626142105660

2.2.1处理机调度

​ 调度:当有一堆任务需要处理,但是由于资源有限、无法对任务同时处理、所以需要确定某种规则来决定处理任务的顺序

调度层次
高级调度(作业调度):

​ 按照一定原则从外存的作业预备队列中选择一个作业进入内存,并创建进程,每个作业只调入一次,调出一次,作业调入时会建立PCB、调出时会撤销PCB。

低级调度(进程调度/处理机调度):

​ 按照某种策略,从就绪队列中选择一个进程,将处理及分配给这个进程。

中级调度(内存调度):

​ 内存不足时, 可以将某些进程数据调出内存, 等到内存空闲或者进程需要运行时再重新调入内存。暂时调到外存中的进程状态为挂起状态, 被挂起的进程PCB会被组成挂起队列。

​ 按照某种策略决定哪个处于挂起状态的进程重新调入内存就是中级调度。一个进程可能会被多次调入、调出内存,因此中级调度发生的频率要比高级调度频率更高。

三层调度的联系和对比
image-20240626144955393

五状态模型:(408要求)

image-20240626143658174

七状态模型:(一些自命题要求)

image-20240626143913222

小结
image-20240626145205648
2.2.2调度算法评价指标

​ 调度算法评价指标包括:CPU利用率、系统吞吐量、周转时间、等待时间、响应时间等.

CPU利用率:指CPU处于忙碌时间占总时间的比例。
利用率= 忙碌时间 / 总时间

​ 例:image-20240626145727817

系统吞吐量:单位时间内完成的作业的数量。
系统吞吐量 = 总共完成的作业数量 / 总共花费时间。

​ 例:image-20240626145951965

系统周转时间:指作业被提交给系统开始,到作业完成的时间间隔。
​ 周转时间 = 完成时间 - 提交时间
​ 平均周转时间 = 各个作业周转时间和 / 作业数量
​ 带权周转时间 = 作业的周转时间 / 实际运行的时间 (带权周转时间大 于等于1且数值越小越好)

​ 平均带权周转时间 = 各个作业 带权周转时间和 / 作业数量

等待时间:指作业/进程处于等待状态的时间之和,但是进程再等待I/O完成的时间其实也在被服务,所以不算入等待时间。对于作业来说不仅要考虑建立进程后的等待时间,还要加上在外村后备队列中的等待时间。

响应时间:指用户从提交请求首次产生响应的时间。

小结

image-20240626151659852

2.2.3进程调度的时机、切换

​ 进程调度即低级调度,是按照某种算法从就绪队列中选择一个进程为其分配处理机。

需要进行进程调度的情况:

​ 1.当前运行的进程主动放弃了处理机(正常中止、发生异常、请求阻塞)
​ 2.当前运行的进程被动放弃了处理机(时间片用完、有优先级更高的进程)

不可进行进程调度的情况:

​ 1.在处理中断的过程中:中断处理过程复杂、与硬件密切相关、很难做到中断处理过 程中进行进程切换。

​ 2.进程在操作系统内核程序临界区中。

​ 3.在原子操作过程中(原语)。原子操作不可中断。

​ 临界资源:一个时间段内只允许一个进程使用的资源,各个进程互斥的访问临界资源。

​ 临界区:访问临界资源的代码

​ 内核程序临界区:用来访问某种内核数据结构的,比如进程的就绪队列

进程调度的方式
非剥夺调度方式(非抢占式):

​ 只允许进程主动放弃处理机,在运行过程中即使有更紧迫的任务到达,当前进程仍然会使用处理机,直到进程终止或者主动阻塞。

​ 系统开销小,无法处理紧急任务,适用于早期的批处理系统。

剥夺调度方式(抢占式):

​ 当一个进程正在处理机上执行时,如果有一个更紧迫的进程需要使用处理机,那么会立即暂停正在执行的进程,将处理机分配给更紧迫的进程。

​ 可以优先处理紧急进程,也可以让各个进程按照时间片流转执行功能,适用于分时操作系统、实时操作系统。

image-20240626155736486
小结:
image-20240626155914758

2.2.3 调度器/调度程序

​ 调度器/调度程序用来转换就绪态和运行态 (②和③),调度程序决定调度算法和时间片大小。

image-20240628144237499

什么情况下会触发调度程序:

​ 1.创建新进程(进程创建后调度程序会检查是否让新进程抢占处理机)
​ 2.进程退出(退出后处理机空闲,调度程序决定哪个进程转为运行态)
​ 3.运行程序进行阻塞(阻塞后调度程序决定哪个进程上处理机)
​ 4.I/O中断发生(会让某些阻塞态进程回到就绪态,调度程序判断是否要抢占处理机)

​ 当采用非抢占式的调度策略时,只要进程阻塞或者退出才会触发调度程序工作。
​ 当采用抢占式的调度策略时,每个时钟中断或K个时钟中断会触发调度程序。

​ 在不支持线程的操作系统中,调度程序处理的对象是进程。
​ 在指出线程的操作系统中,调度程序处理的对象是线程。

闲逛进程

​ 调度程序在没有其他进程就绪时,会运行闲逛进程。

闲逛进程的特点:

​ 1.优先级最低
​ 2.可以是 0 地址指令,占一个完整的指令周期(指令周期末尾例行检查中断)
​ 3.能耗低

2.2.4调度算法

先来先服务算法(FCFS)

​ 按照作业/进程到达的先后顺序进行服务。用于作业调度时考虑哪个作业先到达后备队列。当用于进程调度时考虑哪个进程先到达就绪队列

​ 先来先服务算法是非抢占式算法。不会导致作业饥饿(某进程/作业长时间得不到服务)

​ 优点:公平、算法实现简单
​ 缺点:排在时间长的作业后的时间短的作业带权周转时间大,需要等待很长时间,对短 时间作业来说用户体验差。(FCFS对长作业有利、对短作业不利

image-20240628151848881

短作业优先算法(SJF)

​ 算法追求最短的平均等待时间、最少的平均周转时间、最少的平均带权周转时间。服务用时最短的作业/进程优先得到服务。既可以用于作业调度,也可以用于进程调度。

​ 短作业优先算法,默认是非抢占式的算法,但是也有抢占式的版本(最短剩余时间优先算法)

​ 优点:最短的平均等待时间、平均周转时间
​ 缺点:不公平,对短作业有利,对长作业不利,可能产生饥饿现象(不停的有短进程加入,会导致长进程饥饿)。进程的运行时间是由用户提供的,不一定真实,不一定能做到真正的短作业优先。

image-20240628152932964

​ 当采用最短剩余时间优先的算法时,需要在有新任务加入就绪队列时判断是否需要抢占处理机。时间分配如下:

image-20240628155457412

高响应比优先算法(HRRN)

​ 综合考虑作业/进程的等待时间和服务时间。在每次调度时先计算各个作业/进程的响应比,选择响应比高的作业/进程进行服务。响应比大于1。既可以用于作业调度也可以用于进程调度。

image-20240628162059305

​ 高响应比优先算法是非抢占式的算法。只有当进程主动放弃处理机时才需要调度。

​ 优点:综合考虑了等待时间和运行时间,等待时间相同时,要求服务时间短的优先,要求服务时间相同时,等待时间长的优先。对于长作业来说,随着等待时间增加,响应比也会增加,避免造成饥饿

image-20240628162512523
对比
image-20240628165705027

这三种算法主要关心用户的公平性、平均周转时间、平均等待时间等评价整体性能的指标,但是不关心响应时间、也不区分任务紧急程度,交互性很差,因此一般适合早期的批处理系统。

时间片轮转调度算法

​ 算法思想:公平轮流的为各个进程服务,让每个进程在一定时间间隔内都可以得到响应。

​ 算法规则:按照各个进程到达就绪队列的顺序,轮流让每个进程执行一个时间片,若进程未在一个时间片内执行完成,则剥夺处理机,将进程重新放到就绪队列重新排队。

​ 进程未能在时间片内完成功能会被强行剥夺处理机的使用权限,因此属于抢占式算法,由时钟装置发出时钟中断来通知时间片已到。

image-20240701152037845

​ 当某一时刻有进程新加入就绪队列并且由进程时间片用完也要加入就绪队列时,一般把新加入队列的进程放到时间片用完的进程之前。如时间片为2时,进程P1时间片用完,进程P2加入就绪队列,此时就绪队列应该为 P1 , P2 。

​ 当时间片设置太大时,所有进程都可以在一个时间片内完成任务,时间片轮转算法就退化成了先来先服务算法,增大进程的响应时间,因此时间片不能太大。
​ 另一方面,进程调度、切换是有时间代价的,如果时间片太小,进程切换过于频繁,系统会浪费大量时间,导致实际用于 进程执行 的时间比例减少,因此时间片不能太小。

​ 优点:公平,响应快,适用于分时操作系统。
​ 缺点:高频率的进程切换,会有一定的时间开销。不区分任务的紧急程度。

​ 时间片轮转算法:只用于进程调度不会造成饥饿

优先级调度算法

​ 算法思想:根据任务的紧急程度决定任务的处理顺序。

​ 算法思想:为每个作业/进程设置一个优先级,在每次调度的时候选择优先级最高的作业/进程。

​ 优先级调度算法既可以用于作业调度,也可以用于进程调度可能引发饥饿

​ 优先级调度算法既有抢占式也有非抢占式。做题时的区别在于:非抢占式只需在进程主动放弃处理机时进行调度即可,而抢式还需在就绪队列变化时,检查是否会发生抢占。

​ 优点:用优先级区分紧急程度、重要程度、适用于实时操作系统。可以灵活的调整对各种作业/进程的偏好程度。
​ 缺点:如果有源源不断的高优先级进程到来会导致饥饿。

image-20240701154345928

image-20240701154526407

image-20240701154708853

image-20240701154730763

多级反馈队列调度算法

​ 多级反馈队列调度算法是对其他调度算法的折中权衡

​ 算法规则:1.设置多级就绪队列,各级队列优先级从高到低,时间片从小到大
​ 2.新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间 片,若用完时间片进程还未结束,则进程进入下一级队列队尾。如果 此时已经是在最下级的队列,则重新放回该队列队尾
​ 3.只有第k级队列为空时,才会为k+1级队头的进程分配时间片

一般用于进程调度如果不停有进程加入可能会导致饥饿。

​ 多级反馈队列调度算法是一种抢占式的算法,在K级队列中的进运行过程中,如果更上级的队列中进入了一个新进程,那么这个优先级更高的进程会抢占处理机,原来的进程放回K级队列队尾。

​ 优点:对各类型进程相对公平(FCFS的优点);
​ 每个新到达的进程都可以很快就得到响应(RR的优点);
​ 短进程只用较少的时间就可完成(SPF的优点);
​ 不必实现估计进程的运行时间(避免用户作假);
​ 可灵活地调整对各类进程的偏好程度,比如CPU密集型进程、I/O密集型进程

image-20240701155848193

区别

image-20240701160433090

​ 这三种算法适用于交互式操作系统

2.3.1同步和互斥

进程同步:同步 又叫做 直接约束关系 它是指为完成某种任务而建立的两个或者多个进 程,这些进程因为需要在某些位置上协调他们的工作次序而产生的制约关系。 进程间 的直接制约关系就是源于他们之间的互相合作。

进程互斥:我们把一个时间段内只允许一个进程使用的资源称为临界资源。对临界资源的 访问,必须互斥地进行。互斥,亦称间接制约关系。进程互斥指当一个进程访 问某临界资源时,另一个想要访问该临界资源的进程必须等待。当前访问临界 资源的进程访问结束,释放该资源之后,另一个进程才能去访问临界资源。

对临界资源的互斥访问可以分为以下四个部分:

​ 进入区:检查是否可以进入临界区,如果可以进入则设置 正在访问临界资源标志(上锁)
​ 以阻止其他进程同时进入临界区。

​ 临界区:实际访问临界资源的代码

​ 退出区:负责解除 正在访问临界资源的标志(解锁)

​ 剩余区:负责其他处理

为了实现对临界资源的互斥访问,同时保证系统整体性能,需要遵循以下原则:

​ 1.空闲让进:临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区;
​ 2.忙则等待:当已有进程进入临界区时,其他试图进入临界区的进程必须等待;
​ 3.有限等待:对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿);
​ 4.让权等待:当进程不能进入临界区时,应该立即释放处理机,防止进程忙等待;

小结
image-20240701163254799

2.3.2进程互斥的软件实现方法

单标志法

​ 两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程,也就是说每个进程进入临界区的权限只能被另一个进程远程赋予。

image-20240701164736599

​ 当某个进程一直不访问临界区时,即使临界区空闲,其他进行也无法使用临界资源,所以单标志法的主要问题是违反了空闲让进的原则。

双标志先检查法

​ 算法思想:设置一个布尔数组,数组中各个元素用来标记各个进程想进入临界区的意愿,falg[0]=true表示P0进程想要进入临界区,每个进程在进入临界区之前要检查当前有没有别的进程想进入临界区,如果没有可以把自身对应的数组值设置为true,然后开始访问临界区。

image-20240701165219484

​ 如果两个进程并发运行,可能会导致两个进程同时进入临界区,违反了忙则等待的原则。同时进入临界区的原因是进入区的 “检查” 和 “上锁”并不是同时进行的,在两个步骤之间可能发生进程切换。

双标志后检查法

对于双标志先检查法进行了优化,调整了‘’ 检查 ‘’ 和“上锁 ”的顺序。

image-20240701165830260

​ 双标志后检查法解决了忙则等待的问题,但是由于并发,两个进程可能会同时转换标志,违反空闲让进和有限等待的原则。并且双方都无法进入临界区会产生饥饿现象。

Peterson算法

​ 结合了双标志法和单标志法的思想,如果双方都争着进入临界区那么让进程进行权限转交。

image-20240701171902049

​ Peterson算法可以解决进程互斥问题,遵循了空闲让进,忙着等待,有限等待三个原则,但是未遵循让权等待的原则。

小结

image-20240701175353488

2.3.3进程互斥的硬件实现方法

中断屏蔽方法

​ 利用开/关中断指令(类似原语,利用关中断使得进程不能发生切换,当访问完临界区之后再开中断,允许进程切换)

​ 优点:简单、高效
​ 缺点:1.不适用于多处理机;2. 只适用于操作系统内核进程,不适用用户进程(因为开/关中断指令只能运行在内核态)

TestAndSet指令

​ 简称为TS指令或者TSL指令(TestAndSetLock)

​ TSL指令是由硬件实现的,执行的过程中不允许被中断。

image-20240702102114367

image-20240702102421786

​ 优点:实现简单,无需像软件实现方法一样检查逻辑漏洞,适用于多处理机环境
​ 缺点:不满足让权等待原则,暂时无法进入临界区的进程会占用CPU并循环TSL指 令,导致忙等。

Swap指令

​ Swap指令也是硬件实现的,执行过程中不允许被中断。

image-20240702102612816

image-20240702102620775

​ 优点:实现简单,无需像软件实现方法一样检查逻辑漏洞,适用于多处理机环境
​ 缺点:不满足让权等待原则,暂时无法进入临界区的进程会占用CPU并循环Swap指 令,导致忙等。

小结

image-20240702102746021

2.3.4互斥锁

​ 解决临界区最简单的工具就是互斥锁,一个进程在进入临界区时上锁,在退出临界区时解锁。上锁和解锁的执行必须是原子操作,因此互斥锁通常采用硬件机制来实现。

image-20240702103701274

​ 互斥锁的主要缺点是忙等待,当有其他进程使用临界区时,进程必须循环调用上锁函数,当多个进程共享同一个CPU时,会造成CPU的浪费,因此互斥锁常用于多处理器系统,
一个进程在一个处理机上等待不会影响其他进程的执行。

​ 需要连续循环忙等的互斥锁都可以被叫做自旋锁,如TSL指令、Swap指令、单标志法

特性

​ 1.需忙等,进程时间片用完才下处理机,违反“让权等待”

​ 2.优点:等待期间不用切换进程上下文,多处理器系统中,若上锁的时间短,则等待代价 很低

​ 3.常用于多处理器系统,一个核忙等,其他核照常工作,并快速释放临界区

​ 4.不太适用于单处理机系统,忙等的过程中不可能解锁

2.4.1信号量机制

​ 用户可以通过使用操作系统提供的一对原语( wait(S)原语 和 signal(S)原语)来对信号量进行操作,从而很方便的实现进程同步、进程互斥。

​ 信号量其实就是一个变量、可以用一个信号量来表示系统中的某种资源的数量。

​ 原语是一种特殊的程序段,执行过程不可被打断,原语是由开/关中断指令实现的

​ Wait、Signal原语常常被称为 P、V操作,所以常常把Wait(S)、Signal(S)操作简称为P(S)操作和V(S)操作。(题目中出现P、V操作时,若无特殊说明,一般指记录型信号量

整形信号量

​ 用一个整数型的变量作为信号量,用来表示系统中某种资源的数量

image-20240702105929264

​ wait语句是原语,在P1使用wait语句时不会进行进程切换,所以不会出现多个进程同时使用临界资源的状况

​ 整形信号量存在的问题:不满足让权等待原则,会发生忙等

记录型信号量

image-20240702110725301

​ block语句的作用是让某个进程主动进入阻塞态,放弃CPU资源。wakeup语句是让进程从阻塞态进入就绪态。

​ 如果wait语句判断 value值小于0,则表示此时无临界资源,那么会让进程L进入阻塞队列,当有一个进程使用完成临界资源,系统会判断Value的值,如果小于0表示还有进程需要使用临界资源,系统会把阻塞队列对头的进程唤醒,并分配临界资源。

image-20240702111231400

image-20240702111245061

小结

image-20240702111323211

2.4.2利用信号量机制实现互斥、同步、前驱关系

实现进程互斥操作

步骤:

​ 1.需要分析进程的关键活动,划分临界区
​ 2.设置一个 互斥信号量 mutex 初始值为1(表示允许进入临界区的进程数量为1)
​ 3.在进入区 P(mutex) 申请资源
​ 4.在退出区 V(mutex) 释放资源

注意:

​ 对不同的临界资源需要设置不同的 互斥信号量 (mutex1 mutex2 .......)

​ P、V操作必须同时出现,确实P操作无法保证临界资源的互斥访问。缺少V操作会导致资 源永远不会被释放,等待进程永远不会被唤醒。

实现进程同步操作

​ 进程同步:使各个并发的进程按照要求 有序的推进。

步骤:

​ 1.分析什么地方需要实现同步关系,即必须保证一前一后执行的两个操作。
​ 2.设置一个 同步信号量S 初始值为0.
​ 3.在 前操作 之后执行 V(S)
​ 4.在 后操作 之前执行 P(S)

image-20240702113205630

信号量机制实现前驱关系

​ 前驱关系问题本质上是多级同步问题。

image-20240702114228374

image-20240702114121566

最终的进程实现过程中的P、V操作如下所示

image-20240702114252356

小结

image-20240702114425141

2.3.5管程

管程是一种特殊的软件模块,有以下部分组成:
1.局部于管程的 共享数据结构 说明(比如 :缓冲区)
2.对该共享数据结构进行操作的一组过程(过程也就是函数)
3.对局部与管程的共享数据设置初始值的语句
4.管程名字

管程的基本特征:
1.局部于管程的数据 只能被局部与管程的过程所访问
2.一个进程只有通过调用管程内的过程才能进入管程访问共享数据
3.每次仅允许一个进程在管程内执行某个内部过程(各个进程互斥的进入管程的过程, 是由编译器负责实现的)

image-20240703090845461image-20240703090853328

小结

image-20240703091229453

2.3.6生产者消费者问题

image-20240703092020647 image-20240703092211078

image-20240703092201427

实现互斥操作的PV操作是在一个进程中的
实现同步操作的PV操作是在两个不同进程中的

image-20240703092950891

实现互斥的P操作必须在实现同步的P操作之后,如

image-20240703093306478

​ 此时如果产品已满,执行生产者操作:P(mutex)使得生产者进入临界区,P(empty)使得生产者阻塞,转换到消费者,消费者会被卡在P(mutex) 中,两个进程相互等待产生死锁。
​ 实现同步的V操作和实现互斥的V操作顺序变化不会影响死锁。

2.3.7多生产者-多消费者

image-20240703094333751

互斥同步关系分析

image-20240703094504105

image-20240703094600506

互斥、同步关系图:

image-20240703095131330

初始值设置:

image-20240703094806098

进程设计:

image-20240703101107808

​ 在此问题中,不设置互斥操作也可以完成进程设计,不会产生死锁,原因是临界区资源为1,在进程进入临界区时最多会有一个进程的P操作不会被阻塞。但是当临界区资源增加到2时,进程dad 和进程 mom可能会一起进入缓冲区,可能会导致数据被覆盖。因此,当缓冲区大小大于1就必须设置一个互斥信号量来保证进程可以互斥的访问缓冲区,等于1的时候可能不需要,也可能需要(建议直接加)。

2.3.8吸烟者问题

image-20240703101218140

互斥、同步关系分析:

​ 互斥关系:桌子资源是临界区资源,每次能容纳一个数据。
image-20240703101351251

互斥、同步关系图:

image-20240703102033663

初始值设置:

image-20240703102208225

进程设计:

image-20240703102339365image-20240703102430034

2.3.9读者写者问题

image-20240703143313803

互斥、同步关系分析:

image-20240703145438661

信号值设置:

image-20240703145816869

进程设计:

image-20240703145834426image-20240703145844662

​ rw资源表示文件互斥访问临界区,
​ 在写进程前后 加入 P( rw ) 和 V( rw )可以保证一个时间内只有写进程与其他写进程和读进程互斥。
​ 在读进程前后加入 P( rw ) 和 V( rw ) 可以保证读进程与写进程互斥,但是此时读进程与读进程也互斥,违反题目,于是添加计数变量 count 只有第一个读进程开始读取的时候才会触发 P( rw ),保证了读进程与写进程的互斥,其他读进程读取的时候会跳过if语句,只有最后一个读进程读取完毕后写进程才有可能写文件,保证了多个读进程可以一起读取、读进程与写进程互斥。
​ 添加count之后 在if 判断语句 和 P(rw) 语句之间可能会发生进程切换,导致第二个读进程修改rw值进行读取,第一个读进程阻塞在 p(rw)语句上。于是在if判断条件之前加入一个互斥信号量 mutex,使得各个读进程互斥的访问count变量。
​ 此时互斥性得到了保障,但是当读进程读取时有源源不断的读进程加入的话,会导致写进程的饥饿,于是添加信号量w。当多个写进程需要写文件时,保证了同一时间只有一个写进程;当多个读进程需要读文件时,保证了各个进程互斥的访问count变量,且多个读进程可以一起读取;当读进程和写进程同时像访问临界区时,读进程和写进程会在P(w)操作处阻塞,并且根据到来时间在阻塞队列中排序,当写进程完成 V(W)操作或者所有读进程完成V(w)时,会根据阻塞队列唤醒进程。如果唤醒的是写进程,写进程会被阻塞在P(rw)并且V(w)不会被释放,其他读进程被阻塞到P(w)保证了在读取完成后写进程可以写文件写完后释放V(w)读进程可以读取文件。如果唤醒的是读进程,则会同时读取文件并唤醒下一个阻塞队列中的进程。

2.3.10哲学家进餐问题

image-20240703152448807

互斥关系分析:

	五位哲学家与左右邻居对中间的筷子的访问关系,是互斥关系。

信号值设置:

​ 用数组实现对5个筷子的互斥访问设置数组 chopstick[5] = {1,1,1,1,1},并对哲学家和筷子进行 0-4编号,哲学家 左边的筷子编号与哲学家编号相同 右边的筷子编号为(i+1)%5

image-20240703155957146

如果让每个人以此拿取左边筷子、右边筷子,此时进程设计如下:

image-20240703160130538

​ 此时如果每个人在执行 拿左边筷子的P操作时进行进程切换,则所有人都会拿起左边筷子并且在拿起右边筷子时发生阻塞,造成系统死锁。

防止死锁发生的方法:
1.对拿起筷子的人的数量进行限制,如:最多有四个人同时拿起筷子,那么总会有一个人不会被阻塞,进程不会死锁(用一个大小为4的信号量实现)

​ 2.规定奇数编号的人优先拿起左边筷子、偶数编号的人优先拿起右边筷子。(在进程开始时先判定编号是奇数还是偶数, if ---- else)

​ 3.设置一个互斥信号量,使得一个人拿筷子时,其他人不会拿筷子:

image-20240703160814476

​ 这样保证了各个人拿筷子会互斥的进行,即使一个人只拿了一个筷子被阻塞时其他人也不会拿筷子,被阻塞的人等待别人用完可以解除阻塞拿起筷子。

3.1.1内存

​ 内存用来存储数据,程序执行之前需要先放入内存中才能被CPU处理,内存用来缓和CPU和硬盘之间的速度矛盾。
​ 内存划分为一个一个的小的存储单元,内存地址从0开始,每个地址对应一个存储单元,如果计算机按字节编址,那么每个存储单元大小就是一字节(1B),即八个二进制位。如果按字编址,那么一个存储单元大小就是一个字,需要根据题目大小判断字的大小确定存储单元的大小。

装入方法

​ 装入:由程序将装入模块放入内存中运行 的过程。

image-20240704105810715

绝对装入:在编译时,如果知道程序要放到内存中的哪个位置,编译程序会将指令中的相对地址转化为绝对地址,装入程序按照绝对地址将数据和程序装入内存。

​ 如:指令0表示要往相对地址为79的存储单元中装入数据,且已知指令0的地址为100,那么编译程序可以直接把指令0 中的79的相对地址改为179的绝对地址。存入内存的指令是修改过的指令。

image-20240704102958554image-20240704103014259image-20240704103837163

​ 缺点:只适用于单道程序环境;不灵活(直接修改了指令,无法一直到其他计算机中使用。)

可重定位装入(静态重定位):指令中的地址依然是从0开始的相对地址,重定位的工作在装入模块装入内存时处理,在装入时会根据起始程序的开始地址得到绝对地址,原来指令不会改变,但是装入内存的指令经过了修改。image-20240704104109933

​ 缺点:在进程装入内存时,所分配的地址空间必须时连续的,必须分配其要求的全部内存空间,内存空间不足则无法进行装入。作业一旦进入内存后,在运行期间就不能移动(因为装入内存中的指令地址已经固定),也不能申请空间。

动态运行时装入(动态重定位):指令中的地址是相对地址,装入内存中的地址也是相对地址,在装入程序时需要借助 重定位寄存器找到绝对地址。重定位寄存器中存放了指令存入的起始位置,在CPU执行指令时会将相对地址和起始地址i相加,得到绝对地址。

image-20240704104951985

特点:可以将程序分配到不连续的存储区中;在程序运行前只需要装入部分代码即可运 行,在运行期间可以根据需要动态申请分配内存; 便于程序段的共享,可以向用户 提供一个比存储空间大的多的地址空间。

链接方式

​ 链接:由链接程序将编译后形成的目标模块以及库函数链接在一起, 形成完整的装入模块的过程。

image-20240704105840694

静态链接:在程序运行之前将各个目标模块以及库函数链接成一个完整的可执行文件(装 入模块),之后不再拆开。

image-20240704110307382

装入时动态链接:在将各个目标模块装入内存时才进行链接,一边装入,一边链接。

image-20240704110354087

运行时动态链接:在程序执行过程中需要某个目标模块时,将该模块装入内存,不需要的 模块就不进行装入(比如需要模块1,将模块1装入,等到需要模块2再 将模块2装入,如果不需要模块3,就不需要装入)

​ 特点:便于修改和更新,便于实现对目标模块的共享

image-20240704110437040

小结
image-20240704111001699

3.1.2内存管理

操作系统对内存进行的管理

​ 1.操作系统负责内存空间的分配与回收。
​ 2.操作系统需要提供某种技术从逻辑上对内存空间进行扩充(虚拟技术)。
​ 3.操作系统需要提供地址转换功能,负责程序的逻辑地址与物理地址的转换。(一般是可 重定位装入(早期多道批处理操作系统) 和 动态运行时装入(现代操作系统) 两种方法, 绝对装入 是单道程序阶段,还没产生操作系统,由编译器实现或者写程序时完成)
​ 4.操作系统要提供内存保护功能,保证各个进程在各自存储空间内运行,互不干扰。
​ 方法一:设置一对上限、下限寄存器,分别存放进程的上限、下限地址,进程只能访 问这个区域内的地址,由CPU负责检查是否越界。
​ 方法二:采用重定位寄存器 和 界地址寄存器 来进行越界检查。重定位寄存器存放起 始绝对地址,界地址寄存器存放最大的相对地址(如 0-179 存放179),在程 序运行时,CPU会把指令中的相对地址与界地址寄存器中的最大相对地址进 行比较,没有越界时会将此相对地址与重定位寄存器存的绝对地址相加,越 界后会抛出越界异常。

小结

image-20240704112650168

3.1.3进程的内存映像

image-20240704113805640

3.1.4覆盖与交换

覆盖技术

​ 覆盖技术:用来解决程序大小超过物理内存综合的问题

​ 思想:把程序分为多个段(多个模块),常用的段常驻内存,不常用的段在需要时调入内存
​ 内存中分为 一个固定区 和若干个 覆盖区。常驻内存的段放在固定区中就不再 调出(除非运行程序结束)不常用的段放入覆盖区,需要时调入内存,不需要 时调出内存

image-20240704114643784

​ 覆盖结构需要由程序员声明,操作系统来完成自动覆盖。缺点:对用户不透明,增加了用户编程负担。覆盖技术一般用于早期的操作系统。

交换技术

​ 思想:在内存空间运行紧张时,系统将内存中某些进程暂时换出外存,把外村中的某 些已经具备运行条件的进程换入内存(进程在内存与磁盘之间动态调度)。

​ 中级调度就是负责进程调入调出内存

​ 暂时调出外存的进程状态成为挂起状态(可以进一步分为就绪挂起、阻塞挂起)

image-20240704115523697 image-20240704115547799 image-20240704115615785

​ PCB是会常驻内存的,并不会被换出外存

image-20240704115731437
覆盖与交换的区别

​ 覆盖是指同一个程序或进程,在内存不足时进程的一部分将另一部分覆盖。
​ 交换是指不同的进程,在内存紧张时,把某些进程换入外存。

小结

image-20240704115845884

3.1.5连续分配管理方式

​ 连续分配:用户进程分配的必须是一个连续的内存空间。

单一连续分配

​ 在单一连续分配方式中,内存被分为系统区和用户区。系统区通常位于内存的低地址部分,用来存储操作系统相关数据;用户区用于存放用户进程相关数据。
​ 采用单一连续分配方式,内存中只能有一道用户程序,不支持多道程序并发运行,用户程序独占整个用户区

​ 优点:实现简单:无需外部碎片;可以采用覆盖技术扩充内存 ;不一定需要内存保护
​ 缺点:只能用于单用户、单任务的操作系统中 ;有内部碎片(分配给某进程的内存区 域中,有部分没有用上,就是内存碎片) ; 存储器利用率极低

image-20240705085412795 image-20240705085802967

固定分区分配

​ 将用户区划分为若干个大小固定的分区,在每个分区中只装入一道作业。

​ 分区大小相等:缺乏灵活性(小进程会造成内存浪费、大进程无法装入),但是适合 于用一台计算机控制多个相同对象的场景(如:控制多个炼钢模块)

​ 分区大小不等:增加了灵活性,可以满足不同大小进程需求,通常根据系统运行的作 业大小情况进行划分

​ 固定分区分配的优点:实现简单,不会产生外部碎片
​ 缺点:1.当一个程序太大,所有分区都无法满足需求,必需采用覆盖 技术解决问题,造成性能降低
​ 2.会产生内部碎片,内存利用率低

image-20240705090016546

​ 操作系统需要建立一个数据结构:分区说明表,来实现各个分区的分配与回收。每个表项对应一个分区,通常按分区大小排列。每个表项包括对应分区的大小、起始地址、状态(是否已分配)。

image-20240705090511305

动态分区分配

​ 又称为可变分区分配,这种分配方式不会预先划分内存分区,而是在进程装入内存时。根据进程大小动态的建立分区,并使分区内的大小正好适合进程需要,因此分区的大小和数目是可以改变的。

image-20240705091221109

​ 操作系统会使用空闲分区表 / 空闲分区链来记录操作系统内存的使用情况

空闲分区表:记录空闲的分区,每个空闲分区对应一个表项,包括分区号、分区大小、起始地址、状态等等

image-20240705091326778

空闲分区链:每个分区的起始部分和结尾部分分别是指前向和后向指针,起始部分还可以记录分区大小等信息。

image-20240705091531090

动态分区分配算法

​ 动态分区分配算法需要解决的问题是,当有多个空闲区间可以被分配时,将哪个空间分配给进程的问题。

​ 1.首次适应算法:每次从低地址查找,找到的第一个能满足大小的空闲分区进行分配。
​ 实现:将空闲分区按照地址递增的次序进行排列,每次分配内存时顺序查找 空闲分区链 / 空闲分区表。

​ 2.最佳适应算法:为了保证 大进程到来时能够有连续的大片空间,可以尽可能多的留下 大片的空闲区,即优先使用更小的空闲区
​ 实现:将空闲分区按照容量递增次序进行排列,每次分配内存时按照顺序查 找空闲分区链/空闲分区表,找到大小能满足的第一个空闲分区
​ 缺点:每次分配和释放后内存空间会改变,需要重新进行排序。每次都选最 小的内存进行分配,会产生越来越多的很小的内存块,产生很多外部 碎片。

​ 3.最坏适应算法:为了避免留下过多的外部碎片,在每次分配时优先使用最大空闲区
​ 实现:把空闲区按照容量递减的顺序排列,每次分配时按照顺序查找空闲分 区链/空闲分区表
​ 缺点:每次分配和释放后内存空间会改变,需要重新进行排序。每次都选用 最大的分区进行分配,虽然可以让剩余的空闲区更大,产生的外部碎 片更少,但是当大进程到达后可能不会有空闲的内存分区进行分配

​ 4.临近适应算法:低地址适应算法总是在表头开始查找,可能会导致低地址部分出现很 多很小的分区,但是查询时每次都需要比较这些分区大小,会导致查 询开销增大,临近适应算法在查询时每次都在上次查询结束的位置进 行检索。
​ 实现:把空闲分区 按照地址递增的顺序排列(为了方便可以排成循环链表), 每次分配内存时从上次查找结束的位置开始查找空闲分区链,找到大 小能满足要求的第一个空闲分区
​ 对比:首次适应算法从头开始找,会导致低地址分区很小,但是每次查询都 从低地址查,查询开销大且有外部碎片。但是也更有可能把高地址的 大分区保留下来,等到大进程来时分配
​ 临近适应算法,从上次查询结束的地方开始找,解决了查询开销问题 和低地址外部碎片的问题,但是也导致了高地址的大分区更可能被划 分为小分区,在大进程来时无大分区可用。

image-20240705102508675

分配和回收策略

​ 假如有一个进程需要分配空间,如果空闲区间的内存大于进程内存大小,那么只需要在空闲分区表中修改分区大小和起始地址即可

image-20240705092224120 image-20240705092243318

​ 如果空闲分区的大小等于进程大小,那么需要在空闲分区表中删除此空闲表项

image-20240705092348814 image-20240705092414695

​ 假如有一个进程运行结束,在对内存空间进行回收时,如果此进程后面有一块空闲内存分区,那么把相邻的空闲分区进行合并,并在空闲分区表中更改内存大小和起始地址。

image-20240705092812846 image-20240705092829924

​ 前面有空闲分区的情况类似:但是不需要修改起始地址

image-20240705092952503 image-20240705093007835

​ 前后都有的情况:把空闲分区表中的两项进行合并,并修改大小,起始地址

image-20240705093113738 image-20240705093127029

​ 前后都没有空闲分区的话,那么新添加一项表项

image-20240705093232643 image-20240705093243987

小结
image-20240705093646376

3.1.6基本分页存储

​ 基本分页存储是非连续分配的方式。

​ 分页存储:系统将内存空间分为大小相等的分区,每个分区是一个页框(页帧、内存块、物理块、物理页面)每个页框都有一个编号,即页框号,从0开始。操作系统把进程的逻辑地址空间分成与页框大小相等的一个个部分,每个部分称为 页(页面),每个页也有一个编号,即页号,从0开始。
image-20240705103356084 image-20240705103659829→划分为→image-20240705103530077

​ 操作系统以页框为单位,为各个进程分配内存空间,进程的每个页面放入一个页框中,进程的页面与 内存的页框有一 一对应关系。各个页面不必要连续存放,可以存放到不相邻的页框中。

image-20240705103755456

​ 页表:为了能知道进程的页面在内存中的存放位置,操作系统要为每个进程建立一张页表。页表通常存放到PCB中

image-20240705104601549

1.一个进程对应一张页表
2.进程的每个页面对应一个页表项
3.每个页表项由“页号”和“块号”组成
4.页表记录进程页面和实际存放的内存块之间的映射关系

image-20240705104833969

只有记录页框号(块号)需要占据存储空间,页号是可以隐藏的不需要占据空间。

分页存储的地址转换

​ 分页存储的各个页面在内存中是离散存储的,但是在各个页面内部的指令是连续存放的。

​ 如果要访问一个指令 A 进行地址转换的步骤:
​ 1.确定指令的页号
2.根据页号 在页表中 找到在内存中的起始位置
​ 3.找到逻辑地址对应的物理地址(等于内存的起始地址+页内偏移量)

image-20240705110756024
小结
image-20240705111413733

3.1.7基本地址变换机构

​ 基本地址变换结构 可以借助进程的页表将逻辑地址转换为物理地址。

​ 通常会在系统中设置一个 页表寄存器,存放页表在内存中的起始地址F 和页表长度M

​ 进程未执行时,页表的初始地址和 页表程度放在 进程控制块(PCB)中,当进程被调 度,操作系统内核会把他们放到页表寄存器中。

系统进行地址变换的过程

​ 1.根据逻辑地址计算出 页号、页内偏移量
​ 2.判断页号是否越界(页号(从零开始)是否小于页表长度,大于等于页表长度需要进行越 界中断)
​ 3.查询页表、找到页号对应的页表项,确定页面存放的内存块号
​ 4.用内存块号和页内偏移量得到物理地址。

image-20240706144023878 image-20240706144405434
小结

image-20240706144617252

3.1.8具有快表的地址交换机构

​ 快表:又称为联想寄存器(TLB),是一种访问速度比内存快的多的高速缓存(TLB不是内存),用来存放 最近访问的页表项的副本,可以加速地址变换的速度。于此对应的内存中的页表被称为慢表。快表不会存放进程的全部页表项,只会存放部分页表项。在进程切换时快表会被清空。

使用快表查询的步骤

假设依次访问(0,0)(0,4)这几个逻辑地址

1.访问页号为0 偏移量为0 的地址

image-20240706150116519

2.访问页号为0,偏移量为4的地址

image-20240706150541676

image-20240706150843896

image-20240706151226794

​ 为什么快表只有部分页表项却能提高这么多效率呢:局部性原理

image-20240706151748145

image-20240706151855754

3.1.9两级页表

单级页表存在的问题

image-20240706153849592

​ 1.分配如此多的连续的空间很困难并且违反了内存离散分配的特点

​ 2.根据局部性原理可知,很多时候,进程在一段时间内只需要访问某几个页面就可以 正常运行了。因此没有必要让整个页表都常驻内存。

​ 存在问题一:页表必须连续存放,当页表很大时需要占用多个连续的页框
​ 存在问题二:没必要让整个页表常驻内存,因为在一段时间内可能只需要访问某几个 特定页面

为了解决页表必须连续存储的问题,把页表再进行分组,使每个内存块刚刚好可以放入一个分组,然后在将各个组离散的放到各个内存块中。另外为了知道各个分组之间的先后顺序,还要为离散分配的页表再建立一张页表,称为页目录表或者外层页表或者顶层页表

image-20240706155207492

image-20240706155833604

image-20240706160414328

解决页表常驻问题:在需要访问页面时才把页面调入内存(虚拟存储技术)。可以在页表项中增加一个标志位,用于表示该页面有没有调入内存。如果想访问的页面不在内存中,则会产生缺页中断(内中断),然后将目标页面从外存调入内存。

要求:
image-20240706162028550 image-20240706162050968
小结
image-20240706162240505

3.1.10基本分段存储管理方式

​ 分段:进程的地址空间会按照自身的逻辑关系划分为若干个段,每个段都有一个段名。每段从0开始编址。

​ 内存分配规则:以段为单位进行分配,每个段在内存中占据连续空间,但是各个段之间可以不相邻。

image-20240706162916526

段号的位数决定了每个进程最多可以分几个段

段内地址位数决定了每个段的最大长度是多少

image-20240706163143437 image-20240706163353897
段表

​ 程序分为多个段,各个段离散的装入内存,为了保证程序能正常运行,就必须能从物理内存中找到各个逻辑段的存放位置,所以要建立一张段 映射表 即 段表

image-20240706163825526

​ 每个段会对应一个段表项,记录了段在内存中的起始位置和段的长度。

​ 每个段表项 的长度是相同的,即每个段表项所占据的内存空间是相同的

image-20240706164557249

地址转换过程:

​ 1.根据逻辑地址得到段号、段内地址
​ 2.判断段号是否产生越界,若S>=M则执行越界中断,否则继续执行(段号从0开始)
​ 3.查询段表,找到对应的段表项,段表项的存放地址为F+S*段表项长度
​ 4.检查段内地址是否超过了此段的段长 若超过则会产生越界中断(用页存储时不用)
​ 5.计算物理地址
​ 6.访问目标单元

分段和分页的对比

​ 页是信息的物理单位,分页时只考虑每个页面的物理大小。分页的主要目的是为了实现离散分配,提高内存利用率。分页仅仅是系统管理上的需要,完全是系统行为,对用户是不可见的。

​ 段是信息的逻辑单位,分段时需要考虑模块的逻辑关系,把一个完整的模块划分为一个段。分段的主要目的是更好地满足用户需求。一个段通常包含着一组属于一个逻辑模块的信息。分段对用户是可见的,用户编程时需要显式地给出段名。

​ 页的大小固定且由系统决定。段的长度却不固定,决定于用户编写的程序。

​ 分页的用户进程地址空间是一维的,程序员只需给出一个记忆符即可表示一个地址。
​ 分段的用户进程地址空间是二维的,程序员在标识一个地址时,既要给出段名,也要给出段内地址。

​ 分段比分页更容易实现信息的共享和保护。

​ 不能被修改的代码称为纯代码或可重入代码(不属于临界资源),这样的代码是可以共享的。可修改的代码是不能共享的(比如,有一个代码段中有很多变量,各进程并发地同时访问可能造成数据不一致)

image-20240706170449849
小结
image-20240706170517840

3.1.11段页式管理方法

image-20240706172003681

​ 段页式管理方式结合了两种方法的优点,先将进程按照逻辑分成不同的段,再将各个段分成不同的页。内存空间也会被划分成大小相同的内存块(页框)

image-20240706172642562 image-20240706172708940

​ 段号的位数决定了每个进程最多可以分几个段
​ 页号位数决定了每个段最大有多少页
​ 页内偏移量决定了页面大小、内存块大小是多少

​ “分段”对用户是可见的,程序员编程时需要显式地给出段号、段内地址。而将各段“分页”对用户是不可见的。系统会根据段内地址自动划分页号和页内偏移量。因此段页式管理的地址结构是二维的

段表、页表
image-20240706173711627

​ 每个段对应一个段表项,每个段表项由段号、页表长度、页表存放块号(页表起始地址)组成。每个段表项长度相等,段号是隐含的。

​ 每个页面对应一个页表项,每个页表项由页号、页面存放的内存块号组成。每个页表项长度相等,页号是隐含的。

进行地址转换的过程

​ 1.根据逻辑地址得到段号、页号、页内偏移量
​ 2.判断段号是否越界,若段号大于等于段表长度,则产生越界中断,否则继续执行
​ 3.查询段表,找到相应的段表项,段表项存放地址为 段表起始地址+段号*段表项长度
​ 4.检查页号是否越界,若页号>=页表长度,执行越界中断,否则继续执行。
​ 5.根据页表存放块号找到页表,根据1中页号找到页表项
​ 6.根据内存块号、页内偏移量得到最终地址
​ 7.访问内存单元

也可引入快表机构,用段号和页号作为查询快表的关键字。若快表命中则仅需一次访存

小结

image-20240706180607830

3.2.1虚拟内存

传统存储管理方式的特点:

​ 一次性:作业必须一次性全部装入内存后才可以开始运行,当作业过大时不能全部装入内存,导致大作业无法运行。当大量作业要运行时,内存无法容纳所有作业,只能有少量作业能够运行,导致多道程序并发度下降。
​ 驻留性:一旦作业放入内存,就会一直留在内存中,直到作业结束。实际上在一段时间内,只需要访问作业的一小部分数据即可正常运行,这就导致了内存中会出现大量的,暂时用不到的数据,造成内存浪费。

虚拟内存

​ 基于局部性原理,在程序装入时,可以将程序中很快会被用到的部分装入内存,暂时用不到的部分留在外存,然后开始执行程序,在执行过程中当访问的信息不再内存时,由操作系统负责将所需信息从外村调入内存,然后继续执行程序。如果内存空间不够由操作系统负责将暂时不用的信息换出到外存。在操作系统的管理下,内存容量似乎比实际容量大的多,这就叫做虚拟内存。

虚拟内存特征

​ 多次性:无需作业运行时一次性全部装入内存,而是允许被分成多次调入内存。

​ 对换性:在作业运行时无需一直常驻内存,允许在作业运行过程中将作业换入、换出

​ 虚拟性:从逻辑上扩充了内存的容量

虚拟内存技术的实现

​ 虚拟内存技术允许一个作业分多次调入内存,如果采用连续的分配方式,会不方便实现,因此虚拟内存的实现是建立在离散分配的内存管理方式基础上。在传统的 基本分页存储管理、基本分段存储管理、基本段页式存储管理的基础上增加虚拟存储技术,实现 请求分页存储管理、请求分段存储管理、请求段页式存储管理。

image-20240707161428380

小结
image-20240707161637725

3.2.2请求分页管理方式

​ 与基本分页管理相比,请求分页管理中,为了实现“请求调页”,操作系统需要知道每个页面是否已经调入内存;如果还没调入,那么也需要知道该页面在外存中存放的位置。

​ 当内存空间不够时,要实现“页面置换”,操作系统需要通过某些指标来决定到底换出哪个页面:有的页面没有被修改过,就不用再浪费时间写回外存。有的页面修改过,就需要将外存中的旧数据覆盖,因此,操作系统也需要记录各个页面是否被修改的信息。

image-20240707163031934

缺页中断机构

​ 在请求分页系统中,每当要访问的页面不在内存时,便产生一个缺页中断,然后由操作系统的缺页中断处理程序处理中断。此时缺页的进程阻塞,放入阻塞队列,调页完成后再将其唤醒,放回就绪队列。 如果内存中有空闲块则为进程分配一个空闲块,将所缺页面装入该块,并修改页表中相应的页表项。如果内存中没有空闲块则由页面置换算法选择一个页面淘汰若该页面在内存期间被修改过,则要将其写回外存。未修改过的页面不用写回外存。

​ 缺页中断是内中断

image-20240707164138034 image-20240707164458418
页面置换算法

​ 页面置换算法目的是决定应该换出哪个页面

最佳置换算法(OPT)

​ 最佳置换算法:在每选择淘汰的页面 是以后最长时间不再访问或者以后永远不访问的页面,这样可以保证最低的缺页率。

image-20240707165314319image-20240707165317067

​ 首先访问 7 ,内存块有空闲,放到 内存块1

​ 然后访问 0 ,内存块有空闲,放到 内存块2

​ 然后访问 1 ,内存块有空闲,放到 内存块3

​ 然后访问 2 ,内存已满,采用最佳置换算法,7在14步后才再用,0在1步后再用,1在10步后再用,于是淘汰页面7,将页面2放入 7 所在的位置,后面类似

缺页中断发生了9次,页面置换发生了六次(多的是刚开始时的中断)

缺页率 =缺页中断次数 / 总共访问页面次数 = 9 / 20 = 45%

​ 最佳置换算法前提条件是要知道接下来的页面访问序列,但是在实际情况中系统并不知道访问序列,因此最佳置换算法是一种理想化的算法,无法实现。

先进先出置换算法(FIFO)

​ 先进先出淘汰算法:每次淘汰的页面是最早进入内存的页面

​ 实现方法: 把调入内存的页面根据调入的先后顺序排成一个队列,需要换出页面时选择队头页面即可。队列的最大长度取决于系统为进程分配了多少个内存块。

image-20240707170123744

​ 首先访问3,内存块空闲,装入并将页面号记录在队头。其次是2,空闲,装入,记录在队尾。然后是1,空闲,装入,记录在队尾。

​ 然后访问0,此时内存块已满,对头元素是3,于是把页面0放到 3 所在的内存块,并将队头删掉,队尾加上0

​ 后面类似

Belady异常:增加内存块数量,但是导致缺页中断次数增加的异常现象。只有FIFO算法会出现Belady异常

​ 先进先出算法虽然实现简单,但是算法与实际运行时的规律不符,所以算法性能很差。

最近最久未使用置换算法(LRU)

​ 最近最久未使用置换算法:每次淘汰最近最久未使用的页面

​ 实现方法:赋予每个页面对应的页表项中,用访问字段记录该页面自上次被访问以来 所经历的时间t。当需要淘汰一个页面时,选择现有页面中t值最大的,即 最近最久未使用的页面。

image-20240707171120310

​ 内存块空闲,依次装入1、8、7、2

​ 然后访问到3时,缺页中断,向前查找,7是最久未使用页面,进行替换,把页面3放入页面7的内存块位置

​ 后面类似

​ 最近最久未使用置换算法的实现需要专门的硬件虽然算法性能好,但是实现困难,开销大。(最近最久未使用置换算法性能上是最接近最佳置换算法的)

时钟置换算法(CLOCK)

​ 最佳置换算法性能最好,但无法实现;先进先出置换算法实现简单,但算法性能差;最近最久未使用置换算法性能好,是最接近OPT算法性能的,但是实现起来需要专门的硬件支持,算法开销大。时钟置换算法是一种性能和开销较均衡的算法,又称CLOCK算法,或最近未用算法(NRU)

简单的时钟置换算法:

为每个页面设置一个访问位,再将内存中的页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位置为1当需要淘汰一个页面时,只需检查页的访问位。如果是0,就选择该页换出;如果是1,则将它置为0,暂不换出,继续检查下一个页面,若第一轮扫描中所有页面都是1,则将这些页面的访问位依次置为0后,再进行第二轮扫描(第二轮扫描中一定会有访问位为o的页面,因此简单的CLOCK 算法选择一个淘汰页面最多会经过两轮扫描)

image-20240707173744071

​ 依次访问 1、3、4、2、5并放入队列中,并且标记为1

image-20240707173804936

​ 接下来访问6,此时队列已满,从指针位置依次扫描,遇到1变0,遇到0替换,但是队列中没有0,于是扫描一遍到5,将所有标志置为0,此时指针回到1,标记为0,于是将6放到1的位置,并且标记为1,指针指向下一个。

image-20240707174123315 image-20240707174351845

​ 然后访问3、4改为1(当页面在队列中时,只把标记改为1,指针不移动),访问7,此时指针在3,改为0。指向4,标记改为0,指向2,标记本来就为0,进行替换

image-20240707174919590 image-20240707175013179image-20240707175128930image-20240707175207191

改进的时钟置换算法

​ 简单的时钟置换算法仅考虑到一个页面最近是否被访问过。事实上,如果被淘汰的页面没有被修改过就不需要执行I/O操作写回外存。只有被淘汰的页面被修改过时,才需要写回外存。因此,除了考虑一个页面最近有没有被访问过之外,操作系统还应考虑页面有没有被修改过在其他条件都相同时,应优先淘汰没有修改过的页面,避免I/O操作。这就是改进型的时钟置换算法的思想。修改位=0,表示页面没有被修改过;修改位=1,表示页面被修改过。(淘汰顺序:没访问没修改、没访问修改、访问没修改、访问修改)

​ 算法规则:
​ 首 先:将所有可能被置换的页面排成一个循环队列用(访问位、修改位)表示各 个页面状态
​ 第一轮:从当前位置开始扫描到第一个(0,0)的帧用于替换。本轮扫描不修改任 何标志位
​ 第二轮:若第一轮扫描失败,则重新扫描,查找第一个(0,1)的帧用于替换。 轮将所有扫描过的帧访问位设为0
​ 第三轮:若第二轮扫描失败,则重新扫描,查找第一个(0,0)的帧用于替换。 轮扫描不修改任何标志位
​ 第四轮:若第三轮扫描失败,则重新扫描,查找第一个(0,1)的帧用于替换。

​ 由于第二轮已将所有帧的访问位设为0,因此经过第三轮、第四轮扫描一定会有一个帧被选中,因此改进型CLOCK置换算法选择一个淘汰页面最多会进行四轮扫描

小结
image-20240707164617038

3.2.3页面分配策略

​ 驻留集:指 请求分页存储管理 中 给进程分配的内存块(页框)的集合。在采用了虚拟存储技术的系统中,驻留集的大小一般小于进程总大小

​ 驻留集太小会导致频繁缺页,系统会花费大量时间处理缺页中断,进程执行时间很少
​ 驻留集太大会导致多道程序并发度下降,资源利用率降低

驻留集大小:

​ 固定分配:操作系统为每个进程分配一组固定数目的内存块,在进程运行期间不再改 变,即驻留集大小不变。
​ 可变大小:先为每个进程分配一定数目的内存块,在进程运行期间根据具体情况进行 增加或者减少,即驻留集大小可变。

进行页面置换的范围:

​ 局部置换:发生缺页时只能与进程自己的内存块进行置换
​ 全局置换:可以将操作系统保留的空闲物理块分配给缺页进程,也可以将别的进程持 有的物理块置换到外存,分配给缺页进程

置换策略

​ 根据驻留集大小分配和页面置换的范围可以产生三种置换策略

image-20240707203026123

1.固定分配局部置换:

​ 系统为每个进程分配一定数量的物理块,在整个运行期间都不改变。若进程在运行中发生缺页,则只能从该进程在内存中的页面中选出一页换出,然后再调入需要的页面。这种策略的缺点是:很难在刚开始就确定应为每个进程分配多少个物理块才算合理。(采用这种策略的系统可以根据进程大小、优先级、或是根据程序员给出的参数来确定为一个进程分配的内存块数)

2.可变分配全局置换

​ 刚开始会为每个进程分配一定数量的物理块。操作系统会保持一个空闲物理块队列。当某进程发生缺页时,从空闲物理块中取出一块分配给该进程;若已无空闲物理块,则可选择一个未锁定的页面换出外存,再将该物理块分配给缺页的进程。采用这种策略时,只要某进程发生缺页,都将获得新的物理块,仅当空闲物理块用完时,系统才选择一个未锁定的页面调出。被选择调出的页可能是系统中任何一个进程中的页,因此这个被选中的进程拥有的物理块会减少,缺页率会增加。

3.可变分配局部置换

	可变分配局部置换:刚开始会为每个进程分配一定数量的物理块。当某进程发生缺页时,只允许从该进程自己的物理块中选出一个进行换出外存。如果进程在运行中频繁地缺页,系统会为该进程多分配几个物理块,直至该进程缺页率趋势适当程度;反之,如果进程在运行中缺页率特别低,则可适当减少分配给该进程的物理块。

区别: 可变分配全局置换:只要缺页就给分配新物理块
​ 可变分配局部置换:要根据发生缺页的频率来动态地增加或减少进程的物理块

要在何时调入页面:

​ 1.预调页策略:根据局部性原理,一次调入若干个相邻的页面可能比一次调入一个页面更高效。但如果提前调入的页面中大多数都没被访问过,则又是低效的。因此可以预测不久之后可能访问到的页面,将它们预先调入内存,但目前预测成功率只有50%左右。故这种策略主要用于进程的首次调入,由程序员指出应该先调入哪些部分。(进程运行前的调入)

​ 2.请求调页策略:进程在运行期间发现缺页时才将所缺页面调入内存。由这种策略调入的页面一定会被访问到,但由于每次只能调入一页,而每次调页都要磁盘I/o操作,因此/o开销较大。(进程运行期间的调入)

要在何处调入页面

​ 1.系统拥有足够的对换区空间:页面的调入、调出都是在内存与对换区之间进行,这样可以保证页面的调入、调出速度很快。在进程运行前,需将进程相关的数据从文件区复制到对换区。

​ 2.系统缺少足够的对换区空间:凡是不会被修改的数据都直接从文件区调入,由于这些页面不会被修改,因此换出时不必写回磁盘,下次需要时再从文件区调入即可。对于可能被修改的部分,换出时需写回磁盘对换区,下次需要时再从对换区调入。

​ 3.UNIX方式:运行之前进程有关的数据全部放在文件区,故未使用过的页面,都可从文件区调入。若被使用过的页面需要换出,则写回对换区,下次需要时从对换区调入。

抖动(颠簸现象)

​ 刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存,这种频繁的页面调度行为称为抖动,或颠簸。产生抖动的主要原因是进程频繁访问的页面数目高于可用的物理块数(分配给进程的物理块不够)

工作集

​ 工作集:指在某段时间间隔里,进程实际访问页面的集合。

与驻留集进行区分:

​ 驻留集:指请求分页存储管理中给进程分配的内存块的集合。

image-20240707210334030

​ 工作集大小可能小于窗口尺寸,实际应用中,操作系统可以统计进程的工作集大小,根据工作集大小给进程分配若干内存块。如:窗口尺寸为5,经过一段时间的监测发现某进程的工作集最大为3,那么说明该进程有很好的局部性,可以给这个进程分配3个以上的内存块即可满足进程的运行需要。

​ 一般来说,驻留集大小不能小于工作集大小,否则进程运行过程中将频繁缺页。

小结

image-20240707210604392

3.2.4内存映射文件

​ 内存映射文件:是操作系统向上层程序员提供的功能(系统调用)通过内存映射文件,程序员可以方便的访问文件数据,也可以方便多个进程共享同一个文件数据

image-20240708143120239

4.1.1文件管理

文件的属性:

​ 文件名:由创建文件的用户决定文件名,主要是为了方便用户找到文件,同一目录下不 允许有重名文件。
​ 标识符:一个系统内的各文件标识符唯一,对用户来说毫无可读性,因此标识符只是操 作系统用于区分各个文件的一种内部名称。
​ 类型:指明文件的类型
​ 位置:文件存放的路径(让用户使用)、在外存中的地址(操作系统使用,对用户不可见)
​ 大小:指明文件大小
​ 创建时间、上次修改时间文件所有者信息
​ 保护信息:对文件进行保护的访问控制信息

文件的分类:

​ 无结构文件:由二进制或者文字流组成
​ 有结构文件:由一组相似的记录组成(记录是一组相关数据项的集合)

​ 数据项是系统中最基本的数据单位

文件的组织

​ 系统通过目录的形式将各个文件组织起来

​ 用户可以自己创建一层层的目录,各层目录中存放相应的文件。系统中的各个文件就通过一层一层的目录合理有序的组织起来

​ 目录是一种特殊的有结构文件

操作系统向上层提供的功能

创建文件:create系统调用

读文件:read系统调用

写文件:write系统调用

删除文件:delete系统调用

打开文件:open系统调用

关闭文件:close系统调用

文件在外存的存放

与内存一样,外存也被分为一个一个的存储单元,每个存储单元对应一个物理地址

文件的逻辑地址也可以分为 逻辑块号和块内地址的形式。块内地址位数取决于磁盘块大小

操作系统以“块”为单位为文件分配存储空间外存中的数据读入内存时同样以块为单位

其他由操作系统实现的文件管理功能

文件共享:多个用户可以共享一个文件

文件保护:确保不同用户对文件 有不同的操作权限

image-20240708150639666

4.1.2文件的逻辑结构

​ 无结构文件:文件内部的数据就是一系列二进制流或字符流组成。又称“流式文件”。如:Windows操作系统中的.txt文件。

​ 有结构文件:由一组相似的记录组成,又称“记录式文件”。每条记录又若干个数据项组成。如:数据库表文件。一般来说,每条记录有一个数据项可作为关键字(作为识别不同记录的ID) 可以根据每条记录的长度是否相同分为定长记录 和 可变长记录两种。

有结构文件的逻辑结构
顺序文件

​ 顺序文件:文件中的记录一个接一个的顺序的排列,记录可以是定长的 或者是可变长的,各个记录在物理上可以顺序存储或者链式存储。

​ 按照顺序文件是都按照关键字排序,将顺序文件分为 串结构(记录的顺序与关键字无关)和顺序结构(记录的顺序按照关键字排序)两种

image-20240708154121825

​ 定长记录的顺序文件,如果物理上采用顺序存储则可以实现随机存取,如果还能保证记录的顺序结构,则可以实现快速检索。

​ 一般来说考试中所说的顺序文件 是指 物理上顺序存储的顺序文件。

索引文件

​ 索引文件:系统会对建立一张索引表,索引表每个索引项 对应文件中一条 记录。

​ 索引表本身可以看作是定长记录的顺序文件,因此可以快速找到第i个记录所对应的索引项

​ 每当要增加/删除一个记录时,需要对索引表进行修改。由于索引文件有很快的检索速度,因此主要用于对信息处理的及时性要求比较高的场合。

索引顺序文件

​ 是索引文件和顺序文件的结合,索引顺序文件中,同样会为文件建立起一张索引表,但不同的是,并不是每个记录对应一个索引表项,而是一组记录对应一个索引表项。

​ 为了进一步提高检索效率,还可以建立多级索引表

小结
image-20240708160058930 image-20240708160117365

4.1.3文件目录

文件控制块

目录文件中的一条记录就是一个文件控制块FCB,FCB中包含了文件的基本信息(文件名,物理地址,逻辑结构等)、存取控制信息(是否可读可写、禁止访问的用户等等)、使用信息(文件创建时间,修改时间)。

image-20240708161631689
目录结构
单级目录:

​ 整个系统中只建立一张目录表,每个文件占一个目录项。单级目录实现了按名存取但是不允许文件重名。单级目录结构不适用于多用户的操作系统。

两级目录结构

​ 分为主文件目录和用户文件目录。

​ 主文件目录记录用户名以及相应的用户文件目录存放的位置

​ 用户文件目录由该用户的文件FCB组成

​ 两级目录结构允许不同用户的文件重名,也可以在目录上实现实现访问限制(检查此时登录的用户名是否匹配)。但是两级目录结构依然缺乏灵活性,用户不能对自己的文件进行分类

多级目录结构(树形目录结构)

​ 用户(或用户进程)要访问某个文件时要用文件路径名标识文件,文件路径名是个字符串。各级目录之间用“/”隔开。从根目录出发的路径称为绝对路径。

​ 当用户想要访问某个文件时,可以使用从当前目录出发的“相对路径”。引入“当前目录”和“相对路径”后,磁盘I/o的次数减少了。这就提升了访问文件的效率。

​ 不同的目录下的文件可以重名。

​ 多级目录结构可以方便的对文件进行分类、管理和保护。但是不便于实现文件的共享,所以提出了无环图目录结构。

无环图目录结构

​ 在树形目录的基础上,增加了一些指向同一个节点的有向边,使整个目录成为一个有向无环图,可以更加方便的实现多个用户之间的文件共享

​ 可以用不同的文件名指向同一个文件,或者同一个目录

image-20240708164839858

​ 需要为每个共享结点设置一个共享计数器,用于记录此时有多少个地方在共享该结点。用户提出删除结点的请求时,只是删除该用户的FCB、并使共享计数器减1,并不会直接删除共享结点。只有共享计数器减为0才可以将文件真正删除

索引结点

​ 是对FCB的改进,在查找文件时只对文件名进行匹配,将除了文件名之外的信息都放到索引结点里来。

image-20240708165321242

​ FCB存放的信息

image-20240708165547718

​ 索引节点存放的信息

​ 当找到文件名对应的目录项时,才需要将索引结点调入内存,索引结点中记录了文件的各种信息,包括文件在外存中的存放位置,根据“存放位置”即可找到文件。

​ 存放在外存中的索引结点称为“磁盘索引结点”,当索引结点放入内存后称为“内存索引结点”。相比之下内存索引结点中需要增加一些信息,比如:文件是否被修改、此时有几个进程正在访问该文件等。

小结
image-20240708170224886

4.1.4文件的物理结构

	在外存管理过程中,为了方便对文件数据的管理,文件的逻辑地址也被分成了一个一个的文件块。于是文件的逻辑地址也可以表示成(逻辑块号、块内地址)的形式。
文件分配方式
连续分配

​ 连续分配方式要求每个文件在磁盘上占有一组连续的块。只需转换逻辑块号到物理块号就行,块内地址保持不变。

​ 物理块号=起始块号+逻辑块号

​ 优点:连续分配支持顺序访问和直接访问(随机访问);在顺序读取时速度最快。
​ 缺点:1.连续分配要求文件占用的磁盘块必须是连续,在文件拓展时不方便。
​ 2.会产生难以利用的磁盘碎片,存储空间利用率低

​ 文件的目录表中必须要记录文件的起始块号和文件的长度(占据几个块)

image-20240708174150277

链接分配

​ 链接分配方式采取离散分配的方式,可以为文件分配离散的磁盘块,分为隐式链接显示连接两种。

隐式链接

​ 隐式链接方式目录中需要记录文件存放的起始块号和结束块号,在扩充文件时需要增加结束块号的长度。

image-20240708175444560

​ 除了文件的最后个磁盘块之外,每个磁盘块中都会保存指向下一个盘块的指针,这些指针对用户是透明的。

​ 想要访问一个文件的第 i 块数据时, 需要按照链表顺序 依次读取 0 — i-1个内存块。需要 i+1次的磁盘 IO。

​ 优点:方便文件拓展;所有空闲的磁盘块都可以被利用,不会产生碎片问题,外存利用率高。

​ 缺点:隐式链接方式只支持顺序访问,不支持随机访问,查询效率低。另外指向另一个块的指针也会占用少量存储空间。

显示连接

​ 显示链接会把 用于链接各个块的指针 显示的存放到一张表中,即文件分配表 FAT。

​ 目录中只需要记录起始块号。

image-20240708180339546

​ 文件分配表记录着各个物理块号指向的下一个块,其中用-1表示这是块的最后一个。

image-20240708180357794

​ 一个磁盘仅设置一张FAT。开机时,将FAT读入内存,并常驻内存。FAT的各个表项在物理上连续存储,且每一个表项长度相同,因此“物理块号”字段可以是隐含的。

​ 在需要查询一个块时,先在目录中找到这个进程的第零个块,然后根据FAT,找到要查询的物理块存放在个物理块内。

​ FAT常驻内存内,故逻辑块号转换成物理块号的过程不需要读磁盘操作。

​ 优点:显式链接支持顺序访问,也支持随机访问(并不需要实际的访问之前的0—i-1号逻辑块),由于块号转换的过程不需要访问磁盘,因此相比于隐式链接来说,访问速度快很多。显式链接也不会产生外部碎片,也可以很方便地对文件进行拓展。
​ 缺点:显示链接采用的文件分配表FAT 会占用一定的存储空间。

如果题目只提到链接分配方式 默认认为是隐式链接方式

索引分配

​ 索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块(索引表的功能类似于内存管理中的页表—―建立逻辑页面到物理页之间的映射关系)。索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块。

image-20240708193808571

​ 采用索引分配,目录中需要记录文件的索引块是几号磁盘块

image-20240708193931769

​ 在显式链接的链式分配方式中,文件分配表FAT是一个磁盘对应一张。而索引分配方式中,索引表是一个文件对应一张。

​ 系统想要访问一个文件时,需要先在目录中找到这个文件对应的目录项,得到文件的索引块位置,然后在索引块中读出这个文件的索引表,然后根据索引表找到找的逻辑块号对应的物理块号,就可以访问物理块了。

​ 索引分配支持随机访问,文件的扩展也很容易实现。

​ 索引表需要占用一定的空间。

那么如果索引表占据存储空间太大,存储索引表的索引块无法存储索引表那么会怎么办呢

​ 1.链接方案:为这个索引表分配多个内存块,然后把内存块链接起来(用指针)。
​ 缺点:为了读取地址靠后的索引块,需要依次将前面的索引块装入内存, 然后根据指针读取后面的索引块,效率很低。
​ 2.多层索引:建立多层索引,类似于多级页表,使前一层索引块指向后一层索引块。

​ 如果采用K层索引结构,并且顶层索引结构还未调入内存,那么访问一个数据块只需要K+1次读磁盘操作

​ 如果一个文件非常小,但是系统采用了多层索引结构的方式,即使本来可能读取两次磁盘就可以完成,但是现在还是需要K+1次,为了解决这个问题提出 混合索引。

​ 3.混合索引:多种索引分配方式的结合。例如,一个文件的顶级索引表中,既包含直接地址索引(直接指向数据块),又包含一级间接索引(指向单层索引表)、还包含两级间接索引(指向两层索引表)。

image-20240708200950635

​ 若顶级索引表还没读入内存,读取0 ~ 7号 逻辑块需要读取两次磁盘,读取8~263号逻辑块需要三次读取磁盘,读取264 ~65799 需要四次读取磁盘。

​ 优点:小文件可以只占据前面几个小块,减少读取磁盘的次数

小结
image-20240708201503852

4.1.5文件存储空间管理

空闲表法

​ 系统采用一个空闲表记录那些磁盘是空闲的,当有多个连续的磁盘空闲时,只需记录第一个空闲的磁盘和此连续空闲磁盘的块数。

image-20240709145050041

​ 如何分配磁盘块:与内存管理中的动态分区分配很类似,为一个文件分配连续的存储空间。同样可采用首次适应、最佳适应、最坏适应等算法来决定要为文件分配哪个区间。

​ 如何回收磁盘块: 与内存管理中的动态分区分配很类似,当回收某个存储区时需要有四种情况—―①回收区的前后都没有相邻空闲区;②回收区的前后都是空闲区;③回收区前面是空闲区;④回收区后面是空闲区。总之,回收时需要注意表项的合并问题。

空闲链表法

​ 空闲链表法又可以进一步划分成 空闲盘块链(以盘块为单位组成空闲链)和空闲盘区链(以盘区为单位组成空闲链)

​ 空闲盘块连:将每个空闲的盘块(内存块)连接起来组成一条空闲链,系统会保存各个盘块链头和链尾的指针,在需要分配磁盘块时,系统会根据需要分配的磁盘块数量从链头开始分配,并且修改链头指针。在回收时,会将空闲的盘块链接到链尾,并修改链尾指针

​ 空闲盘区链:将各个空闲的盘区(连续的空闲块称为一个空闲盘区)连接组成一条空闲链分配可以采用首次适应、最佳适应等算法,从链头开始检索,按照算法规则找到一个大小符合要求的空闲盘区,分配给文件。若没有合适的连续空闲块,也可以将不同盘区的盘块同时分配给一个文件,注意分配后可能要修改相应的链指针、盘区大小等数据。回收时,若回收区和某个空闲盘区相邻,则需要将回收区合并到空闲盘区中。若回收区没有和任何空闲区相邻,将回收区作为单独的一个空闲盘区挂到链尾。

位示图法

​ 位示图:每个二进制位对应一个盘块。“0”代表盘块空闲,“1”代表盘块已分配。位示图一般用连续的“字”来表示,如本例中一个字的字长是16位,前16个磁盘块被放入字号为0的一组中。字中的每一位对应一个盘块。因此可以用(字号,位号)对应一个盘块号。当然有的题目中也描述为(行号,列号)

​ 重要重要重要;要能自己推出盘块号与(字号,位号〉相互转换的公式。注意题目条件:盘块号、字号、位号到底是从0开始还是从1开始

​ (字号,位号)= ( i , j) 的二进制位对应的盘块号b = n*i+j

​ 分配时可以根据位示图此从头扫描,找到相邻或不相邻的大小满足的 0。然后根据字号、位号算出对应的盘块号,将相应的盘块分配给文件,并将0 改为 1

​ 回收时,根据要回收的盘块号 计算处出 对应的字号、位号,将相应的二进制位设置为0

image-20240709150622986
成组链接法

​ 文件卷的目录区中专门用一个磁盘块作为“超级块”,当系统启动时需要将超级块读入内存。并且要保证内存与外存中的“超级块”数据一致。

​ 超级块中存放着 下一空闲块的信息,包括下一组空闲块个数和各个空闲块的块号

​ 记录的下一个空闲盘块中,也会记录自己的下一个空闲块个数和各个空闲块号的块号,但是剩余的除了超级块,其他的空闲块组都不会被放入内存。

​ 可以把倒数第二个盘块设置一个特殊值,表示下一个盘块已经是最后一个盘块了,最后一个盘块记录是少于其他组的盘块记录的(也许是不用记录下一个空闲块的信息了,不确定)

​ 磁盘块的分配:

​ 1.先检查超级块中指向的那个空闲组够不够分配,如果多与需要分配的数量的话,就把指向的空闲组空闲块从前按序分出去,并且把超级块中的分出去的空闲块删除,空闲块数量减去

​ 2.如果超级块指向的空闲组的空闲块数量和需要的数量相同,那么要把整个空闲组分配出去,并且把这个空闲组中记录的下一组空闲块的数据复制到超级块中,

​ 磁盘块的回收:

​ 1.如果超级块还没满并且可以容纳回收的磁盘数量,那么把这些磁盘号写入超级快并且修改空闲块数量。

​ 2.如果超级块已经满了或者装不下回收的磁盘数量,那么会新建一个块,并且把超级块中的数据放到新建的块中,然后把超级块中数据清空,把装不下的放入超级块,修改数量,空闲块中只有一个数据,就是新建的块。

image-20240709160247808
小结

image-20240709161955629

4.1.6文件的基本操作

创建文件:

​ 进行Create系统调用,需要提供一些参数

​ 1.所需外存的空间大小
​ 2.文件存放路径
​ 3.文件名

​ 操作系统主要操作

​ 1.在外存中找到文件所申请的空间
​ 2.根据文件的存放路径,找到该目录对应的目录文件,在目录文件中创建文件所 对应的目录项,包含文件名、文件外存存放位置等等。

删除文件:

​ 进行Delete系统调用,需要提供一些参数

​ 1.文件存放路径
​ 2.文件名

​ 操作系统主要操作

​ 1.根据文件存放路径找到相应的目录文件,从目录中找到文件名对应的目录项。
​ 2.根据目录项记录的文件在外存的存放位置,文件大小等信息,回收占用的磁盘块。
​ 3.从目录表中删除文件对应的目录项。

打开文件:

​ 进行Open系统调用,需要提供一些参数

​ 1.文件存放路径
​ 2.文件名
​ 3.要对文件的操作类型

​ 操作系统主要操作

​ 1.根据文件存放路径找到相应的目录文件,从目录中找到文件名对应的的目录 项,并检查该用户是否有指定的操作权限。
​ 2.将目录项复制到内存中的“打开文件表”中。并将对应表目的编号返回给用户。之 后用户使用打开文件表的编号来指明要操作的文件。

关闭文件

​ 操作系统主要操作

​ 1. 将进程的打开文件表相应表项删除
​ 2. 回收分配给该文件的内存空间等资源
​ 3. 系统打开文件表的打开计数器count 减1,若count =0,则删除对应表项。

读文件

​ 进行Read系统调用,需要提供一些参数
​ 1.要打开的文件索引
​ 2.读入数据大小
​ 3.读入的数据的存放位置

​ 操作系统主要操作

​ 从读指针指向的外存中,将用户指定大小的数据读入用户指定的内存区域中。

写文件

​ 进行Read系统调用,需要提供一些参数
​ 1.要写的文件索引
​ 2.要写多少数据
​ 3.存到外存什么位置

​ 操作系统主要操作
​ 会从用户指定的内存区域中,将指定大小的数据写回写指针指向的外存。

小结

image-20240709170313075

4.1.7文件共享

​ 多个用户共享同一个文件,意味着系统中只有“一份”文件数据。并且只要某个用户修改了该文件的数据,其他用户也可以看到文件数据的变化。

基于索引结点的共享方式(硬链接)

​ 由于检索文件时只需用到文件名,因此可以将除了文件名之外的其他信息放到索引结点中。这样目录项就只需要包含文件名、索引结点指针。

​ 不同用户的目录项中的索引结点指针指向同一个索引结点

image-20240709171214671

​ 索引结点中设置一个链接计数变量count,用于表示链接到本索引结点上的用户目录项数。若count =2,说明此时有两个用户目录项链接到该索引结点上,或者说是有两个用户在共享此文件。

​ 若某个用户决定“删除”该文件,则只是要把用户目录中与该文件对应的目录项删除,且索引结点的count值减1。
​ 若count>0,说明还有别的用户要使用该文件,暂时不能把文件数据删除,否则会导致指针悬空。
​ 当count =0时系统负责删除文件

基于符号链的共享方式(软链接)

​ 基于符号链的共享方式在 用户 想要共享的访问 一个文件时,用户会新建一个文件,这个新建的文件是Link类型文件,记录想要共享访问的文件的地址。在用户想要共享的访问 文件时,会根据新建的Link文件中的地址对 共享文件进行访问。

image-20240709172009654

​ 当把共享的文件1删除后,Link型文件依然会存在,但是再利用软连接的方式 通过文件2中的地址共享访问软件1时会失败,因为记录的路径再目录中找不到对应的目录项

小结
image-20240709172309725

4.1.8文件保护

口令保护

​ 为文件设置一个“口令”,用户请求访问该文件时必须提供“口令”。

​ 口令一般存放在文件对应的FCB或索引结点中。用户访问文件前需要先输入“口令”,操作系统会将用户提供的口令与FCB中存储的口令进行对比,如果正确,则允许该用户访问文件

​ 优点:保存口令的空间开销不多,验证口令的时间开销也很小。
​ 缺点:正确的“口令”存放在系统内部,不够安全。

加密保护

​ 使用某个“密码”对文件进行加密,在访问文件时需要提供正确的“密码”才能对文件进行正确的解密。

​ 比如:一个最简单的加密算法 异或加密 假设用于加密/解密的“密码”为“01001”,将文件的原始数据依次的和加密密码进行异或运算,系统中保存的并不是文件的原始数据,而是保存的文件加密之后的数据。

image-20240709174204816

​ 读取时把保存的结果与密码进行异或操作,就可以得到源文件

​ 优点:保密性强,不需要在系统中存储“密码”
​ 缺点:加密/解密要花费一定时间。

访问控制

​ 在每个文件的FCB(或索引结点)中增加一个访问控制列表,该表中记录了各个用户可以对该文件执行哪些操作。

image-20240709174609160

​ 有的计算机可能会有很多个用户,因此访问控制列表可能会很大,可以用精简的访问列表解决这个问题

​ 精简的访问列表:以“组”为单位,标记各“组”用户可以对文件执行哪些操作。如:分为系统管理员、文件主、其他用户几个分组。当某用户想要访问文件时,系统会检查该用户所属的分组是否有相应的访问权限。系统需要管理分组信息

image-20240709174834425

小结
image-20240709175045205

4.3.1文件系统的层次结构

image-20240710205058474 image-20240710212124520

4.3.2文件系统布局

文件系统外存:

​ 物理格式化:用于划分扇区,检测坏扇区,并用备用扇区替换坏扇区

​ 逻辑格式化:磁盘分区(分卷),完成各个分区的文件系统初始化

文件系统内存:

​ 内存分为用户区和内核区,内核区内有三个重要信息:目录的缓存(近期访问过的目录文件会被缓存在内存中)系统打开文件表(整个系统只有一个),用户打开文件表(每个进程都有一个)

4.3.3虚拟文件系统

​ 虚拟文件系统特点:
​ 1.向上层用户进程提供统一标准的系统调用接口,屏蔽底层具体文件系统的实现差异

	2.虚拟文件系统要求下层的文件系统必须实现某些规定的函数功能,如: open read 			write。一个新的文件系统想要在某操作系统上被使用,就必须满足该操作系统VFS			的要求

​ 3.每打开一个文件,VFS就在主存中新建一个vnode, 无论文件原来存储在哪个文件 系统,都会用统一的数据结构表示文件。不仅会把数据存储到vnode中,还会存储 函数功能指针。

image-20240710231110788
文件系统挂载

文件系统挂载要做的事:

​ 1. 在VFS中注册新挂载的文件系统。内存中的挂载表包含每个文件系统的相关信息, 包括文件系统类型、容量大小等。

​ 2. 新挂载的文件系统,要向VFS提供一个函数地址列表

​ 3. 将新文件系统加到挂载点( mountpoint) ,也就是将新文件系统挂载在某个父目 录下

5.1.1 I/O设备

​ I/O设备就是可以将数据输入到计算机,或者可以接收计算机输出数据的外部设备,属于计算机中的硬件部件。

​ Write操作:向外部设备写出数据

​ Read操作:从外部设备读入数据

I/O设备按照使用特性的分类

​ 人机交互类 外部设备:鼠标、键盘、打印机等等,用于人机交互数据传输速度较慢

​ 存储设备:移动硬盘、光盘等,用于存放数据数据传输速度快

​ 网络通信设备:调制解调器等,用于网络通信数据传输速度中等

按照传输速度分类

​ 低速设备:如鼠标键盘等,传输速率在 几个到几百个字节每秒

​ 中速设备:如激光打印机等,传输速率为每秒数千 至 上万个字节

​ 高速设备:如磁盘等,传输速率为 每秒数千字节 至 千兆字节的设备

按照信息交换的单位分类

​ 块设备:如磁盘等,数据传输的基本单位是块,特点:传输速率高,可寻址(可以任 随机读取/写 任意一块)

​ 字符设备:如鼠标键盘,数据传输的基本单位是字符,特点:传输速率较慢,不可寻 址,在输入输出时常常采用中断驱动的方式

image-20240711144408540

5.1.2 I/O控制器

​ I/O设备可以分为 机械部件和电子部件(I/O控制器、设备控制器)

​ I/O设备的机械部件主要用来执行具体I/O操作。如我们看得见摸得着的鼠标/键盘的按钮;显示器的LED屏;移动硬盘的磁臂、磁盘盘面。

​ I/O设备的电子部件通常是一块插入主板扩充槽的印刷电路板。

电子部件

​ 当I/O设备链接到电脑之后,CPU是无法直接对I/O设备的机械部件进行控制的,需要利用电子设备间接的对机械部件进行控制。这个电子设备就是I/O控制器,又叫做设备控制器。

I/O控制器的功能

​ 1.接受和识别CPU发出的命令:I/O控制器中有相应的控制寄存器,来存放命令和参数

​ 2.向CPU报告设备的状态:I/O控制器中有相应的状态寄存器,用于记录I/O设备当前状态

​ 3.数据交换:I/O控制器中会设置相应的数据寄存器。输出时,数据寄存器用于暂存CPU 发来的数据,之后由控制器传送到设备。输入时,数据寄存器用于暂存设备 发来的数据,之后CPU从数据寄存器中取走数据

​ 4.地址识别:类似于内存的地址,为了区分设备控制器中的各个寄存器,也需要给各 个寄存器设置一个特定的“地址”。I/O控制器通过CPU提供的“地址”来判 断CPU要读/写的是哪个寄存器。

I/O控制器的组成

image-20240711153143738
寄存器编址:

​ 一个I/O控制器可能会对应多个设备;

​ 数据寄存器、控制寄存器、状态寄存器可能有多个(如:每个控制/状态寄存器对应一个具体的设备),且这些寄存器都要有相应的地址,才能方便CPU操作。有的计算机会让这些寄存器占用内存地址的一部分,称为内存映像I/O;另一些计算机则采用I/O专用地址,即寄存器独立编址

image-20240711153626937image-20240711153546159

小结

image-20240711153812225

5.1.3 I/O控制方式

程序直接控制方式

完成一次读/写操作的流程:

image-20240711155212939

image-20240711155525649

​ 在I/O操作开始之前和完成之后需要CPU介入,并且在等待I/O完成的过程中CPU需要不断的轮询检查,所以CPU的干预很频繁。

​ 采用程序直接控制方式 每次读/写传送单位是 一个字

​ 数据流向: 读操作:I/O设备 --->CPU --->内存
​ 写操作:内存 ---->CPU ---->I/O设备

​ 优点:实现简单。在读/写指令之后,加上实现循环检查的一系列指令即可(因此才 称为“程序直接控制方式”)

​ 缺点:CPU和I/O设备只能串行工作,CPU需要一直轮询检查,长期处于“忙等”状 态,CPU利用率低。

中断驱动方式

​ 引入中断机制。由于I/O设备速度很慢,因此在CPU发出读/写命令后,可将等待l/O的进程阻塞,先切换到别的进程执行。当I/O完成后,控制器会向CPU发出一个中断信号,CPU检测到中断信号后,会保存当前进程的运行环境信息,转去执行中断处理程序处理该中断。处理中断的过程中,CPU从l/O控制器读一个字的数据传送到CPU寄存器,再写入主存。接着,CPU恢复等待I/O的进程(或其他进程)的运行环境,然后继续执行。

image-20240711160601112

​ 1.CPU会在每个指令周期的末尾检查中断

​ 2.中断处理过程中需要保存、恢复进程的运行环境,这个过程是需要一定时间开销 的。如果中断发生的频率太高,也会降低系统性能。

​ 每次I/O操作开始之前、完成之后需要CPU介入。CPU介入的频率比程序直接控制方式要低很多

每次读/写操作 传送单位是 一个字

​ 数据流向: 读操作:I/O设备 --->CPU --->内存
​ 写操作:内存 ---->CPU ---->I/O设备

​ 优点:与“程序直接控制方式”相比,在“中断驱动方式”中,I/O控制器会通过中断信 号主动报告I/O已完成,CPU不再需要不停地轮询。CPU和I/O设备可并行工 作,CPU利用率得到明显提升。

​ 缺点:每个字在I/O设备与内存之间的传输,都需要经过CPU。而频繁的中断处理会 消耗较多的CPU时间。

DMA方式(直接存储器存取)

​ 与“中断驱动方式”相比,DMA方式主要用于块设备的I/O控制

​ 1.数据的传送单位是“块”。不再是一个字、一个字的传送;

​ 2.数据的流向是从设备直接放入内存,或者从内存直接到设备。不再需要经过CPU

​ 3.仅在传送一个或多个数据块的开始和结束时,才需要CPU干预,CPU干预频率大 幅度降低

image-20240711165022709 image-20240711165235677

​ 每次读/写操作 数据传送的单位为一个块或多个块(每次读写的只能是连续的块,且这些块读入内存后在内存中也必须是连续的

​ 数据流向: 读操作:I/O设备 ---> 内存
​ 写操作:内存 ---> I/O设备

​ 优点:数据传输以“块”为单位,CPU介入频率进一步降低。数据的传输不再需要先经过CPU再写入内存,数据传输效率进一步增加。CPU和/O设备的并行性得到提升。

​ 缺点:CPU每发出一条I/o指令,只能读/写一个或多个连续的数据块。如果要读/写多个离散存储的数据块,或者要将数据分别写到不同的内存区域时,CPU要分别发出多条I/O指令,进行多次中断处理才能完成。

通道控制方式

​ 通道:一种硬件,可以识别并执行一系列的通道指令。

image-20240711170050232 image-20240711170129620

​ CPU干预的频率极低,通道会根据CPU的指示执行相应的通道程序,只有完成一组数据块的读/写后才需要发出中断信号,请求CPU干预。

​ 数据传送的单位每次读/写一组数据块

​ 数据流向: 读操作:I/O设备 ---> 内存
​ 写操作:内存 ---> I/O设备

​ 优点:CPU、通道、1/O设备可并行工作,资源利用率很高。
​ 缺点:实现复杂,需要专门的通道硬件支持

对比
image-20240711170412126

5.1.4I/O软件层次结构

image-20240711193649202
用户层软件

​ 向用户提供一些简单易用的接口,用户可直接使用该层提供的、与I/O操作相关的库函数对设备进行操作。用户层软件将用户请求翻译成格式化的I/O请求,并通过“系统调用”请求操作系统内核的服务

设备独立性软件

​ 设备独立性软件:又称设备无关性软件。与设备的硬件特性无关的功能几乎都在这一层实现。

​ 主要实现的功能:

​ 1.向上层提供统一的调用接口(如read/write系统调用)
​ 2.设备的保护(原理类似于文件保护)
​ 3.差错处理(对一些设备的错误进行处理)
​ 4.设备的分配与回收
​ 5.数据缓冲区管理:通过缓冲技术屏蔽设备间数据交换单位大小和传输速率的差异
​ 6.建立逻辑设备名到物理设备名的映射关系,根据设备类型选择调用相应的驱动程 序(设备独立性软件需要通过 逻辑设备表 来确定逻辑设备对应的物理设备,并 找到该设备对应的 设备驱动程序)

​ 操作系统系统可以采用两种方式管理逻辑设备表(LUT):
​ 一、:整个系统只设置一张LUT,这就意味着所有用户不能使用相同的逻辑设 备名,因此这种方式只适用于单用户操作系统。

​ 二、:为每个用户设置一张LUT,各个用户使用的逻辑设备名可以重复,适用 于多用户操作系统。系统会在用户登录时为其建立一个用户管理进程,而LUT 就存放在用户管理进程的PCB中。

设备驱动程序

​ 主要负责对硬件设备的具体控制,将上层发出的一系列命令(如read/write)转化成特定设备“能听得懂”的一系列操作。包括设置设备寄存器;检查设备状态等

​ 不同的I/o设备有不同的硬件特性,具体细节只有设备的厂家才知道。因此厂家需要根据设备的硬件特性设计并提供相应的驱动程序。

​ 驱动程序一般会以一个独立进程的方式存在。

中断处理程序

​ 当I/O任务完成时,I/O控制器会发送一个中断信号,系统会根据中断信号类型找到相应的中断处理程序并执行。

​ 中断处理程序的处理流程:

image-20240711210116910

image-20240711210300855

5.1.5输入输出应用程序接口 和 驱动程序接口

​ 输入输出应用程序接口分为 字符设备接口块设备接口网络设备接口

​ 字符设备接口:get/put 系统调用:向字符设备读/写个字符

​ 网络设备接口:又称“网络套接字接口”,socket系统调用:创建一个网络套接字,需指 明网络协议 bind:将套接字绑定到某个本地“端口’,connect:将套接字 连接到远程地址read/write:从套接字读/写数据。

​ 块设备接口:read/write系统调用;向块设备的读写指针位置读/写多个字符,seek 统调用:修改读写指针位置

阻塞I/O和非阻塞I/O

​ 阻塞I/O:应用程序发出/o系统调胁进程需转为阻塞态等待。eg:字符设备接口――从键 盘读一个字符get

​ 非阻塞I/O:应用程序发出I/o系统调用,系统调用可迅速返回,进程无需阻塞等待。 eg:块设备接口―一往磁盘写数据write

image-20240712170339300

5.2.1I/O核心子系统

image-20240712170513121
假脱机技术

​ 批处理操作中引入了脱机技术(用磁带完成),脱机技术是脱离了主机控制进行的输入/输出操作。

​ 根据脱机技术,人们发明了假脱机技术,用软件的方法模拟脱机技术。

image-20240712174353191
利用假脱机技术实现打印机共享

image-20240712175842593

image-20240712175651636

SPOOLing技术可以把一台物理设备虚拟成逻辑上的多台设备,可将独占式设备改造成共享设备。

小结
image-20240712175943257

5.2.3设备分配与回收

​ 进行设备分配时应该考虑的因素:设备的固有属性,设备分配算法,设备分配中的安全性。

​ 设备的固有属性可以分为三种:独占设备共享设备虚拟设备

​ 独占设备:一个时段只能分配给一个进程(如打印机)
​ 共享设备:可同时分配给多个进程使用(如磁盘),各进程往往是宏观上同时共享 使用设备,而微观上交替使用。
​ 虚拟设备:采用SPOOLing 技术将独占设备改造成虚拟的共享设备,可同时分配给 多个进程使用(如采用SPOOLing技术实现的共享打印机)

​ 设备的分配算法先来先服务算法短任务优先算法优先级算法、、、

​ 从设备的安全性考虑:设备有两种分配方式:安全分配方式不安全分配方式

​ 安全分配方式:为进程分配一个设备后就将进程阻塞,本次I/O完成后才将进程唤醒 一个时间段内每个进程只能使用一个设备。
​ 优点:破坏了“请求和保持”条件,不会产生死锁
​ 缺点:对一个进程来说,CPU和I/O只能串行工作

​ 不安全分配方式:进程发出I/O请求后,系统为其分配I/O设备,进程可继续执行, 之后还可以发出新的I/O请求。只有某个1/o请求得不到满足时才 将进程阻塞。
​ 优点:进程的计算任务和I/o任务可以并行处理,使进程迅速推进
​ 缺点:有可能发生死锁(死锁避免、死锁的检测和解除)

设备分配管理中的数据结构

设备控制表(DCT):系统为每个设备配置一张DCT,用于记录设备情况

image-20240712215909395

控制器控制表(COCT):每个设备控制器都会对应一张COCT。操作系统根据COCT的信息 对控制器进行操作和管理。

image-20240712221434357

通道控制表(CHCT):每个通道都会对应一张CHCT.操作系统根据CHCT的信息对通道进行 操作和管理。

image-20240712221623223

系统设备表(SDT):记录了系统中全部设备的情况,每个设备对应一个表目。

image-20240712221706790

一个通道可控制多个设备控制器,每个设备控制器可控制多个设备。

image-20240712221826215

设备分配的步骤

​ 1:根据进程请求的物理设备名查找SDT(注:物理设备名是进程请求分配设备时提供的参数)
​ 2:根据SDT找到DCT,若设备忙碌则将进程pCB挂到设备等待队列中,不忙碌则将设备分配给进程。
​ 3:根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程。
​ 4:根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程。

缺点:①用户编程时必须使用“物理设备名”,底层细节对用户不透明,不方便编程
②若换了一个物理设备,则程序无法运行
③若进程请求的物理设备正在忙碌,则即使系统中还有同类型的设备,进程也必须阻 塞等待

改进方法:建立逻辑设备名与物理设备名的映射机制,用户编程时只需提供逻辑设备名

改进之后的步骤:

​ 1、根据进程请求的逻辑设备名查找SDT(注:用户编程时提供的逻辑设备名其实就 是“设备类型”)
​ 2、查找SDT,找到用户进程指定类型的、并且空闲的设备,将其分配给该进程。操 作系统在逻辑设备表(LUT)中新增一个表项。
​ 3、根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌 则将控制器分配给进程。|
​ 4、根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则 将通道分配给进程。

逻辑设备表的设置问题:
1、整个系统只有一张LUT:各用户所用的逻辑设备名不允许重复,适用于单用户操作 系统。
2、每个用户一张LUT:不同用户的逻辑设备名可重复,适用于多用户操作系统。

小结

image-20240712224250235

5.2.4缓冲区

​ 缓冲区是一个存储区域,可以由专门的硬件寄存器组成,也可利用内存作为缓冲区。

​ 使用硬件作为缓冲区的成本较高,容量也较小,一般仅用在对速度要求非常高的场合(如存储器管理中所用的联想寄存器(快表),由于对页表的访问频率极高,因此使用速度很快的联想寄存器来存放页表项的副本)

​ 一般情况下,更多的是利用内存作为缓冲区,“设备独立性软件”的缓冲区管理就是要组织管理好这些缓冲区

缓冲区的作用

​ 1.缓和CPU与I/O设备之间速度不匹配的矛盾

​ 2.减少对CPU的中断频率,放宽对CPU中断相应时间的限制

​ 3.解决数据粒度不匹配的问题

​ 4.提高CPU与I/O设备之间的并行性

缓冲区管理策略
单缓冲

​ 假设某用户进程请求某种块设备读入若干块的数据。若采用单缓冲的策略,操作系统会在主存中为其分配一个缓冲区(若题目中没有特别说明,一个缓冲区的大小就是一个块)。

​ 当缓冲区数据非空时,不能往缓冲区冲入数据,只能从缓冲区把数据传出;当缓冲区为空时,可以往缓冲区冲入数据,但必须把缓冲区充满以后,才能从缓冲区把数据传出。

image-20240713085220311

单缓冲处理一块数据的平均时间

假设初始状态为工作区满,缓冲区空

​ 1、若 T>C ,开始时块设备输入数据和CPU处理数据同时开始,在CPU处理完数据后,块 设备还在向缓冲区输入数据,输入完成后需要向工作区传送数据,然后此时才能达 到初始状态:工作区满,缓冲区空。时间为T+M

image-20240713085659404

​ 2、若 T<C,开始时块设备输入数据和CPU处理数据同时开始,在块设备向缓冲区输入完数据后,CPU还在处理工作区内的数据,此时不能向工作区传输数据,等到处理完成才可以传输。然后此时才能达到初始状态:工作区满,缓冲区空。时间为C+M。

image-20240713090032466

双缓冲

​ 假设某用户进程请求某种块设备读入若干块的数据。若采用双缓冲的策略,操作系统会在主存中为其分配两个缓冲区(若题目中没有特别说明,一个缓冲区的大小就是一个块)

image-20240713092143589

双缓冲处理一块数据的平均时间

假设初始状态为:工作区空,其中一个缓冲区满,另一个缓冲区空

​ 1、若T>C+M:开始时,块设备输入数据和缓冲区传输数据同时进行,缓冲区花费M 时间传送数据,然后CPU处理数据,此时块设备输入数据还没完成。 等到输入完成才能达到初始状态:工作区空,一个缓冲区满,另一个 缓冲区空。时间为T。

image-20240713092904450

​ 2、若T<C+M:开始时,块设备输入数据和缓冲区传输数据同时进行,缓冲区花费M
​ 时间传送数据,然后CPU处理数据,在CPU处理过程中,块设备输入 已经完成,但是无法向块设备传送数据,并且会向另一个缓冲区输入 数据,于是并能找到一个状态与初始状态相同。处理一个数据块的平 均耗时为C+M。

image-20240713093724500

​ 结论:采用双缓冲策略,处理一个数据块的平均耗时为Max (T, C+M)

区别

​ 若两个相互通信的机器只设置单缓冲区,在任一时刻只能实现数据的单向传输。

image-20240713093925500

​ 若两个相互通信的机器设置双缓冲区,则同一时刻可以实现双向的数据传输。

image-20240713094045338

循环缓冲区

​ 将多个大小相等的缓冲区链接成一个循环队列。

image-20240713094733672

缓冲池

​ 缓冲池由系统中共用的缓冲区组成。这些缓冲区按使用状况可以分为:空缓冲队列、装满输入数据的缓冲队列(输入队列)、装满输出数据的缓冲队列(输出队列)。

​ 另外,根据一个缓冲区在实际运算中扮演的功能不同,又设置了四种工作缓冲区:用于收容输入数据的工作缓冲区(hin)、用于提取输入数据的工作缓冲区(sin)、用于收容输出数据的工作缓冲区(hout) 、用于提取输出数据的工作缓冲区(sout)

image-20240713095111345

小结
image-20240713095238974

5.3.1磁盘

​ 磁盘的表面由一些磁性物质组成,可以用这些磁性物质来记录二进制数据

​ 磁盘的盘面被划分成一个个磁道。

​ 一个磁道被划分成一个个扇区,每个扇区就是一个磁盘块,各个扇区存放的数据量相同

​ 由于每个磁道上存放到数据量是相同的,但是最内侧的磁道面积最小,故最内侧磁道 的数据密度最大

如何在磁盘中读/写数据

​ 需要把“磁头”移动到想要读/写的扇区所在的磁道。
​ 磁盘会转起来,让目标扇区从磁头下面划过,才能完成对扇区的读/写操作。

image-20240713100020231

磁盘的物理地址:

​ 一个磁盘可能是由很多个盘面叠加起来的

image-20240713100322530

​ 所有盘面中相对位置相同的磁道组成柱面

​ 故可用(柱面号,盘面号,扇区号)来定位任意一个“磁盘块”。

可根据该地址读取一个“块”

1.根据“柱面号”移动磁臂,让磁头指向指定柱面;
2.激活指定盘面对应的磁头;
3.磁盘旋转的过程中,指定的扇区会从磁头下面划过,这样就完成了对指定扇区的读/写。

磁盘分类

​ 磁头可以移动的称为活动头磁盘。磁臂可以来回伸缩来带动磁头定位磁道

​ 磁头不可移动的称为固定头磁盘,这种磁盘中每个磁道有一个磁头

​ 盘片可以更换的称为可换盘磁盘

​ 盘片不可更换的称为固定盘磁盘

小结
image-20240713102400792

5.3.2磁盘调度算法

寻找时间(寻道时间)Ts:在读/写数据前,将磁头移动到指定磁道所花的时间。
​ ①启动磁头臂是需要时间的。假设耗时为s;
​ ②移动磁头也需要时间:假设磁头匀速移动,每跨越一个磁道耗时为m,总共需 要跨越n条磁道 需要花费的时间为 n * m
​ 寻道时间Ts= s + m*n

延迟时间TR:通过旋转磁盘,使磁头定位到目标扇区所需要的时间。设磁盘转速为 r(单位:转/秒或转/分),则平均所需的延迟时间 TR=(1/2)*(1/r)= 1/2r
​ (1/r是转一圈需要的时间,找到目标扇区平均需要转半圈,故再乘1/2)

传输时间Tt:从磁盘读出或向磁盘写入数据所经历的时间,假设磁盘转速为r,此次 读/写的字节数为b,每个磁道上的字节数为N。则:传输时间T=(1/r)* (b/N) = b/(rN) | 1/r表示转一圈的时间,b/n表示需要几个磁盘存 储数据。

​ 延迟时间和传输时间与硬盘的转速有关,是硬件的固有属性,操作系统无法进行优化,操作系统可以优化的是寻道时间。

磁盘调度算法
先来先服务算法(FCFS)

​ 根据进程请求访问磁盘的先后顺序进行调度

image-20240714084322436

image-20240714084515203
优点:公平;如果访问的磁道比较集中,性能较好
缺点:如果有大量的进程使用磁盘,并且请求访问的磁道很分散,那么性能很差, 寻道时间长。

最短寻找时间优先(SSTF)

​ SSTF算法会优先处理与当前磁头最近的磁道可以保证每次的寻道时间最短、但是并不能保证总的寻道时间最短。(其实就是贪心算法的思想,只是选择眼前最优,但是总体未必最优)

image-20240714084854221

image-20240714084905893 image-20240714084925409
​ 优点:性能较好,平均寻道时间短。
​ 缺点:可能产生饥饿(如果一直来比较近的磁道请求,那么磁头会在一个小范围 内来回移动,比如 18 38 17 39 18 38 .... ,远的磁道会饥饿)。

扫描算法

​ 为了防止磁头在一个 小范围内来回移动产生饥饿的现象,扫描算法规定只有磁头移动到最外侧或者最内侧才可以改变方向

image-20240714090012987 image-20240714090418387

image-20240714090450299

​ 优点:性能较好,平均寻道时间较短,不会产生饥饿现象
​ 缺点:1.只有到达边缘之后才会掉头(184右边无需处理)
​ 2.对各个位置磁道响应频率不均匀(中间的90号磁道响应过一次后很久才能再 次被响应,但是边缘的184号磁道很快就可以响应两次)

LOOK调度算法

​ 为了处理扫描算法中 只有到边缘才会掉头的缺点,LOOK调度算法规定如果磁头的运行方向上已经没有别的请求了,那么磁头就可以立即调转方向。

image-20240714091111102

image-20240714091252962

循环扫描算法 C-SCAN

​ 为了处理SCAN算法对各个磁道响应频率不平均的问题,C-SCAN算法规定,只有磁头朝某个特定方向移动时才会处理磁道访问请求,而返回时直接快速移动不处理任何请求。

image-20240714091833364 image-20240714091822835

image-20240714091903283

​ 优点:比起SCAN算法,各个位置磁道响应频率很均匀
​ 缺点:需要移动到边界才能改变磁头方向,返回时也需要返回到边界;平均寻道时 间更长

C-LOOK算法

​ 为了解决C-SCAN算法 只有到达 边界时才能改变磁头移动方向,并且磁头返回时不一定需要返回到最边缘的磁道上。C-LOOK算法规定:如果磁头移动的方向上已经没有磁道访问请求了,就可以立即让磁头返回,并且磁头只需要返回到有磁道访问请求的位置即可。

image-20240714092319361

image-20240714092515844

image-20240714092532377

​ 优点:比起C-SACN算法来说,无需移动到边界,缩短了寻道时间

小结

image-20240714092929784

5.3.3减少磁盘延迟时间的方法

​ 延迟时间:将扇区旋转到磁头下面所需要的时间

​ 磁头再读取完成一个扇区之后需要 花费时间处理读取内容,不能立即读取下一扇区内容,如果两个扇区相邻排列,读取完成第一个之后无法接着读第二个,但是磁盘依然不停旋转,所以会错过第二个扇区,只有再转回来才可以读取

​ 结论:磁头读入一个扇区数据后需要一小段时间处理,如果逻辑上相邻的扇区在物理上也相邻,则读入几个连续的逻辑扇区,可能需要很长的“延迟时间”

交替编号

​ 采用交替编号的策略,即让逻辑上相邻的扇区在物理上有一定的间隔,可以使读取连续的逻辑扇区所需要的延迟时间更小。

image-20240714093529391

错位命名

​ 盘面是一个一个叠加起来的,如果上一个盘面的编号与下一个盘面的编号一样,那么读取同一柱面的磁盘时,先读取上面盘面的数据,完成后应该读取下一盘面的数据,但是需要花费时间处理读取内容,那么下一个盘面磁头现在指向的磁盘不能读取,需要等再转一圈划过磁头。为了能够解决读完一个扇面到读 下一个扇面能尽快读取的问题,将上下不同的扇面采用错位命名的方法。 (第一层盘面的0号磁盘正下方是下一层盘面的7号磁盘)

image-20240714100110146

小结
image-20240714100803532

5.3.4磁盘管理

磁盘初始化:

​ 1:进行低级格式化(物理格式化),将磁盘的各个磁道划分为扇区。一个扇区通常可分为头、数据区域、尾三个部分组成。管理扇区所需要的各种数据结构一般存放在头、尾两个部分,包括扇区校验码(如奇偶校验、CRC循环冗余校验码等,校验码用于校验扇区中的数据是否发生错误)

​ 2:将磁盘分区,每个分区由若干柱面组成(即分为我们熟悉的c盘、D盘、E盘)

​ 3:进行逻辑格式化,创建文件系统。包括创建文件系统的根目录、初始化存储空间管理所用的数据结构(如位示图、空闲分区表)

坏块

​ 故障、无法使用的扇区就是坏块,属于硬件故障,操作系统无法修复。

​ 对于简单的磁盘,可以在逻辑格式化时(建立文件系统时)对整个磁盘进行坏块检查,标明哪些扇区是坏扇区,比如:在 FAT表上标明。(在这种方式中,坏块对操作系统不透明)

​ 对于复杂的磁盘,磁盘控制器(磁盘设备内部的一个硬件部件)会维护一个坏块链表。在磁盘出厂前进行低级格式化(物理格式化)时就将坏块链进行初始化。磁盘控制器会保留一些“备用扇区”,用于替换坏块。这种方案称为扇区备用。且这种处理方式中,坏块对操作系统透明。

小结

image-20240714102357559

5.3.5固态硬盘

​ 固态硬盘以页为单位进行读取

​ 固态硬盘以块为单位进行擦除(如果向保留块中的某些页的数据,需要把这些页先放到其他块中,再进行擦除,并且由闪存翻译层将映射改为新的地址映射)

image-20240714103011164

​ 固态硬盘的一个"块"被擦除次数过多(重复写同一个块)可能会坏掉,而机械硬盘的扇区不会因为写的次数太多而坏掉。于是采用磨损均衡技术,将擦除 平均分配到各个块上。

​ 磨损均衡技术分为动态磨损均衡和静态磨损均衡

​ 动态磨损均衡:写数据时优先选择累计擦除次数少的闪存块,降低损坏率。
​ 静态磨损均衡:SSD监测并自动进行数据分配、迁移,让老旧的闪存块承担以读为主 的储存任务,让较新的闪存块承担更多的写任务

image-20240714104044040

image-20240714104113939

小结
image-20240714104231925
posted @ 2024-07-14 11:40  小花护符  阅读(2)  评论(0编辑  收藏  举报