OS设备管理

设备管理

image-20231116092249329

操作系统作为系统资源的管理者,其提供的功能有:处理机管理、存储器管理、文件管理、设备管理。其中前三个管理都是在计算机的主机内部管理其相对应的硬件。

I/O设备

I/O即输入/输出。I/O设备即可以将数据输入到计算机,或者可以接收计算机输出数据的外部设备,属于计算机中的硬件部件。输入型设备例如,键盘与鼠标;输出型设备又例如显示器。而移动硬盘则为即可以输入、又可以输出的设备。

UNIX系统将从外部设备抽象为一种特殊的文件,用户可以使用与文件操作相同的方式对外部设备进行操作。

write操作:向外部设备写出数据。

read操作:从外部设备读入数据。

设备分类——按使用特性

分为三种类型:人机交互类外部设备、存储设备、网络通信设备。

人机交互类外部设备

例如鼠标、键盘、打印机等,用于人机交互的设备。这类设备的数据传输速度很慢,一般为字节或几十字节为单位的传输速率。

image-20231116143642042

存储设备

例如移动硬盘、光盘等,用于数据存储的设备,一般这类设备的传输速度比较快。

image-20231116143808171

网络通信设备

例如安装宽带时的光猫,调制解调器等,用于网络通信的设备,这类设备的传输速度介于人机交互类设备与存储设备二者之间。

image-20231116144110606

设备分类——按传输速率分类

分为三种类型:低俗、中速、高速设备。

低速设备

鼠标、键盘等,其传输速率为每秒几个至几百字节。

image-20231116144207926

中速设备

如激光打印机,这类设备的传输速率为每秒数千至上万字节。

image-20231116144247456

高速设备

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

image-20231116144406152

设备分类——按信息交换的单位分类

分为两类:块设备、字符设备。

块设备

例如磁盘等,数据传输的基本单位为“块”的设备,这类设备的传输速率较高。可寻址,即对它可随机地读/写任一块。

image-20231116144406152

字符设备

如鼠标、键盘等,数据传输的基本单位为字节(符)的设备,这类设备的传输速率较慢,不可寻址,在输入/输出时常采用中断驱动的方式。

image-20231116144207926

I/O控制器

I/O设备由机械部件与电子部件组成。

机械部件

I/O设备的机械部件主要用来执行具体I/O操作。例如鼠标/键盘的按钮,显示屏的LED屏幕,移动硬盘的磁臂、磁盘盘面。

电子部件

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

CPU无法直接控制I/O设备的机械部件,因此I/O设备还要有一个电子部件作为CPU和I/O设备机械部件之间的“中介”,用于实现CPU对设备的控制。

这个电子部件就是I/O控制器,又称为设备控制器。CPU可控制I/O控制器,又由I/O控制器来控制设备的机械部件。

功能

  1. 接受和识别CPU发出的命令:例如CPU发来的 read/write 命令,I/O控制器中会有相应的控制寄存器来存放命令和参数。
  2. 向 CPU 报告设备的状态:I/O控制器中会有相应的状态寄存器,用于记录I/O设备的当前状态。例如,1表示空闲,0表示忙碌。
  3. 数据交换:I/O控制器中会设置相应的数据寄存器。输出时,数据寄存器用于暂存CPU发来的数据,之后再由控制器传送设备。输入时,数据寄存器用于暂存设备发来的数据,之后 CPU 从数据寄存器中取走数据。
  4. 地址识别:类似于内存的地址,为了区分设备控制器中的各个寄存器,也需要给各个寄存器设置一个特定的“地址”。I/O控制器通过 CPU 提供的 “地址” 来判断CPU要读/写的是哪个寄存器。

组成

image-20231116151739243

注意:① 一个 I/O 控制器可能会对应多个设备。

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

内存映射I/O

内存映射I/O,控制器中的寄存器与内存地址统一编址。

image-20231116152443384

这种方式简化了指令,可以采用对内存进行操作的指令来对控制器进行操作。

寄存器独立编址

寄存器独立编址,控制器中的寄存器使用单独的地址。

image-20231116152732561

这种方式需要设置专门的指令来实现对控制器的操作,不仅要指明寄存器的地址,还要指明控制器的编号。

I/O控制方式

