在缓存未命中情况下,缓存控制器决定是否缓存这些数据。对于这个例子,缓存控制器决定放弃缓存关于这个写操作的数据,而把该数据直接写入非易失存储。换言之,数据仅写入磁盘,继续执行下一个操作。 在缓存命中情况下,缓存控制器可以修改缓存,甚至丢弃缓存,或使缓存内容无效,以致于后来的数据能够覆盖它。假如修改了缓存,必须最终在某个时刻将它写入非易失磁盘存储,但什么时候写呢?可能数据在近期将不被修改,但也可能它成为一个热点,将经历接二连三地、快速的操作。数据写入非易失存储器速度相对较慢,因为必须等待磁盘设备写完成后,才能进行新的写操作,致使系统的性能降低。另一方面,假如数据首先被写进缓存,延迟一段时间后才被写到非易失存储,那么,电源的临时故障就有可能导致数据的丢失。 解决这个问题基本上采用两种写缓存技术: • 透写缓存。• 回写缓存。 1) 透写缓存 透写缓存是把数据写入缓存内存后,就立即写入非易失存储器。透写缓存的办法是一种最保守的实现方案,因为基本上它不相信缓存能完成后来的写操作。要是某种原因使缓存系统停止运行,而文件系统或数据库系统却发出写请求,虽然不能获得透写缓存的响应,但它们可以访问磁盘上的数据,重新开始正常的操作。透写缓存既可以把数据镜像到这个缓存,也可以不这样做。假如所写的数据是从缓存装入的数据的更新版本,那么,透写缓存将更新缓存中的信息,或者删除缓存中的数据。 写缓存的一个重要的特性是:它们必须修改所有存在的数据实例,或者保证丢弃所有原数据的拷贝。假如系统中存在多个版本的数据,就有可能产生错误,最终错误地将数据存放在非易失存储器中。图显示了透写缓存的例子,例子中的透写缓存在更新缓存的同时,将数据写入非易失存储中。
2) 回写缓存 回写缓存有时也称为后写缓存,是为了性能缘故而实现的优化。它的基本思路是:为了给应用提供更快的响应,后写缓存首先将几个I / O写操作集中起来,然后一次性地把它们写入非易失存储器,而不是产生一个写请求就执行一个写操作。 这种写操作组合方法使缓存两侧的成分都能获益。对于产生写操作的主机来说,它比从透写缓存中更快地接收到确认;对设备而言,与单独地执行每个操作相比较,统一的写操作所花费的总时间更少。因此,组合的结果是产生更快的操作。图是一个回写缓存过程,在数据传输到非易失存储器之前,回写缓存组合了几个I / O操作。
数据库系统的I / O操作是非常频繁的,一般情况下,每秒要执行几千个I / O操作。因此,回写缓存能够提供非常大的性能改善。不仅更快捷地接收到每一个I / O的确认,而且,由于每次的更新数据只对缓存操作即可,而不必对非易失存储实施写,因而,写操作的执行速度也快了许多。这样,同样数据块的多次修改只需一次磁盘写操作。清空缓存的过程通常称为刷新缓存。如前所述,回写缓存的潜在问题就是数据丢失。例如,倘若出现某种灾难时,数据却没有刷新到磁盘,而仍然保持在缓存中,那么,数据就要丢失。由于回写缓存算法对上述提及的数据丢失没有采取任何补救措施,因而必须依赖于其他的方法帮助维护数据的一致性。这些方法通常都使用辅助后备电池,保证在灾难出现时,缓存和子系统仍能运行足够长的时间,使缓存得以刷新缓存到非易失存储。
相关文档下载: