在系统中设置了磁盘高速缓存后,能显著地减少等待磁盘I/O的时间。本小节再介绍几种能有效地提高磁盘I/O速度的方法,这些方法已被许多系统采用。
1.提前读(Read-ahead)
用户(进程)对文件进行访问时,经常采用顺序访问方式,即顺序地访问文件各盘块的数据。在这种情况下,在读当前块时可以预知下一次要读的盘块。因此,可以采取预先读方式,即在读当前块的同时,还要求将下一个盘块(提前读的块)中的数据也读入缓冲区。这样,当下一次要读该盘块中的数据时,由于该数据已被提前读入缓冲区,因而此时便可直接从缓冲区中取得下一盘块的数据,而不需要再去启动磁盘I/O,从而大大减少了读数据的时间。这也就等效于提高了磁盘I/O的速度。“提前读”功能已被广泛采用,如在UNIX系统、OS/2,以及在3 Plus和Netware等的网络OS中,都已采用该功能。
2.延迟写
延迟写是指在缓冲区A中的数据,本应立即写回磁盘,但考虑到该缓冲区中的数据在不久之后可能还会再被本进程或其他进程访问(共享资源),因而并不立即将该缓冲区A中的数据写入磁盘,而是将它挂在空闲缓冲区队列的末尾。随着空闲缓冲区的使用,缓冲区也缓缓往前移动,直至移到空闲缓冲队列之首。当再有进程申请到该缓冲区时,才将该缓冲区中的数据写入磁盘,而把该缓冲区作为空闲缓冲区分配出去。当该缓冲区A仍在队列中时,任何访问该数据的进程,都可直接读出其中的数据而不必去访问磁盘。这样,又可进一步减小磁盘I/O时间。同样,“延迟写”功能已在UNⅨ系统、OS/2等OS中被广泛采用。
另一种提高磁盘I/O速度的重要措施是优化文件物理块的分布,使磁头的移动距离最小。虽然链接分配和索引分配方式都允许将一个文件的物理块分散在磁盘的任意位置,但如果将一个文件的多个物理块安排得过于分散,会增加磁头的移动距离。例如,将文件的第一个盘块安排在最里的一条磁道上,而把第二个盘块安排在最外的一条磁道上,这样,在读完第一个盘块后转去读第二个盘块时,磁头要从最里的磁道移到最外的磁道上。如果我们将这两个数据块安排在属于同一条磁道的两个盘块上,显然会由于消除了磁头在磁道间的移动,而大大提高对这两个盘块的访问速度。
对文件盘块位置的优化,应在为文件分配盘块时进行。如果系统中的空白存储空间是采用位示图方式表示的,则要将同属于一个文件的盘块安排在同一条磁道上或相邻的磁道上是十分容易的事。这时,只要从位示图中找到一片相邻接的多个空闲盘块即可。但当系统采用线性表(链)法来组织空闲存储空间时,要为一文件分配多个相邻接的盘块,就要困难一些。此时,我们可以将在同一条磁道上的若干个盘块组成一簇,例如,一簇包括4个盘块,在分配存储空间时,以簇为单位进行分配。这样就可以保证在访问这几个盘块时,不必移动磁头或者仅移动一条磁道的距离,从而减少了磁头的平均移动距离。
4.虚拟盘
所谓虚拟盘,是指利用内存空间去仿真磁盘,又称为RAM盘。该盘的设备驱动程序也可以接受所有标准的磁盘操作,但这些操作的执行不是在磁盘上而是在内存中。这些对用户都是透明的。换言之,用户并不会发现这与真正的磁盘操作有什么不同,而仅仅是略微快些而已。虚拟盘的主要问题:它是易失性存储器,故一旦系统或电源发生故障,或系统再启动时,原来保存在虚拟盘中的数据将会丢失。因此,虚拟盘通常用于存放临时文件,如编译程序所产生的目标程序等。虚拟盘与磁盘高速缓存的主要区别在于:虚拟盘中的内容完全由用户控制,而高速磁盘缓存中的内容则是由OS控制的。例如,RAM盘在开始时是空的,仅当用户(程序)在磁盘中创建了文件后,磁盘中才有内容。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。