计算机系统与外部设备之间进行数据输入和输出的方法和规则。I/O控制方式的选择对于计算机系统的性能和效率具有重要影响。分为了下面的四种:程序直接控制方法、中断驱动方式、DMA方式、通道控制方式。

程序直接控制方式

  1. 完成一次读/写操作的流程(以读操作为例)

① CPU 向控制器发出读指令。于是设备启动,并且状态寄存器设为 1(未就绪)

② 轮询检查控制器的状态(其实就是在不断地执行程序的循环,若状态位一直是1,说明设备还没准备好要输入的数据,于是CPU会不断地轮询)

③ 输入设备准备好数据后将数据传给控制器,并报告自身状态

④ 控制器将输入的数据放到数据寄存器中,并将状态改为0(已就绪)

⑤ CPU 发现设备已就绪,即可将数据寄存器中的内容读入 CPU 的寄存器中,再把 CPU 寄存器中的内容放入内存。

⑥ 若还要继续读入数据,则 CPU 继续发出读指令

image-20231116180241230

此方式CPU干预频率很频繁,I/O操作开始之前、完成之后需要 CPU 介入,并且在等待I/O完成的过程中CPU需要不断地轮询检查。

数据传送的单位是每次读/写一个字。

数据的流向:读操作(数据输入):I/O设备 —> CPU —> 内存

写操作(数据输出):内存 —> CPU —> I/O设备

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

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

中断驱动方式

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

image-20231116210928150

每次I/O操作开始之前、完成之后需要CPU介入。等待I/O完成的过程中CPU可以切换到别的进程执行。

数据传送的单位、数据的流向与程序直接控制方式一样。

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

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

注意:① CPU会在每个指令周期的末尾检查中断;

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

DMA方式

DMA(Direct Memory Access)方式,即直接存储器存取,主要用于块设备的I/O控制,其对于“中断驱动方式”有以下的改进:

① 数据传送单位是“块”,而不再是逐个字的传送。

② 数据的流向是从设备直接放入内存,或者从内存直接到设备。不再需要CPU当中转站。

③ 仅在传送一个或多个数据块的开始和结束时,才需要CPU干预。

image-20231116212426466

CPU指明此次要进行的操作(如:读操作),并说明要读入多少数据、数据要存放在内存的什么位置、数据在外部设备上的地址(如:在磁盘上的地址)。

控制器会根据CPU提出的要求完成数据的读/写工作,整块数据的传输完成后,才向CPU发出中断信号。

image-20231116213408626

DR(Data Register,数据寄存器):暂存从设备到内存,或从内存到设备的数据。

MAR(Memory Address Register,内存地址寄存器):在输入时,MAR 表示数据应放到内存中的什么位置;输出时 MAR 表示要输出的数据放在内存中的什么位置。

DC(Data Counter,数据计数器):表示剩余要读/写的字节数。

CR(Command Register,命令/状态寄存器):用于存放CPU发来的I/O命令,或设备的状态信息。

该方式仅在传送一个或多个数据块的开始和结束时,才需要CPU干预。

每次读/写一个或多个块(注意:每次读写的只能是连续的多个块,且这些块读入内存后在内存中也必须是连续的)。

而数据的流向则不需要经过CPU,实现内存与I/O设备的直接操作。

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

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

通道控制方式

通道是一种硬件,可以理解为是“弱化版的CPU”,通道可以识别并执行一系列通道指令。

image-20231117092700896

通道与CPU相比,通道可以执行的指令很单一,并且通道程序是放在主机内存中的,也就是说通道与CPU共享内存。

image-20231117092823134

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

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

在通道的控制下,数据的流向依旧是I/O设备与内存之间相互流通。

优点:CPU、通道、I/O设备可并行工作,资源利用率很高。

缺点:实现复杂,需要专门的通道硬件支持。

image-20231117101327364

I/O软件层次结构

如图,I/O软件的层次可以如下进行划分:

image-20231117103120188

其中的设备独立性软件、设备驱动程序、中断处理程序是属于操作系统的内核部分,即“I/O系统”,或称“I/O核心子系统”。

越往上面的层次越接近用户,越往下面的层次越接近硬件。

每一层会利用其下层提供的服务,实现某些功能,并屏蔽实现的具体细节,向高层提供服务(封装的思想)。

用户层软件

