OS(二十二):设备管理之 磁盘存储器管理
1、数据的组织和格式
1.1、磁盘驱动器的结构
磁盘设备包括一个或多个物理盘片,每个磁盘片分一个或两个存储面(surface)。
1.2、磁盘的数据布局
每个磁盘面被组织成若干个同心环,这种环被称为磁道(track),各磁道之间留有必要的间隙。
为使处理简单,每条磁道上可存储相同数目的二进制位,如此,磁盘密度即每英寸中所存储的位数,内存磁道的密度较外层磁道的密度高。
每条磁道被逻辑上划分为若干个扇区(sectors),一个扇区称为一个盘块,常叫做磁盘扇区,各扇区间保留一定的间隙。
一个物理记录存储在一个扇区上,磁盘上存储的物理记录块数目是由扇区数、磁道数以及磁盘面数所决定的。
为了提高磁盘的存储容量,充分利用磁盘外面磁道的存储能力,现代磁盘不再把内外磁道划分为相同数目的扇区,而是利用外层磁道容量较内层磁道大的特点,将盘面划分成若干条环带,使得同一环带内的所有磁道具有相同的扇区数。
每个扇区包含两个字段:标识符字段,利用磁道号、磁头及扇区号标识一个扇区;数据字段,可存放512个字节的数据。
2、磁盘的类型
固定头磁盘:磁盘在每条磁道上都有一读/写磁头,所有的磁头都被装在一刚性磁臂中,通过磁头可访问所有各磁道,并进行并行读/写,有效提高磁盘的I/O速度。适用于大容量磁盘。
移动头磁盘:每一个盘面仅配有一个磁头,也被装入磁臂中,为了能访问该盘面上所有磁道,该磁头必须能移动以进行寻道。移动磁头仅能以串行方式读/写,使I/O速度较慢,适用于中小磁盘设备。
3、磁盘访问时间
磁盘设备在工作时以恒定速率旋转。为了读或写,磁头必须能移动到所要求的磁道上,并等待所要求的扇区的开始位置旋转到磁头下,然后再开始读或写数据。
对磁盘的访问时间划分为以下三部分:
寻道时间,磁头移动到制定能够磁道上所经历的时间,该时间是启动磁臂时间与磁头移动磁道花费的时间之和;
旋转延迟时间,指定扇区移动到磁头下面所经历的时间;
传输时间,把数据从磁盘读出或项磁盘写入数据所经历的时间,该时间是每次读/写的字节数b和旋转速度有关。
在访问时间中,寻道时间和旋转延迟时间与读/写数据的多少无关,占据访问时间的大头。
4、磁盘的调度
磁盘调度的目标是使磁盘的平均寻道时间最少。常用的调度算法:先来先服务、最短寻道时间优先及扫描等算法。
4.1、先来先服务(FCFS First Come First Served)
根据进程请求访问磁盘的先后次序进行调度。
该算法的优点是公平、简单,且每个进程的请求都能依次的得到处理,不会出现某一进程的请求长期得不到满足的情况。
该算法未对寻道进行优化,致使平均寻道时间可能较长。
4.2、最短寻道时间优先(SSTF Shortest Seek Time First)
要求访问的磁道与当前磁头所在磁道距离最近,使每次的寻道时间最短。
该算法不能保证平均寻道时间最短。
4.3、扫描(SCAN)算法
4.3.1、进程饥饿
SSTF算法可以获得较好的寻道性能,但可能导致某个进程发生"饥饿"现象。
只要不断有新进程的请求到达,且其所要访问的磁道与磁头当前所在磁道的距离较近,这种新进程的I/O请求,必然优先满足。
4.3.2、SCAN算法
SCAN算法是对 SSTF算法的优化,可防止老进程出现"饥饿"现象。
该算法不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。
当磁头正自里向外移动时,SCAN算法考虑下一个访问对象,应是其欲访问的磁道既在当前磁道之外,又是距离最近的。如此自里向外的访问,直至再无更外的磁道需要访问 时,才将磁臂换向自外向里移动。
5、磁盘的高速缓存
当前磁盘的I/O速度远低于内存的访问速度,磁盘的I/O往往是计算机系统的瓶颈。为了提高磁盘I/O的速度,引入磁盘高数缓存(Disk Cache)。
5.1、磁盘高速缓存的形式
磁盘高速缓存:利用内存中的存储空间来暂存从磁盘中读出的一系列盘块中的信息,指的是一组在逻辑上属于磁盘,而在物理上是驻留在内存中的盘块。
高速缓存在内存中分成两种形式:
1、在内存中开辟一个单独的存储空间来作为磁盘高速缓存,大小固定,不会受应用程序的影响
2、把所有未利用的内存空间变为一个缓冲池,供请求分页系统和磁盘I/O时共享,高速缓存大小不是固定的,
5.2、数据交付方式
数据交付是指将磁盘高速缓存中的数据传送给请求者进程。当有一进程请求访问某个盘块的数据时,由核心先去查看磁盘高速缓冲器,看其中是否存在进程所需访问的盘块数据的拷贝,若有拷贝,直接从高速缓存中提取数交付给请求者进程,避免了访盘的操作;否则,应先从磁盘中将所要访问的数据读入并交付给请求者进程,同时也将数据送高速缓存。
系统采用两种方式将数据交付给请求进程:
1、数据交付,直接将高速缓存中的数据,传送到请求者进程的内存工作区。
2、指针交付,将指向高速缓存中某区域的指针交付给请求者进程。
5.3、置换算法
将磁盘中盘块数据读入高速缓存时,会出现因高速缓存中已装满盘块数据而需要将该数据先换出的问题。
常用的置换算法:最久未使用算法LRU、最近未使用算法NRU及最少使用算法LFU。
5.3.1、算法考虑因素
1.1、访问频率
每执行一条指令时,就可能访问一次联想存储器,对联想存储器的访问频率与指令执行的频率相当;对高速缓存的访问频率,与磁盘I/O的频率相当。存储器的访问频率高于高速缓存的访问频率。
1.2、可预见性
在高速缓存中的各盘块数据,有相当大一部分是可预知的。
1.3、数据的一致性
高速缓存是在内存中,一旦系统出现故障,存放在高速缓存中的数据将会丢失,若其中的部分盘块中的数据已被修改,但未拷回磁盘,会造成数据的不一致。
将高速缓存中的所有盘块数据拉成一条LRU链,对于那些会影响数据一致性的盘块数据,放在LRU链的头部,使它们能被优先写回磁盘。
5.3.2、周期性的写回磁盘
根据LRU算法,经常要被访问的盘块数据,可能会一直保留在高速缓存中,长期不会被写回磁盘。
在UNIX系统中增设了一修改程序(update),使之在后台运行,该程序周期性的执行一个系统调用SYNC。
系统调用SYNC的主要功能是强制性的将所有在高速缓存中已修改的盘块数据写回磁盘。
6、提高磁盘I/O速度
6.1、提前读(Read-ahead)
进程对文件进行访问时,常采用顺序访问方式,即顺序的访问文件各盘块的数据。
在顺序访问方式中,在读当前块时,要求下一个盘块(提前读的块)中的数据也读入缓冲区。如此,当下一次要读该盘块中的数据时,由于该数据已被提前读入缓冲区,因而此时便可直接从缓冲区中取得下一盘块的数据,无需再去启动磁盘I/O。
6.2、延迟写
延迟写是指在缓冲区A中的数据,本应立即写回磁盘,但该缓冲区中的数据在不久后可能还会再被本进程或其他进程访问(共享资源),因而不立即将该缓冲区A中的数据写入磁盘,直至一道空闲缓冲队列之首。当再由进程申请到该缓冲区时,才将该缓冲区中的数据写入磁盘,而把该缓冲区作为空闲缓冲区分配出去。
6.3、优化物理块分布
优化物理块分布,使磁头的移动距离最小。对文件盘块的优化,应在未文件分配盘块时进行,若系统中的空白存储空间采用位示图方式,则要将同属于一个文件的盘块安排在同一条磁道上或相邻的磁道上,只要从位示图中找到一片相邻接的多个空闲盘块即可。
6.4、虚拟盘
虚拟盘,利用内存空间去仿真磁盘,又称为RAM盘。
该盘的设备驱动程序也接收所有标准的磁盘操作,这些操作在内存中执行。
虚拟盘的问题:虚拟盘是易失性存储器,一旦系统或电源发生故障或系统在启动时,原保存在虚拟盘中的数据将会丢失,因此,虚拟盘常用于存放临时文件。