目前,磁盘的I/O速度远低于对内存的访问速度,通常要低4~6个数量级。因此,磁盘的I/O已成为计算机系统的瓶颈。于是,人们便千方百计地提高磁盘I/O的速度,其中最主要的技术便是采用磁盘高速缓存(Disk cache)。
1.磁盘高速缓存的形式
这里所说的磁盘高速缓存,并非通常意义下的内存和CPU之间所增设的一个小容量高速存储器,而是指利用内存中的存储空间来暂存从磁盘中读出的一系列盘块中的信息。因此,这里的高速缓存是一组在逻辑上属于磁盘,而物理上是驻留在内存中的盘块。高速缓存在内存中可分成两种形式。第一种是在内存中开辟一个单独的存储空间来作为磁盘高速缓存,其大小是固定的,不会受应用程序多少的影响;第二种是把所有未利用的内存空间变为一个缓冲池,供请求分页系统和磁盘I/O时(作为磁盘高速缓存)共享。此时,高速缓存的大小显然不再是固定的。当磁盘I/O的频繁程度较高时,该缓冲池可能包含更多的内存空间;而在应用程序运行得较多时,该缓冲池可能只剩下较少的内存空间。
2.数据交付方式
数据交付(Data Delivery)是指将磁盘高速缓存中的数据传送给请求者进程。当有一进程请求访问某个盘块中的数据时,由核心先去查看磁盘高速缓存,看其中是否存在进程所需访问的盘块数据的拷贝。若有其拷贝,便直接从高速缓存中提取数据交付给请求者进程,这样,就避免了访盘操作,从而使本次访问速度提高4~6个数量级;否则,应先从磁盘中将所要访问的数据读入并交付给请求者进程,同时也将数据送入高速缓存。当以后又需要访问该盘块的数据时,便可直接从高速缓存中提取。
系统可以采取两种方式将数据交付给请求进程。
(1)数据交付。这是直接将高速缓存中的数据传送到请求者进程的内存工作区中。
(2)指针交付。这是只将指向高速缓存中某区域的指针交付给请求者进程。
后一种方式由于所传送的数据量少,因而节省了数据从磁盘高速缓存到进程的内存工作区的时间。
3.置换算法
如同请求调页(段)一样,在将磁盘中的盘块数据读入高速缓存时,同样会出现因高速缓存中已装满盘块数据而需要将该数据先换出的问题。相应地,也必然存在着采用哪种置换算法的问题。较常用的置换算法仍然是最近最久未使用算法LRU、最近未使用算法NRU及最少使用算法LFU等。
由于请求调页中的联想存储器与高速缓存(磁盘I/O中)的工作情况不同,因而使得在置换算法中所应考虑的问题也有所差异。因此,现在不少系统在设计其高速缓存的置换算法时,除了考虑到最近最久未使用这一原则外,还考虑了以下几点。(https://www.xing528.com)
(1)访问频率
通常,每执行一条指令时,便可能访问一次联想存储器,亦即联想存储器的访问频率基本上与指令执行的频率相当。而对高速缓存的访问频率则与磁盘I/O的频率相当。因此,对联想存储器的访问频率远远高于对高速缓存的访问频率。
(2)可预见性
在高速缓存中的各盘块数据,有哪些数据可能在较长时间内不会再被访问,又有哪些数据可能很快就再被访问,会有相当一部分是可预知的。例如,对二次地址及目录块等,在它被访问后,可能很久都不再被访问。又如,正在写入数据的未满盘块,可能很快又被访问。
(3)数据的一致性
由于高速缓存是做在内存中的,而内存一般又是一种易失性的存储器,一旦系统发生故障,存放在高速缓存中的数据将会丢失;而其中有些盘块(如索引节点盘块)中的数据已被修改,但尚未拷回磁盘,因此,当系统发生故障后,可能会造成数据的不一致性。
基于上述考虑,在有的系统中便将高速缓存中的所有盘块数据拉成一条LRU链。对于那些会严重影响数据一致性的盘块数据和很久都可能不再使用的盘块数据,都放在LRU链的头部,使它们能被优先写回磁盘,以减少发生数据不一致性的概率,或者可以尽早地腾出高速缓存的空间。对于那些可能在不久之后便要再使用的盘块数据,应挂在LRU链的尾部,以便在不久以后需要时,只要该数据块尚未从链中移至链首而被写回磁盘,便可直接到高速缓存中(即LRU链中)去找到它们。
4.周期性地写回磁盘
还有一种情况值得注意:那就是根据LRU算法,那些经常要被访问的盘块数据可能一直保留在高速缓存中,长期不会被写回磁盘。(注意:LRU链意味着链中任一盘块在被访问之后,总是又被挂到链尾而不被写回磁盘;只是一直未被访问的盘块,才有可能移到链首,而被写回磁盘。)例如,一位学者一上班便开始撰写论文,并边写边修改,他正在写作的论文就一直保存在高速缓存的LRU链中。如果在快下班时,系统突然发生故障,这样,存放在高速缓存中的已写论文将随之消失,致使他枉费了一天的劳动。
为了解决这一问题,在UNIX系统中专门增设了一个修改(up date)程序,使之在后台运行,该程序周期性地调用一个系统调用SYNC。该调用的主要功能是强制性地将所有在高速缓存中已修改的盘块数据写回磁盘。一般是把两次调用SYNC的时间间隔定为30s。这样,因系统故障所造成的工作损失不会超过30s的劳动量。而在MS-DOS中所采用的方法:只要高速缓存中的某盘块数据被修改,便立即将它写回磁盘,并将这种高速缓存称为“写穿透高速缓存”(write-through cache)。MS-DOS所采用的写回方式,几乎不会造成数据的丢失,但须频繁地启动磁盘。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