在用户层软件实现了与用户交互的接口,用户可直接使用该层提供的、与I/O操作相关的库函数对设备进行操作。

用户层软件将用户请求翻译成格式化的I/O请求,并通过“系统调用”请求操作系统内核的服务。

Windows 操作系统向外提供的一系列系统调用,但是由于系统调用的格式严格,使用麻烦,因此在用户层上封装了一系列更方便的库函数接口供用户使用(Windows API)

设备独立性软件

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

主要实现的功能:

① 向上层提供统一的调用接口(例如 read/write 系统调用)

② 设备保护 (原理类似与文件保护。设备被看做是一种特殊的文件,不同用户对各个文件的访问权限是不一样的,同理,对设备的访问权限也不一样)

③ 差错处理 (设备独立性软件需要对一些设备的错误进行处理)

④ 设备的分配与回收

⑤ 数据缓冲区管理 (可以通过缓冲技术屏蔽设备之间数据交换单位大小和传输速度的差异)

⑥ 建立逻辑设备名到物理设备名的映射关系;根据设备类型选择调用相应的驱动程序(用户或用户层软件发出I/O操作相关系统调用的系统调用时,需要指明此次要操作的I/O设备的逻辑设备名。例如当有多台打印机时,打印文件时需要按名字选择使用哪一台打印机,其实这些名字就是逻辑设备名)

设备独立性软件需要通过 “逻辑设备表(LUT, Logical Unit Table )” 来确定逻辑设备对应的物理设备,并找到该设备对应的设备驱动程序。

image-20231117110628473

I/O设备被当做一种特殊的文件,不同类型的I/O设备需要有不同的驱动程序处理。

操作系统系统可以采用两种方式管理逻辑设备表(LUT) :

第一种方式,整个系统只设置一张LUT,这就意味着所有用户不能使用相同的逻辑设备名,因此这种方式只适用于单用户操作系统。

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

设备驱动程序

不同设备的内部硬件特性也不同,这些特性只有厂家才知道,因此厂家须提供与设备相对应的驱动程序,CPU执行驱动程序的指令序列,来完成设置设备寄存器,检查设备状态等工作。

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

设备驱动程序主要负责对硬件设备的具体控制,将上层发出的一系列命令(如read、write)转化为特定设备能能明白的的一系列操作。包括设置设备寄存器,检查设备状态等。

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

中断处理程序

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

image-20231117112106155

I/O管理

I/O管理分为I/O应用程序接口和设备驱动程序接口。

I/O应用程序接口

image-20231117114449347

网络设备接口:

image-20231117115558517

设备驱动程序接口

不同的操作系统,对设备驱动程序接口的标准各不相同。设备厂商必须根据操作系统的接口要求,开发相应的设备驱动程序,设备才能被使用。

image-20231117170434125

操作系统规定好设备驱动程序的接口标准,各厂商必须按要求开发设备驱动程序。

假脱机技术

脱机技术是指:脱离主机的控制进行的输入/输出操作。在批处理阶段,数据的读入和写出所花费的时间远远大于CPU处理的时间。CPU的利用率很低。

在引入脱机技术之后,缓解了CPU与慢速I/O设备的速度矛盾。另一方面,即使CPU在忙碌,也可以提前把数据输入到磁带;即使慢速的输出设备正在忙碌,也可以提前将数据输出到磁盘。

image-20231120090848672

“假脱机技术”,又称为“SPOOLing技术”,是用软件的方式模拟脱机技术。SPOOLing 系统的组成如下:

image-20231120091639960

该技术会在磁盘上开辟两个存储区域——“输入井”和“输出井”:

  • “输入井” 模拟脱机输入时的磁带,用于收容I/O设备输入的数据
  • “输出井” 模拟脱机输出时的磁带,用于收容用户进程输出的数据。

外围控制机则是由一个输入进程和输出进程所组成:

  • “输入进程”:模拟脱机输入时的外围控制机。
  • “输出进程”:模拟脱机输出时的外围控制机。

在输入进程的控制下,“输入缓冲区”用于暂存从输入设备输入的数据,之后再转存到输入井中。

在输出进程的控制下,“输出缓冲区”用于暂存从输出井送来的数据,之后再传送到输出设备上

设备的分配与回收

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

独占设备——一个时段只能分配给一个进程( 如打印机)

共享设备——可同时分配给多个进程使用( 如磁盘),各进程往往是宏观上同时共享使用设备,而微观.上交替使用。

虚拟设备——采用SPOOLing技术将独占设备改造成虚拟的共享设备,可同时分配给多个进程使用( 如采用SPOOLing技术实现的共享打印机)

从进程运行的安全性上考虑,设备分配有两种方式:

安全分配方式:为进程分配一个设备后就将进程阻塞,本次I/O完成后才将进程唤醒。(eg: 考虑进程请求打印机打印输出的例子),优点是破坏了“请求和保持”条件,不会死锁。缺点是对于一个进程来说,CPU和I/O设备只能串行工作。

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

静态分配与动态分配

静态分配:进程运行前为其分配全部所需资源,运行结束后归还资源(破坏了“请求保持”条件,不会发生死锁)

动态分配:进程运行过程中动态申请设备资源。

设备管理中的数据结构

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

image-20231120095155785

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

image-20231120095452315

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

image-20231120095639836

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

image-20231120095807839

设备分配步骤的改进

① 根据进程请求的物理设备名查找SDT(注:物理设备名是进程请求分配设备时提供的参数)

② 根据SDT找到DCT,若设备忙碌则将进程PCB挂到设备等待队列中,不忙碌则将设备分配给进程。

③ 根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程。

④ 根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程。

缺点:

①用户编程时必须使用“物理设备名”,底层细节对用户不透明,不方便编程。

②若换了一个物理设备,则程序无法运行。

③若进程请求的物理设备正在忙碌,则即使系统中还有同类型的设备,进程也必须阻塞等待。

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

缓冲区管理

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

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

作用

  1. 缓和CPU与I/O设备之间速度不匹配的矛盾。
  2. 减少对CPU的中断频率,放宽对CPU中断相应时间的限制。
  3. 解决数据粒度不匹配的问题。
  4. 提高CPU与I/O设备之间的并行性。

image-20231120101223827

单缓冲

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

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

image-20231120101520617

image-20231120102324147

双缓冲

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

image-20231120103036943

image-20231120102926032

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

循环缓冲区

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

注:橙色代表已充满数据的缓冲区,绿色表示空缓冲区。

image-20231120103400485

缓冲池

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

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

image-20231120103606994 image-20231120103633689

①输入进程请求输入数据

②计算进程想要取得一块输入数据

③计算进程想要将准备好的数据冲入缓冲区

④输出进程请求输出数据

磁盘的结构

概念

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

磁道:磁盘的盘面被划分成一个一个磁道,这样的一个“圈”就是一个磁道。

扇区:一个磁道又被划分成一个个扇区,每个扇区就是一个“磁盘块”。各个扇区存放的数据量相同(例如1KB)最内侧磁道上的扇区面积最小,但是它与其他扇区存储的数据量一样,因此其数据密度最大。

image-20231120104716378

物理地址

可以用(柱面号,扇面号,扇区号)来定位任意一个“磁盘块”。在“文件的物理结构”小节中,我们经常提到文件数据存放到外存中的几号块,这个块号就可以转换成(柱面号,扇面号,扇区号)的地址形式。

image-20231120105155740

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

①根据“柱面号”移动磁臂,让磁头指向指定柱面;

②激活指定盘面对应的磁头;

③磁盘旋转的过程中,指定的扇区会从磁头下面划过,这样就完成了对指定扇区的读/写。

分类

image-20231120105632762 image-20231120105732874

也可以按照盘片是否可以更换分类为可换盘磁盘和固定盘磁盘。

磁盘调度算法

寻找时间(寻道时间) Ts: 在读/写数据前,将磁头移动到指定磁道所花的时间。

①启动磁头臂是需要时间的。假设耗时为s;

②移动磁头也是需要时间的。假设磁头匀速移动,每跨越一个磁道耗时为m,总共需要跨越n条磁道。则:寻道时间Ts=s + m * n

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

传输时间Tt:从磁盘读出或向磁盘写入数据所经历的时间,假设磁盘转速为 r,此次读/写的字节数为b,每个磁道上的字节数为N。则: 传输时间Tt = (1/r) * (b/N) = b/(rN)

