OS设备管理
设备管理
 
 
操作系统作为系统资源的管理者,其提供的功能有:处理机管理、存储器管理、文件管理、设备管理。其中前三个管理都是在计算机的主机内部管理其相对应的硬件。
I/O设备
I/O即输入/输出。I/O设备即可以将数据输入到计算机,或者可以接收计算机输出数据的外部设备,属于计算机中的硬件部件。输入型设备例如,键盘与鼠标;输出型设备又例如显示器。而移动硬盘则为即可以输入、又可以输出的设备。
UNIX系统将从外部设备抽象为一种特殊的文件,用户可以使用与文件操作相同的方式对外部设备进行操作。
write操作:向外部设备写出数据。
read操作:从外部设备读入数据。
设备分类——按使用特性
分为三种类型:人机交互类外部设备、存储设备、网络通信设备。
人机交互类外部设备
例如鼠标、键盘、打印机等,用于人机交互的设备。这类设备的数据传输速度很慢,一般为字节或几十字节为单位的传输速率。

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

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

设备分类——按传输速率分类
分为三种类型:低俗、中速、高速设备。
低速设备
鼠标、键盘等,其传输速率为每秒几个至几百字节。

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

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

设备分类——按信息交换的单位分类
分为两类:块设备、字符设备。
块设备
例如磁盘等,数据传输的基本单位为“块”的设备,这类设备的传输速率较高。可寻址,即对它可随机地读/写任一块。

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

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

注意:① 一个 I/O 控制器可能会对应多个设备。
② 数据寄存器、控制寄存器、状态寄存器可能有多个(例如:每个控制/状态寄存器对应一个具体的设备),且这些寄存器都要有对应的地址,才能方便 CPU 操作。有的计算机会让这些寄存器占用内存地址的一部分,称为内存映射I/O;另一些计算机则采用I/O专用地址,即寄存器独立编址。
内存映射I/O
内存映射I/O,控制器中的寄存器与内存地址统一编址。
 
 
这种方式简化了指令,可以采用对内存进行操作的指令来对控制器进行操作。
寄存器独立编址
寄存器独立编址,控制器中的寄存器使用单独的地址。
 
 
这种方式需要设置专门的指令来实现对控制器的操作,不仅要指明寄存器的地址,还要指明控制器的编号。
I/O控制方式
计算机系统与外部设备之间进行数据输入和输出的方法和规则。I/O控制方式的选择对于计算机系统的性能和效率具有重要影响。分为了下面的四种:程序直接控制方法、中断驱动方式、DMA方式、通道控制方式。
程序直接控制方式
- 完成一次读/写操作的流程(以读操作为例)
① CPU 向控制器发出读指令。于是设备启动,并且状态寄存器设为 1(未就绪)
② 轮询检查控制器的状态(其实就是在不断地执行程序的循环,若状态位一直是1,说明设备还没准备好要输入的数据,于是CPU会不断地轮询)
③ 输入设备准备好数据后将数据传给控制器,并报告自身状态
④ 控制器将输入的数据放到数据寄存器中,并将状态改为0(已就绪)
⑤ CPU 发现设备已就绪,即可将数据寄存器中的内容读入 CPU 的寄存器中,再把 CPU 寄存器中的内容放入内存。
⑥ 若还要继续读入数据,则 CPU 继续发出读指令
 
 
此方式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的进程(或其他进程)的运行环境,然后继续执行。
 
 
每次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干预。
 
 
CPU指明此次要进行的操作(如:读操作),并说明要读入多少数据、数据要存放在内存的什么位置、数据在外部设备上的地址(如:在磁盘上的地址)。
控制器会根据CPU提出的要求完成数据的读/写工作,整块数据的传输完成后,才向CPU发出中断信号。

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”,通道可以识别并执行一系列通道指令。

