博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
磁盘缓存专题之三:磁盘缓存的算法:写算法
阅读量:4356 次
发布时间:2019-06-07

本文共 2013 字,大约阅读时间需要 6 分钟。

虽然缓存的最终目的为了提高性能,但缓存写的技术与缓存读的技术有很大的不同。但如果它带来的数据丢失危险很大,那么,就是一个不可接受的方案。因此,安全地将数据保存在非易失存储中是很重要的,因为这样数据就可以长期地保存。虽然读缓存技术用于读操作时可以提高系统性能,但当用于新产生数据的写操作时,却产生了一些有趣的问题。
目前,用于缓存实现的大部分存储器都是易失型存储器,因此,当断电的时候,所有缓存的数据都将丢失。为了避免这个问题,一种专为缓存而特别设计的存储器已经面世,这种特制的存储器内嵌后备电池,经常用于磁盘子系统,以保证在某一指定时间内供电和数据存储。其他类型的非易失内存也已经生产出来,如闪存,但由于它们价格相对较高、性能较低及使用寿命有限等,通常不被用作缓存内存。
下面考虑使用L R U的示例,并假定某个应用正在更新数据。由于在缓存中可能存储了过时数据。这里过时数据是指被存储的数据,但不表示最新的版本。当应用修改数据时,过时的数据也必须要修改,无论它存放在哪里—在磁盘上,或者在磁盘和缓存内存里。图显示了两种情况:第一种情况是数据仅存放在磁盘上;第二种情况是数据既存放在磁盘上,也存放在缓存内存中。

attachment.aspx?attachmentid=294

(30.24 K)
8/21/2012 9:00:05 AM

 

在缓存未命中情况下,缓存控制器决定是否缓存这些数据。对于这个例子,缓存控制器决定放弃缓存关于这个写操作的数据,而把该数据直接写入非易失存储。换言之,数据仅写入磁盘,继续执行下一个操作。
在缓存命中情况下,缓存控制器可以修改缓存,甚至丢弃缓存,或使缓存内容无效,以致于后来的数据能够覆盖它。假如修改了缓存,必须最终在某个时刻将它写入非易失磁盘存储,但什么时候写呢?可能数据在近期将不被修改,但也可能它成为一个热点,将经历接二连三地、快速的操作。数据写入非易失存储器速度相对较慢,因为必须等待磁盘设备写完成后,才能进行新的写操作,致使系统的性能降低。另一方面,假如数据首先被写进缓存,延迟一段时间后才被写到非易失存储,那么,电源的临时故障就有可能导致数据的丢失。
解决这个问题基本上采用两种写缓存技术:
透写缓存
回写缓存
1) 透写缓存
透写缓存是把数据写入缓存内存后,就立即写入非易失存储器。透写缓存的办法是一种最保守的实现方案,因为基本上它不相信缓存能完成后来的写操作。要是某种原因使缓存系统停止运行,而文件系统或数据库系统却发出写请求,虽然不能获得透写缓存的响应,但它们可以访问磁盘上的数据,重新开始正常的操作。透写缓存既可以把数据镜像到这个缓存,也可以不这样做。假如所写的数据是从缓存装入的数据的更新版本,那么,透写缓存将更新缓存中的信息,或者删除缓存中的数据。
写缓存的一个重要的特性是:它们必须修改所有存在的数据实例,或者保证丢弃所有原数据的拷贝。假如系统中存在多个版本的数据,就有可能产生错误,最终错误地将数据存放在非易失存储器中。图显示了透写缓存的例子,例子中的透写缓存在更新缓存的同时,将数据写入非易失存储中。

attachment.aspx?attachmentid=295

(24.90 K)
8/21/2012 9:00:05 AM

 

2) 回写缓存
回写缓存有时也称为后写缓存,是为了性能缘故而实现的优化。它的基本思路是:为了给应用提供更快的响应,后写缓存首先将几个I / O写操作集中起来,然后一次性地把它们写入非易失存储器,而不是产生一个写请求就执行一个写操作。
这种写操作组合方法使缓存两侧的成分都能获益。对于产生写操作的主机来说,它比从透写缓存中更快地接收到确认;对设备而言,与单独地执行每个操作相比较,统一的写操作所花费的总时间更少。因此,组合的结果是产生更快的操作。图是一个回写缓存过程,在数据传输到非易失存储器之前,回写缓存组合了几个I / O操作。

attachment.aspx?attachmentid=296

(30.90 K)
8/21/2012 9:00:05 AM

 

数据库系统的I / O操作是非常频繁的,一般情况下,每秒要执行几千个I / O操作。因此,回写缓存能够提供非常大的性能改善。不仅更快捷地接收到每一个I / O的确认,而且,由于每次的更新数据只对缓存操作即可,而不必对非易失存储实施写,因而,写操作的执行速度也快了许多。
这样,同样数据块的多次修改只需一次磁盘写操作。清空缓存的过程通常称为刷新缓存。如前所述,回写缓存的潜在问题就是数据丢失。例如,倘若出现某种灾难时,数据却没有刷新到磁盘,而仍然保持在缓存中,那么,数据就要丢失。由于回写缓存算法对上述提及的数据丢失没有采取任何补救措施,因而必须依赖于其他的方法帮助维护数据的一致性。这些方法通常都使用辅助后备电池,保证在灾难出现时,缓存和子系统仍能运行足够长的时间,使缓存得以刷新缓存到非易失存储。

 

相关文档下载:

转载于:https://www.cnblogs.com/yanyangtian/archive/2012/08/22/2650207.html

你可能感兴趣的文章
LBP特征 学习笔记
查看>>
与TIME_WAIT相关的几个内核参数修改测试讨论结论
查看>>
webpack构建react应用三:使用webpack Loaders 模块加载器(一)
查看>>
Java JDBC
查看>>
走势终完美 --执子之手
查看>>
补全左括号
查看>>
javascript中关于坐标 大小 的描述
查看>>
8086CPU各寄存器的用途
查看>>
AngularJs中,如何在render完成之后,执行Js脚本
查看>>
Nginx 防盗链
查看>>
如何讓Android系統顯示CJK擴展區漢字
查看>>
Android 下拉选择绑定Value和Text值
查看>>
HTML+CSS小结
查看>>
Android防止按钮连续点击
查看>>
ElasticSearch Mapping中的字段类型
查看>>
数据库中主键和外键的设计原则
查看>>
怎样理解阻塞非阻塞与同步异步的区别?
查看>>
Xcode 警告信息处理:Format string is not a string literal (potentially insecure)
查看>>
关于jQuery表单校验的应用
查看>>
matplotlib----初探------5直方图
查看>>