每个磁道要可以存入 N 字节的数据,因此 b 字节的数据需要 b/N 个磁道才能存储。而读/写一个磁道所需要的时间刚好又是转一圈所需要的时间 1/r

延迟时间和传输时间都与磁盘转速相关,且为线性相关。而转速是硬件的固有属性,因此操作系统也无法优化延迟时间和传输时间。

总的平均存取时间: Ta = Ts + 1/2r + b/(rN)

先来先服务算法(FCFS)

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

假设磁头的初始位置是100号磁道,有多个进程先后陆续地请求访问55、58、39、18、90、160、150、38、184 号磁道

按照FCFS的规则,按照请求到达的顺序,磁头需要依次移动到55、58、39、18、90、160、150、38、184号磁道

image-20231120111338429

响应一个请求平均需要移动 498 / 9 = 55.3个磁道(平均寻找长度)

优点:公平;如果请求访问的磁道比较集中的话,算法性能适中。

缺点:如果有大量进程竞争使用磁盘,请求访问的磁道很分散,则FCFS在性能上很差,寻道时间长。

最短寻找时间优先(SSTF)

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

假设磁头的初始位置是100号磁道,有多个进程先后陆续地请求访问55、58、39、18、90、160、150、38、184号磁道。

image-20231120111858493

磁头总共移动了 (100 - 18) + (184 - 18) = 248个磁道。

响应一个请求平均需要移动 248 / 9 = 27.5个磁道

优点:性能较好,平均寻道时间短。

缺点:可能产生“饥饿”现象。(产生饥饿的原因在于磁头会在一个小区域内来来回回地移动)

扫描算法(SCAN)

SSTF算法会产生饥饿的原因在于:磁头有可能在一个小区域内来回来去地移动。为了防止这个问题,可以规定,只有磁头移动到最外侧磁道的时候才能往内移动,移动到最内侧磁道的时候才能往外移动。这就是扫描算法(SCAN)的思想。由于磁头移动的方式很像电梯,因此也叫电梯算法。

假设某磁盘的磁道为0~200号,磁头的初始位置是100号磁道,且此时磁头正在往磁道号增大的方向移动,有多个进程先后陆续地请求访问55、58、39、18、90、160、150、38、184 号磁道

image-20231120112604318

优点:性能较好,平均寻道时间较短,不会产生饥饿现象。

缺点:① 只有到达最边上的磁道时才能改变磁头移动方向,事实上,处理了184号磁道的访问请求之后就不需要再向右移动磁头了。

② SCAN 算法对于各个位置磁道的响应频率不平均(如:假设此时磁头正在往右移动,且刚处理过90号磁道,那么下次处理90号磁道的请求就需要等磁头移动很长一段距离;而响应了184号磁道的请求之后,很快又可以再次响应 184 号磁道的请求)

LOOK 调度算法

扫描算法(SCAN)中,只有到达最边上的磁道时才能改变磁头移动方向,事实上,处理了184号磁道的访问请求之后就不需要再往右移动磁头了。LOOK 调度算法就是为了解决这个问题,如果在磁头移动方向.上已经没有别的请求,就可以立即改变磁头移动方向。(边移动边观察 ,因此叫 LOOK)

假设某磁盘的磁道为0~200号,磁头的初始位置是100号磁道,且此时磁头正在往磁道号增大的方向移动,有多个进程先后陆续地请求访问 55、58、39、18、90、160、150、38、184 号磁道

image-20231120113227709

优点: 比起SCAN算法来,不需要每次都移动到最外侧或最内侧才改变磁头方向,使寻道时间进一步缩短。

循环扫描算法(C-SCAN)

SCAN算法对于各个位置磁道的响应频率不平均,而 C-SCAN 算法就是为了解决这个问题。规定只有磁头朝某个特定方向移动时才处理磁道访问请求,而返回时直接快速移动至起始端而不处理任何请求。

假设某磁盘的磁道为0~200号,磁头的初始位置是100号磁道,且此时磁头正在往磁道号增大的方向移动,有多个进程先后陆续地请求访问55、58、39、18、90、160、150、38、184号磁道

image-20231120113449912

优点:与SCAN算法相比,对于各个位置磁道的响应频率很平均。

缺点:只有到达最边上的磁道时才能改变磁头移动方向,事实上,处理了184号磁道的访问请求之后就不需要再往右移动磁头了;并且,磁头返回时其实只需要返回到18号磁道即可,不需要返回到最边缘的磁道。另外,比起SCAN算法来,平均寻道时间更长。

C-LOOK 调度算法

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

假设某磁盘的磁道为0~200号,磁头的初始位置是100号磁道,且此时磁头正在往磁道号增大的方向移动,有多个进程先后陆续地请求访问55、58、39、18、90、160、 150、38、184号磁道。

image-20231120113820999

优点:比起C-SCAN算法来,不需要每次都移动到最外侧或最内侧才改变磁头方向,使寻道时间进一步缩短。

减少磁盘延迟时间

假设要连续读取橙色区域的2、3、4扇区:

磁头读取一块的内容(也就是一个扇区的内容)后,需要一小段时间处理,而盘片又在不停地旋转

因此,如果2、3号扇区相邻着排列,则读完2号扇区后无法连续不断地读入3号扇区。必须等盘片继续旋转,3号扇区再次划过磁头,才能完成扇区读入

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

image-20231120115008274

如何解决这个问题呢?

交替编号

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

image-20231120115309504
磁盘地址结构的设计

为什么磁盘的物理地址是(柱面号,盘面号,扇区号),而不是(盘面号,柱面号,扇区号)

假设某磁盘有8个柱面/磁道(假设最内侧柱面/磁道号为0 ),4个盘面,8个扇区。则可用3个二进制位表示柱面,2个二进制位表示盘面,3个二进制位表示扇区。

若物理地址结构是(盘面号,柱面号,扇区号),且需要连续读取物理地址(00, 000, 000) ~ (00, 001, 111)的扇区:(00, 000, 000) ~ ( 00, 000, 111 )转两圈可读完。

之后再读取物理地址相邻的区域,即(00,001,000)~(00,001,111),需要启动磁头臂,将磁头移动到下一个磁道。

假设某磁盘有8个柱面/磁道(假设最内侧柱面/磁道号为0 ),4个盘面,8个扇区。则可用3个二进制位表示柱面,2个二进制位表示盘面,3个二进制位表示扇区。

若物理地址结构是(柱面号,盘面号,扇区号),且需要连续读取物理地址(000, 00, 000) ~ (000, 01, 111)的扇区:

(000, 00, 000) ~ ( 000, 00, 111 )由 盘面0的磁头读入数据之后再读取物理地址相邻的区域,即(000, 01, 000)
( 000, 01,111 ),由于柱面号/磁道号相同,只是盘面号不同,因此不需要移动磁头臂。只需要激活相邻盘面的磁头即可。

所以,在读取地址连续的磁盘块时,采用(柱面号,盘面号,扇区号)的地址结构可以减少磁头移动消耗的时间

错位命名

image-20231120120607024

image-20231120120641767

磁盘管理

磁盘初始化

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

② 将磁盘分区,每个分区由若干个柱面组成(即为熟悉的C盘、D盘、E盘)

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

image-20231120121238650
引导块

计算机在开机时需要进行一系列初始化的工作,这些初始化工作时通过执行初始化程序(自举程序)完成的。

初始化程序可以放在ROM(只读存储器)中。ROM中的数据在出厂时就写入,并且以后不能再次进行修改(注:ROM一般是出厂时就集成在主板上)。为了方便自举程序的更新和修改,ROM中只存放很小的“自举装入程序”,而完整的自举程序放在磁盘的启动块(即引导块/启动分区)上,启动块位于磁盘的固定位置。开机时计算机先运行“自举装入程序”,通过执行该程序就可以找到引导块,并将完整的“自举程序”读入内存,完成初始化。

将拥有启动分区的磁盘称为启动磁盘或系统磁盘(默认为C盘)。

坏块的管理

坏快:即无法正常进行使用的扇区。这属于硬件故障,操作系统是无法修复的。应该将坏块标记出来,以免错误地使用到它。

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

对于复杂的磁盘,磁盘控制器(磁盘设备内部的一个硬件部件)会维护一个坏块链表。

在磁盘出厂前进行低级格式化(物理格式化)时就将坏块链进行初始化。

会保留一-些“备用扇区”,用于替换坏块。这种方案称为扇区备用。且这种处理方式中,坏块对操作系统透明。

image-20231120192541666

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/471957.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SolidWorks如何在一个零件的基础上绘制另一个零件

经过测试,新建零件,然后插入零件a,在a的基础上绘制b,这种做法无法断开a与b的联系。虽然可以通过切除命令,切除b,但不是正途。 在装配体中可以实现: (1)建立装配体 (2&…

【MySQL】_JDBC编程

目录 1. JDBC原理 2. 导入JDBC驱动包 3. 编写JDBC代码实现Insert 3.1 创建并初始化一个数据源 3.2 和数据库服务器建立连接 3.3 构造SQL语句 3.4 执行SQL语句 3.5 释放必要的资源 4. JDBC代码的优化 4.1 从控制台输入 4.2 避免SQL注入的SQL语句 5. 编写JDBC代码实现…

牛腩新闻发布系统总结

目录 背景: 过程: 总结: 背景: 对于看牛腩视频都是每天坐立不安的事情,生怕看着看着遇到代码问题,那样自己又得需要费很大力气去解决,所以进展缓慢,之前也听过墨菲定律得书,如果不想出错的事情,那就一定…

《VulnHub》GoldenEye:1

title: 《VulnHub》GoldenEye:1 date: 2024-02-16 14:53:49 updated: 2024-02-16 15:08:49 categories: WriteUp:Cyber-Range excerpt: 主机发现、目标信息扫描、源码 js 文件泄露敏感信息、hydra 爆破邮件服务(pop3)、邮件泄露敏…

微信小程序框架阐述

目录 一、框架 响应的数据绑定 页面管理 基础组件 丰富的 API 二、逻辑层 App Service 小程序的生命周期 注册页面 使用 Page 构造器注册页面 在页面中使用 behaviors 使用 Component 构造器构造页面 页面的生命周期 页面路由 页面栈 路由方式 注意事项 模块化…

面试经典150题——最小覆盖子串(困难)

"The greatest glory in living lies not in never falling, but in rising every time we fall." - Nelson Mandela​ 1. 题目描述 2. 题目分析与解析 2.1 思路一——暴力求解 还是和之前讲的一样,看见题目没思路,先试试普通情况下人的解法…

输入输出自定义映射矩阵(数据结构树)

输出自定义FC其它算法实现,可以参考下面文章: https://rxxw-control.blog.csdn.net/article/details/125994252https://rxxw-control.blog.csdn.net/article/details/125994252下面我们看下我们的控制要求。在学习本篇博客之前大家可以熟悉下数据结构图…

Qt Creator 继承分文件编写代码流程实现简单案列

Qt Creator 继承分文件流程实现简单案列 打开Qt Creator&#xff0c;新建c项目 添加类 完成之后&#xff0c;会自动生成.h和.cpp文件 一、animal.h文件 主要用来写类&#xff0c;包括成员变量和函数 #ifndef ANIMAL_H #define ANIMAL_H #include <iostream> #inclu…

牛客网SQL进阶123:高难度试卷的得分的截断平均值

官网链接&#xff1a; SQL类别高难度试卷得分的截断平均值_牛客题霸_牛客网牛客的运营同学想要查看大家在SQL类别中高难度试卷的得分情况。 请你帮她从exam_。题目来自【牛客题霸】https://www.nowcoder.com/practice/a690f76a718242fd80757115d305be45?tpId240&tqId2180…

挑战杯 python的搜索引擎系统设计与实现

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python的搜索引擎系统设计与实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;5分创新点&#xff1a;3分 该项目较为新颖&#xff…

SpringCloud之Feign发送Http请求

文章目录 http客户端Feign使用步骤自定义Feign的配置Feign的性能优化Feign的性能优化-连接池配置 Feign的最佳实践 http客户端Feign Feign的介绍&#xff1a; Feign是一个声明式的http客户端&#xff0c;官方地址&#xff1a;https:/github.com/OpenFeign/feign 其作用就是帮助…

函数递归与迭代附n的阶乘+顺序打印一个整数的每一位数+求第n个斐波那契数

1. 什么是递归&#xff1f; 递归其实是一种解决问题的方法&#xff0c;在C语言中&#xff0c;递归就是函数自己调用自己。 下面是一个最简单的C语言递归代码&#xff1a; #include <stdio.h> int main() {printf("hehe\n");main();//main函数中⼜调⽤了main函数…