通道与CPU相比,通道可以执行的指令很单一,并且通道程序是放在主机内存中的,也就是说通道与CPU共享内存。
 
 
此种方式的CPU干预的频率极低,通道会根据CPU的指示执行相应的通道程序,只有完成一组数据块的读/写后才需要发出中断信号,请求CPU干预。
数据传送的单位为每次读/写一组数据块。
在通道的控制下,数据的流向依旧是I/O设备与内存之间相互流通。
优点:CPU、通道、I/O设备可并行工作,资源利用率很高。
缺点:实现复杂,需要专门的通道硬件支持。
 
 
I/O软件层次结构
如图,I/O软件的层次可以如下进行划分:
 
 
其中的设备独立性软件、设备驱动程序、中断处理程序是属于操作系统的内核部分,即“I/O系统”,或称“I/O核心子系统”。
越往上面的层次越接近用户,越往下面的层次越接近硬件。
每一层会利用其下层提供的服务,实现某些功能,并屏蔽实现的具体细节,向高层提供服务(封装的思想)。
用户层软件
在用户层软件实现了与用户交互的接口,用户可直接使用该层提供的、与I/O操作相关的库函数对设备进行操作。
用户层软件将用户请求翻译成格式化的I/O请求,并通过“系统调用”请求操作系统内核的服务。
Windows 操作系统向外提供的一系列系统调用,但是由于系统调用的格式严格,使用麻烦,因此在用户层上封装了一系列更方便的库函数接口供用户使用(Windows API)
设备独立性软件
设备独立性软件,又称为设备无关性软件。与设备的硬件特性无关的功能几乎都在这一层实现。
主要实现的功能:
① 向上层提供统一的调用接口(例如 read/write 系统调用)
② 设备保护 (原理类似与文件保护。设备被看做是一种特殊的文件,不同用户对各个文件的访问权限是不一样的,同理,对设备的访问权限也不一样)
③ 差错处理 (设备独立性软件需要对一些设备的错误进行处理)
④ 设备的分配与回收
⑤ 数据缓冲区管理 (可以通过缓冲技术屏蔽设备之间数据交换单位大小和传输速度的差异)
⑥ 建立逻辑设备名到物理设备名的映射关系;根据设备类型选择调用相应的驱动程序(用户或用户层软件发出I/O操作相关系统调用的系统调用时,需要指明此次要操作的I/O设备的逻辑设备名。例如当有多台打印机时,打印文件时需要按名字选择使用哪一台打印机,其实这些名字就是逻辑设备名)
设备独立性软件需要通过 “逻辑设备表(LUT, Logical Unit Table )” 来确定逻辑设备对应的物理设备,并找到该设备对应的设备驱动程序。

I/O设备被当做一种特殊的文件,不同类型的I/O设备需要有不同的驱动程序处理。
操作系统系统可以采用两种方式管理逻辑设备表(LUT) :
第一种方式,整个系统只设置一张LUT,这就意味着所有用户不能使用相同的逻辑设备名,因此这种方式只适用于单用户操作系统。
第二种方式,为每个用户设置一张LUT, 各个用户使用的逻辑设备名可以重复,适用于多用户操作系统。系统会在用户登录时为其建立一个用户管理进程,而LUT就存放在用户管理进程的PCB中。
设备驱动程序
不同设备的内部硬件特性也不同,这些特性只有厂家才知道,因此厂家须提供与设备相对应的驱动程序,CPU执行驱动程序的指令序列,来完成设置设备寄存器,检查设备状态等工作。
不同的I/O设备有不同的硬件特性,具体细节只有设备的厂家才知道。因此厂家需要根据设备的硬件特性设计并提供相应的驱动程序。
设备驱动程序主要负责对硬件设备的具体控制,将上层发出的一系列命令(如read、write)转化为特定设备能能明白的的一系列操作。包括设置设备寄存器,检查设备状态等。
注意:驱动程序一般会以一个独立的进程的方式存在。
中断处理程序
当I/O任务完成时,I/O控制器会发送一一个中断信号,系统会根据中断信号类型找到相应的中断处理程序并执行。中断处理程序的处理流程如下:
 
 
I/O管理
I/O管理分为I/O应用程序接口和设备驱动程序接口。
I/O应用程序接口

网络设备接口:

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

操作系统规定好设备驱动程序的接口标准,各厂商必须按要求开发设备驱动程序。
假脱机技术
脱机技术是指:脱离主机的控制进行的输入/输出操作。在批处理阶段,数据的读入和写出所花费的时间远远大于CPU处理的时间。CPU的利用率很低。
在引入脱机技术之后,缓解了CPU与慢速I/O设备的速度矛盾。另一方面,即使CPU在忙碌,也可以提前把数据输入到磁带;即使慢速的输出设备正在忙碌,也可以提前将数据输出到磁盘。

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

