目前,用于缓存实现的大部分存储器都是易失型存储器,因此,当断电的时候,所有缓存的数据都将丢失。为了避免这个问题,一种专为缓存而特别设计的存储器已经面世,这种特制的存储器内嵌后备电池,经常用于磁盘子系统,以保证在某一指定时间内供电和数据存储。其他类型的非易失内存也已经生产出来,如闪存,但由于它们价格相对较高、性能较低及使用寿命有限等,通常不被用作缓存内存。
下面考虑使用L R U的示例,并假定某个应用正在更新数据。由于在缓存中可能存储了过时数据。这里过时数据是指被存储的数据,但不表示最新的版本。当应用修改数据时,过时的数据也必须要修改,无论它存放在哪里—在磁盘上,或者在磁盘和缓存内存里。图显示了两种情况:第一种情况是数据仅存放在磁盘上;第二种情况是数据既存放在磁盘上,也存放在缓存内存中。
在缓存未命中情况下,缓存控制器决定是否缓存这些数据。对于这个例子,缓存控制器决定放弃缓存关于这个写操作的数据,而把该数据直接写入非易失存储。换言之,数据仅写入磁盘,继续执行下一个操作。
在缓存命中情况下,缓存控制器可以修改缓存,甚至丢弃缓存,或使缓存内容无效,以致于后来的数据能够覆盖它。假如修改了缓存,必须最终在某个时刻将它写入非易失磁盘存储,但什么时候写呢?可能数据在近期将不被修改,但也可能它成为一个热点,将经历接二连三地、快速的操作。数据写入非易失存储器速度相对较慢,因为必须等待磁盘设备写完成后,才能进行新的写操作,致使系统的性能降低。另一方面,假如数据首先被写进缓存,延迟一段时间后才被写到非易失存储,那么,电源的临时故障就有可能导致数据的丢失。
解决这个问题基本上采用两种写缓存技术:
• 透写缓存。
• 回写缓存。
1) 透写缓存
透写缓存是把数据写入缓存内存后,就立即写入非易失存储器。透写缓存的办法是一种最保守的实现方案,因为基本上它不相信缓存能完成后来的写操作。要是某种原因使缓存系统停止运行,而文件系统或数据库系统却发出写请求,虽然不能获得透写缓存的响应,但它们可以访问磁盘上的数据,重新开始正常的操作。透写缓存既可以把数据镜像到这个缓存,也可以不这样做。假如所写的数据是从缓存装入的数据的更新版本,那么,透写缓存将更新缓存中的信息,或者删除缓存中的数据。
写缓存的一个重要的特性是:它们必须修改所有存在的数据实例,或者保证丢弃所有原数据的拷贝。假如系统中存在多个版本的数据,就有可能产生错误,最终错误地将数据存放在非易失存储器中。图显示了透写缓存的例子,例子中的透写缓存在更新缓存的同时,将数据写入非易失存储中。
2) 回写缓存
回写缓存有时也称为后写缓存,是为了性能缘故而实现的优化。它的基本思路是:为了给应用提供更快的响应,后写缓存首先将几个I / O写操作集中起来,然后一次性地把它们写入非易失存储器,而不是产生一个写请求就执行一个写操作。
这种写操作组合方法使缓存两侧的成分都能获益。对于产生写操作的主机来说,它比从透写缓存中更快地接收到确认;对设备而言,与单独地执行每个操作相比较,统一的写操作所花费的总时间更少。因此,组合的结果是产生更快的操作。图是一个回写缓存过程,在数据传输到非易失存储器之前,回写缓存组合了几个I / O操作。
数据库系统的I / O操作是非常频繁的,一般情况下,每秒要执行几千个I / O操作。因此,回写缓存能够提供非常大的性能改善。不仅更快捷地接收到每一个I / O的确认,而且,由于每次的更新数据只对缓存操作即可,而不必对非易失存储实施写,因而,写操作的执行速度也快了许多。
这样,同样数据块的多次修改只需一次磁盘写操作。清空缓存的过程通常称为刷新缓存。如前所述,回写缓存的潜在问题就是数据丢失。例如,倘若出现某种灾难时,数据却没有刷新到磁盘,而仍然保持在缓存中,那么,数据就要丢失。由于回写缓存算法对上述提及的数据丢失没有采取任何补救措施,因而必须依赖于其他的方法帮助维护数据的一致性。这些方法通常都使用辅助后备电池,保证在灾难出现时,缓存和子系统仍能运行足够长的时间,使缓存得以刷新缓存到非易失存储。
相关推荐
Google推荐的磁盘缓存方案,使用最近最少使用算法,DiskLruCache
丰富的应用生态系统:Android系统拥有庞大的应用程序生态系统,用户可以从Google Play商店或其他第三方应用市场下载和安装各种各样的应用程序,满足各种需求。 可定制性:Android操作系统可以根据用户的个人喜好进行...
为了提高磁盘阵列的重建效率,提出了一种新的磁盘阵列缓存替换策略,即分支刷新算法,从缓存管理的角度加快磁盘阵列的重建过程.分支刷新算法淘汰脏数据到后备磁盘阵列时,优先淘汰重建区域附近的脏数据块,从而减少了磁头...
目前支持内存、堆外内存、磁盘缓存。 功能特点: 支持二级缓存:Memory、Persistence 各个缓存可以拥有有效时间,超过时间缓存会过期 Memory 默认支持 FIFO、LRU、LFU 算法的实现 Memory 额外支持 Guava Cache、...
磁盘缓存 内存缓存 缓存策略 - 尽可能适应多种使用场景 仅缓存 仅网络 优先缓存 优先网络 先缓存后网络 缓存置换算法 - 多种实现,按需选择 先进先出算法(FIFO):最先进入的内容作为替换对象 最近最少使用算法...
基于Flash存储器缓存换入换出策略的算法改进,秦晓康,徐惠民,目前的大多数操作系统都是基于传统的磁盘存储器的,缓存换出算法仅仅只考虑命中率。然后,Flash存储器与传统的磁盘存储器相比读写�
在squid中涉及到缓存淘汰算法包括:内存缓存淘汰lru、磁盘缓存淘汰lru。一般做法是:当命中一个缓存后,将lru节点从当前位置删除,然后移动至队头。 淘汰一般是需要在固定的空间个数中淘汰掉某个节点(对于无限节点...
支持三种缓存策略:读写缓存、仅读缓存和仅写缓存, 支持性能数据监视和统计, 支持同时缓存多个硬盘和多个分区, 支持缓存采用自定义文件系统的分区, 支持缓存动态硬盘的分区, 支持即插即用, 支持命令行接口。 ...
LKImageKit是一个高级的图片框架,包括了图片控件,图片下载,内存缓存,磁盘缓存,图片解码,图片处理等一系列能力。合理的架构和线程模型,并特别针对不同场景进行优化,能充分发挥硬件的性能。 同时,该框架具有...
磁盘缓存从较慢的外部主内存缓存到较快的内部CPU内存的数据利用了数据引用的空间和时间局部性。 用户程序可能会访问相同的数据或与先前访问的数据非常接近的存储位置。 这称为空间局部性,这是操作系统从磁盘读取...
采用LinkedHashMap自带的LRU ... * 支持内存缓存和磁盘缓存方式, 通过 {@link cc.util.cache.NetByteWrapper} 支持HTTP缓存 (注:详细参考cc.util.http包); 注:使用JDK7 package cc.util.cache; import java
克莱普托持久缓存到内存,磁盘或数据库关于克莱普托klepto扩展了python的lru_cache以利用不同的键盘映射和备用缓存算法,例如lfu_cache和mru_cache 。 缓存是为了快速访问保存的结果,而klepto还具有存档功能,可以...
由于磁盘的读写速度比随机存取存储器(RAM)低得多,因此良好的RAM缓存策略可以有效地减少磁盘I / O。传统技术是使用基于0-1背包问题模型的贪婪和次优算法。在本文中,我们针对缓存问题提出了部分可观察的马尔可夫...
1. 使用磁盘Cache的时候非常占用磁盘空间:这是因为DiskCache的算法简单,该算法简单也导致Cache的效率非常高。它只是对元素直接追加存储。因此搜索元素的时候非常的快。如果使用DiskCache的,在很频繁的应用中,...
它采用独特的软件算法,高效率地将内存虚拟成物理硬盘,使得对硬盘文件的数据读写转化为对内存的数据访问,极大的提高数据访问速度,从而突破硬盘瓶颈,飞速提升计算机性能。另一方面它大大减少了对物理硬盘的访问...
YY缓存 ... 磁盘缓存 自定义:支持自定义存档和非存档方法来存储不采用NSCoding的对象。 存储类型控制:它可以自动确定每个对象的存储类型(sqlite /文件)以获得更好的性能。 安装 可可豆 将pod '
内容:构造面向磁盘I/O的高速缓存有效的后缀树算法;包括自顶向下基于磁盘的高效后缀树构造算法。 功能:实现从外部txt中读取只含有AGCT(也就是DNA序列)的字符串(大量,txt大概有30M左右),并能够实现查找,...
支持三种缓存策略:读写缓存、仅读缓存和仅写缓存,支持性能数据监视和统计, 支持同时缓存多个硬盘和多个分区, 支持缓存采用自定义文件系统的分区, 支持缓存动态硬盘的分区, 支持即插即用, 支持命令行接口. ...
5143-操作系统 名册 一般课程信息 天: MW 5:30 pm-6 : 50 pm ...磁盘缓存 文件管理 等级: 分类目录 年级 期中 25% 一种 89-100 项目1 25% 乙 79-88 作业2 25% C 69-78 决赛3 25% d 59-68 F 低于59
完美支持WINDOWS2008:EMS各WINDOWS2008系统下的服务端针对WINDWOS2008优化了磁盘性能,进程,线程调试,缓存算法,网络利用率等.网吧行业首创,EMS无盘系统完美支持Windows...¥完美支持WINDOWS2008:EMS各WINDOWS2008...