该技术会在磁盘上开辟两个存储区域——“输入井”和“输出井”:
- “输入井” 模拟脱机输入时的磁带,用于收容I/O设备输入的数据
- “输出井” 模拟脱机输出时的磁带,用于收容用户进程输出的数据。
外围控制机则是由一个输入进程和输出进程所组成:
- “输入进程”:模拟脱机输入时的外围控制机。
- “输出进程”:模拟脱机输出时的外围控制机。
在输入进程的控制下,“输入缓冲区”用于暂存从输入设备输入的数据,之后再转存到输入井中。
在输出进程的控制下,“输出缓冲区”用于暂存从输出井送来的数据,之后再传送到输出设备上
设备的分配与回收
设备的固有属性可分为三种:独占设备、共享设备、虚拟设备。
独占设备——一个时段只能分配给一个进程( 如打印机)
共享设备——可同时分配给多个进程使用( 如磁盘),各进程往往是宏观上同时共享使用设备,而微观.上交替使用。
虚拟设备——采用SPOOLing技术将独占设备改造成虚拟的共享设备,可同时分配给多个进程使用( 如采用SPOOLing技术实现的共享打印机)
从进程运行的安全性上考虑,设备分配有两种方式:
安全分配方式:为进程分配一个设备后就将进程阻塞,本次I/O完成后才将进程唤醒。(eg: 考虑进程请求打印机打印输出的例子),优点是破坏了“请求和保持”条件,不会死锁。缺点是对于一个进程来说,CPU和I/O设备只能串行工作。
不安全分配方式:进程发出I/O请求后,系统为其分配I/O设备,进程可继续执行,之后还可以发出新的I/O请求。只有某个I/O请求得不到满足时才将进程阻塞。优点是进程的计算任务和I/O任务可以并行处理,使进程迅速推进。缺点是有可能发生死锁(死锁的避免、死锁的检测与解除)
静态分配与动态分配
静态分配:进程运行前为其分配全部所需资源,运行结束后归还资源(破坏了“请求保持”条件,不会发生死锁)
动态分配:进程运行过程中动态申请设备资源。
设备管理中的数据结构
设备控制表(DCT):系统为每个设备配置一张DCT,用于记录设备情况

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

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

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

设备分配步骤的改进
① 根据进程请求的物理设备名查找SDT(注:物理设备名是进程请求分配设备时提供的参数)
② 根据SDT找到DCT,若设备忙碌则将进程PCB挂到设备等待队列中,不忙碌则将设备分配给进程。
③ 根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程。
④ 根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程。
缺点:
①用户编程时必须使用“物理设备名”,底层细节对用户不透明,不方便编程。
②若换了一个物理设备,则程序无法运行。
③若进程请求的物理设备正在忙碌,则即使系统中还有同类型的设备,进程也必须阻塞等待。
改进的方法:建立逻辑设备名与物理设备名的映射机制,用户编程时只需提供逻辑设备名。
缓冲区管理
缓冲区是一个存储区域,可以由专门的硬件寄存器组成,也可利用内存作为缓冲区。使用硬件作为缓冲区的成本较高,容量也较小,-般仅用在对速度要求非常高的场合(如存储器管理中所用的联想寄存器,由于对页表的访问频率极高,因此使用速度很快的联想寄存器来存放页表项的副本)
一般情况下,更多的是利用内存作为缓冲区,“设备独立性软件”的缓冲区管理就是要组织管理
 好这些缓冲区。
作用
- 缓和CPU与I/O设备之间速度不匹配的矛盾。
- 减少对CPU的中断频率,放宽对CPU中断相应时间的限制。
- 解决数据粒度不匹配的问题。
- 提高CPU与I/O设备之间的并行性。

单缓冲
假设某用户进程请求某种块设备读入若干块的数据。若采用单缓冲的策略,操作系统会在主存中为其分配一个缓冲区(若没有特别说明,一个缓冲区的大小就是一个块)。
注意:当缓冲区数据非空时,不能往缓冲区冲入数据,只能从缓冲区把数据传出;当缓冲区为空时,可以往缓冲区冲入数据,但必须把缓冲区充满以后,才能从缓冲区把数据传出。


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


结论:采用双缓冲策略,处理一个数据块的平均耗时为Max(T,C + M)
循环缓冲区
将多个大小相等的缓冲区链接成一个循环队列。
注:橙色代表已充满数据的缓冲区,绿色表示空缓冲区。

缓冲池
缓冲池由系统中共用的缓冲区组成。这些缓冲区按使用状况可以分为:空缓冲队列、装满输入数据的缓冲队列(输入队列)、装满输出数据的缓冲队列(输出队列)。
另外,根据一个缓冲区在实际运算中扮演的功能不同,又设置了四种工作缓冲区:用于收容输入数据的工作缓冲区(hin) 、用于提取输入数据的工作缓冲区(sin) 、用于收容输出数据的工作缓冲区(hout) 、用于提取输出数据的工作缓冲区(sout)
 
 
 
 
①输入进程请求输入数据
②计算进程想要取得一块输入数据
③计算进程想要将准备好的数据冲入缓冲区
④输出进程请求输出数据
磁盘的结构
概念
磁盘:磁盘的表面由一些磁性物质组成,可以用这些磁性物质来记录二进制数据。
磁道:磁盘的盘面被划分成一个一个磁道,这样的一个“圈”就是一个磁道。
扇区:一个磁道又被划分成一个个扇区,每个扇区就是一个“磁盘块”。各个扇区存放的数据量相同(例如1KB)最内侧磁道上的扇区面积最小,但是它与其他扇区存储的数据量一样,因此其数据密度最大。
 
 
物理地址
可以用(柱面号,扇面号,扇区号)来定位任意一个“磁盘块”。在“文件的物理结构”小节中,我们经常提到文件数据存放到外存中的几号块,这个块号就可以转换成(柱面号,扇面号,扇区号)的地址形式。
 
 
可根据该地址读取-一个“块”
①根据“柱面号”移动磁臂,让磁头指向指定柱面;
②激活指定盘面对应的磁头;
③磁盘旋转的过程中,指定的扇区会从磁头下面划过,这样就完成了对指定扇区的读/写。
分类
 
 
 
 
也可以按照盘片是否可以更换分类为可换盘磁盘和固定盘磁盘。
磁盘调度算法
寻找时间(寻道时间) 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号磁道

响应一个请求平均需要移动 498 / 9 = 55.3个磁道(平均寻找长度)
优点:公平;如果请求访问的磁道比较集中的话,算法性能适中。
缺点:如果有大量进程竞争使用磁盘,请求访问的磁道很分散,则FCFS在性能上很差,寻道时间长。
最短寻找时间优先(SSTF)
SSTF算法会优先处理的磁道是与当前磁头最近的磁道。可以保证每次的寻道时间最短,但是并不能保证总的寻道时间最短。(其实就是贪心算法的思想,只是选择眼前最优,但是总体未必最优)
假设磁头的初始位置是100号磁道,有多个进程先后陆续地请求访问55、58、39、18、90、160、150、38、184号磁道。

磁头总共移动了 (100 - 18) + (184 - 18) = 248个磁道。
响应一个请求平均需要移动 248 / 9 = 27.5个磁道
优点:性能较好,平均寻道时间短。
缺点:可能产生“饥饿”现象。(产生饥饿的原因在于磁头会在一个小区域内来来回回地移动)
扫描算法(SCAN)
SSTF算法会产生饥饿的原因在于:磁头有可能在一个小区域内来回来去地移动。为了防止这个问题,可以规定,只有磁头移动到最外侧磁道的时候才能往内移动,移动到最内侧磁道的时候才能往外移动。这就是扫描算法(SCAN)的思想。由于磁头移动的方式很像电梯,因此也叫电梯算法。
假设某磁盘的磁道为0~200号,磁头的初始位置是100号磁道,且此时磁头正在往磁道号增大的方向移动,有多个进程先后陆续地请求访问55、58、39、18、90、160、150、38、184 号磁道

优点:性能较好,平均寻道时间较短,不会产生饥饿现象。
缺点:① 只有到达最边上的磁道时才能改变磁头移动方向,事实上,处理了184号磁道的访问请求之后就不需要再向右移动磁头了。
② SCAN 算法对于各个位置磁道的响应频率不平均(如:假设此时磁头正在往右移动,且刚处理过90号磁道,那么下次处理90号磁道的请求就需要等磁头移动很长一段距离;而响应了184号磁道的请求之后,很快又可以再次响应 184 号磁道的请求)
LOOK 调度算法
扫描算法(SCAN)中,只有到达最边上的磁道时才能改变磁头移动方向,事实上,处理了184号磁道的访问请求之后就不需要再往右移动磁头了。LOOK 调度算法就是为了解决这个问题,如果在磁头移动方向.上已经没有别的请求,就可以立即改变磁头移动方向。(边移动边观察 ,因此叫 LOOK)
假设某磁盘的磁道为0~200号,磁头的初始位置是100号磁道,且此时磁头正在往磁道号增大的方向移动,有多个进程先后陆续地请求访问 55、58、39、18、90、160、150、38、184 号磁道

优点: 比起SCAN算法来,不需要每次都移动到最外侧或最内侧才改变磁头方向,使寻道时间进一步缩短。
循环扫描算法(C-SCAN)
SCAN算法对于各个位置磁道的响应频率不平均,而 C-SCAN 算法就是为了解决这个问题。规定只有磁头朝某个特定方向移动时才处理磁道访问请求,而返回时直接快速移动至起始端而不处理任何请求。
假设某磁盘的磁道为0~200号,磁头的初始位置是100号磁道,且此时磁头正在往磁道号增大的方向移动,有多个进程先后陆续地请求访问55、58、39、18、90、160、150、38、184号磁道

优点:与SCAN算法相比,对于各个位置磁道的响应频率很平均。
缺点:只有到达最边上的磁道时才能改变磁头移动方向,事实上,处理了184号磁道的访问请求之后就不需要再往右移动磁头了;并且,磁头返回时其实只需要返回到18号磁道即可,不需要返回到最边缘的磁道。另外,比起SCAN算法来,平均寻道时间更长。
C-LOOK 调度算法
C-SCAN算法的主要缺点是只有到达最边上的磁道时才能改变磁头移动方向,并且磁头返回时不一定需要返回到最边缘的磁道上。C-LOOK 算法就是为了解决这个问题。如果磁头移动的方向。上已经没有磁道访问请求了,就可以立即让磁头返回,并且磁头只需要返回到有磁道访问请求的位置即可。
假设某磁盘的磁道为0~200号,磁头的初始位置是100号磁道,且此时磁头正在往磁道号增大的方向移动,有多个进程先后陆续地请求访问55、58、39、18、90、160、 150、38、184号磁道。

优点:比起C-SCAN算法来,不需要每次都移动到最外侧或最内侧才改变磁头方向,使寻道时间进一步缩短。
减少磁盘延迟时间
假设要连续读取橙色区域的2、3、4扇区:
磁头读取一块的内容(也就是一个扇区的内容)后,需要一小段时间处理,而盘片又在不停地旋转
因此,如果2、3号扇区相邻着排列,则读完2号扇区后无法连续不断地读入3号扇区。必须等盘片继续旋转,3号扇区再次划过磁头,才能完成扇区读入
结论:磁头读入一个扇区数据后需要- -小段时间处理,如果逻辑上相邻的扇区在物理.上也相邻,则读入几个连续的逻辑扇区,可能需要很长的“延迟时间”
 
 
如何解决这个问题呢?
交替编号
若采用交替编号的策略,即让逻辑上相邻的扇区在物理上有一定的间隔,可以使读取连续的逻辑扇区所需要的延迟时间更小。
 
 
磁盘地址结构的设计
为什么磁盘的物理地址是(柱面号,盘面号,扇区号),而不是(盘面号,柱面号,扇区号)
假设某磁盘有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 ),由于柱面号/磁道号相同,只是盘面号不同,因此不需要移动磁头臂。只需要激活相邻盘面的磁头即可。
所以,在读取地址连续的磁盘块时,采用(柱面号,盘面号,扇区号)的地址结构可以减少磁头移动消耗的时间。
错位命名


磁盘管理
磁盘初始化
① 进行低级格式化(物理格式化),将磁盘的各个磁道划分为扇区。一个扇区通常可分为头、数据区域(如512B大小)、尾三个部分组成。管理扇区所需要的各种数据结构一般存放在头、尾两个部分,包括扇区校验码(如奇偶校验、CRC循环冗余校验码等,校验码用于校验扇区中的数据是否发生错误)
② 将磁盘分区,每个分区由若干个柱面组成(即为熟悉的C盘、D盘、E盘)
③ 进行逻辑初始化,创建文件系统。包括创建文件系统的根目录、初始化存储空间管理所用的数据结构(如位示图、空闲分区表)。
 
 
引导块
计算机在开机时需要进行一系列初始化的工作,这些初始化工作时通过执行初始化程序(自举程序)完成的。
初始化程序可以放在ROM(只读存储器)中。ROM中的数据在出厂时就写入,并且以后不能再次进行修改(注:ROM一般是出厂时就集成在主板上)。为了方便自举程序的更新和修改,ROM中只存放很小的“自举装入程序”,而完整的自举程序放在磁盘的启动块(即引导块/启动分区)上,启动块位于磁盘的固定位置。开机时计算机先运行“自举装入程序”,通过执行该程序就可以找到引导块,并将完整的“自举程序”读入内存,完成初始化。
将拥有启动分区的磁盘称为启动磁盘或系统磁盘(默认为C盘)。
坏块的管理
坏快:即无法正常进行使用的扇区。这属于硬件故障,操作系统是无法修复的。应该将坏块标记出来,以免错误地使用到它。
对于简单的磁盘,可以在逻辑格式化时(建立文件系统时)对整个磁盘进行坏块检查,标明哪些扇区是坏扇区,比如:在FAT表上标明。(在这种方式中, 坏块对操作系统不透明)
对于复杂的磁盘,磁盘控制器(磁盘设备内部的一个硬件部件)会维护一个坏块链表。
在磁盘出厂前进行低级格式化(物理格式化)时就将坏块链进行初始化。
会保留一-些“备用扇区”,用于替换坏块。这种方案称为扇区备用。且这种处理方式中,坏块对操作系统透明。

相关文章:
 
OS设备管理
设备管理 操作系统作为系统资源的管理者,其提供的功能有:处理机管理、存储器管理、文件管理、设备管理。其中前三个管理都是在计算机的主机内部管理其相对应的硬件。 I/O设备 I/O即输入/输出。I/O设备即可以将数据输入到计算机,或者可以接收…...
Matlab绘图经典代码大全:条形图、极坐标图、玫瑰图、填充图、饼状图、三维网格云图、等高线图、透视图、消隐图、投影图、三维曲线图、函数图、彗星图
学会 MATLAB 中的绘图命令对初学者来说具有重要意义,主要体现在以下几个方面: 1. 数据可视化。绘图命令是 MATLAB 中最基本也是最重要的功能之一,它可以帮助初学者将数据可视化,更直观地理解数据的分布、变化规律和趋势。通过绘制图表,可以快速了解数据的特征,从而为后续…...
 
姿态传感器MPU6050模块之陀螺仪、加速度计、磁力计
MEMS技术 微机电系统(MEMS, Micro-Electro-Mechanical System),也叫做微电子机械系统、微系统、微机械等,指尺寸在几毫米乃至更小的高科技装置。微机电系统其内部结构一般在微米甚至纳米量级,是一个独立的智能系统。 微…...
 
MySQL 基础知识(一)之数据库和 SQL 概述
目录 1 数据库相关概念 2 数据库的结构 3 SQL 概要 4 SQL 的基本书写规则 1 数据库相关概念 数据库是将大量的数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合数据库管理系统(DBMS)是用来管理数据库的计算机系统…...
 
挑战杯 wifi指纹室内定位系统
简介 今天来介绍一下室内定位相关的原理以及实现方法; WIFI全称WirelessFidelity,在中文里又称作“行动热点”,是Wi-Fi联盟制造商的商标做为产品的品牌认证,是一个创建于IEEE 802.11标准的无线局域网技术。基于两套系统的密切相关ÿ…...
 
Midjourney提示词风格调试测评
在Midjourney中提示词及风格参数的变化无疑会对最终的作品产生影响,那影响具体有多大?今天我我们将通过一个示例进行探究。 示例提示词: 计算机代码海洋中的黄色折纸船(图像下方)风格参考:金色长发的女人,…...
Codeforces Round 926 (Div. 2)(A~C)
A. Sasha and the Beautiful Array 分析:说实话,打比赛的时候看到这题没多想,过了一下样例发现将数组排序一下就行,交了就过了。刚刚写题解反应过来,a2-a1a3-a2.....an-a(n-1) an - a1,所以最后结果只取决…...
 
Godot 游戏引擎个人评价和2024年规划(无代码)
文章目录 前言Godot C# .net core 开发简单评价Godot相关网址可行性 Godot(GDScirpt) Vs CocosGodot VS UnityUnity 的裁员Unity的股票Unity的历史遗留问题:Mono和.net core.net core的开发者,微软 个人的独立游戏Steam平台分成说明独立游戏的选题美术风…...
 
Win11关闭Windows Defender实时保护,暂时关闭和永久关闭方法 | Win10怎么永久关闭Windows Defender实时保护
文章目录 1. 按2. 暂时关闭Windows Defender实时保护3. 永久关闭实时保护 1. 按 开启Windows Defender实时保护有时候会导致系统变得异常卡顿,严重影响系统的流畅度,并且由于会有几率错误拦截和查杀我们的正常操作,所以还会导致我们的程序无…...
 
C# CAD2016 宗地生成界址点,界址点编号及排序
1 、界址点起点位置C# CAD2016 多边形顶点按方向重新排序 2、 界址点顺时针逆时针走向 C# CAD2016 判断多边形的方向正时针或逆时针旋转 3、块文件插入 //已知块文件名称 GXGLQTC //块文件需要插入的坐标点 scaledPoint// 插入块到当前图纸中的指定位置ObjectId newBlockId;B…...
 
[ai笔记7] google浏览器ai学习提效定制优化+常用插件推荐
欢迎来到文思源想的ai空间,这是技术老兵重学ai以及成长思考的第7篇分享! 工欲善其事必先利其器,为了ai学习的效能提升,放假期间对google浏览器做了一次系统整改,添加了一些配置和插件,这里既有一些显示、主…...
 
联想thinkpad-E450双系统升级记
早期笔记本联想thinkpad-E450双系统 大约16年花4000多大洋,买了一台thinkpad-E450屏幕是16寸本,有AMD独立显卡,i5cpu,4G内存。 . 后来加了一个同型号4G内存组成双通道, . 加了一个三星固态500G, . 换了一个…...
 
Mysql运维篇(四) Xtarbackup--备份与恢复练习
一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人。如有侵权,请留言,我及时删除! 前言 xtrabackup是Percona公司CTO Vadim参与开发的一款基于InnoDB的在线热备工具,具有…...
vue3 封装一个通用echarts组件
实现这个组件需要引入echarts和vue-echarts插件,使用vue-echarts是因为它帮我们封装了一些很常用的功能,比如监听页面resize后重新渲染功能,本次组件只使用到了autoresize配置,其它可以根据官方文档按需选配 https://github.com/…...
 
安装 Windows Server 2003
1.镜像安装 镜像安装:Windows Server 2003 2.安装过程(直接以图的形式呈现) 按Enter(继续),继续后F8继续 直接Enter安装 下一步 秘钥:GM34K-RCRKY-CRY4R-TMCMW-DMDHM 等待安装成功即可...
在STM32中使用DMA进行SD卡读写操作的实现方法
在STM32中,使用DMA进行SD卡的读写操作可以提高数据传输的速度和效率。下面是在STM32中使用DMA进行SD卡读写操作的实现方法: ✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进 ❤欢迎关注我的知乎:对error视而不见…...
StringBuilder/StringBuffer类(Java)
StringBuilder/StringBuffer类 当对字符串进行修改的时候,使用 StringBuffer / StringBuilder 类更方便。和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。方法类似 public class…...
 
SQL的1999语法
目录 交叉连接 实现交叉连接 自然连接 实现自然连接(实际上就是内连接) ON和USING 使用自然连接时要求两张表的字段名称相同,但是如果不相同或者两张表中有两组字段是重名,这时就要利用 ON 子句指定关联条件,利用 USING 子句…...
【AIGC】Stable Diffusion安装包
Stable Diffusion 的安装教程通常分为以下几个步骤: 一、安装 Python: 确保您的系统中已经安装了 Python,并且版本符合 Stable Diffusion 的要求。通常情况下,Python 版本应为 3.6 或更高版本。您可以从 Python 官方网站下载并安…...
C++:迭代器的封装思想
C:迭代器的封装思想 list迭代器实现反向迭代器实现 本博客将通过实现list的迭代器,以及它的反向迭代器,来帮助大家理解迭代器的底层逻辑,以及封装思想。 list迭代器实现 迭代器是一个遍历容器的工具,其可以通过自增自…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
 
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
 
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
 
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
 
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
 
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
