OCP知识点讲解 之 LRU链与脏LRU链
一、LRU链:任何缓存的大小都是有限制的,并且总不如被缓存的数据多。就像Buffercache用来缓存数据文件,数据文件的大小远远超过Buffercache。因此,缓存总有被
一、LRU链:
为了实现LRU的功能,Oracle在Buffer cache中创建了一个LRU链表,Oracle将Buffer cache中所有内存块,按照访问次数、访问时间排序串在链表中。链表的两头我们分别叫做热端与冷端, 如下图
当你第一次访问某个块时,如果这个块不在Buffer cache中,Oracle要选将它读进Buffer cache。在Buffer cache中选择牺牲者时,Oracle将从冷端头开始选择,在上图的例子中,内存块U将是牺牲者。
如上图,新块将会被读入U,覆盖U原来的内容。这里,我们假设新块是V。但是块V不会被放在冷端头,因为冷端头的块,会很快被当作牺牲者权覆盖的。这不符合“将最后访问时间距现在最远的块作为牺牲者”的宗旨。块V是最后时间距当前时刻最近的,它不应该作为下一个牺牲者。Oracle是如何实验LRU的,我们继续看。
Oracle将LRU链从中间分为两半,一半记录热端块、一半记录冷端块。如上图,而刚刚被访问的块V,如下图:
如过再有新的块进入Buffer cache,比如块X被读入Buffer cache,它将覆盖T,并且会被移至块V的前面,如下图:
大家可以想像一下,如果按照这面的方式继续下去,最右边冷端头处的块,一定是最后一次访问时间距现在最远的块。那么,访问次数多的块是不会被选做牺牲者的,这一点Oracle是如何实现的?这很简单,Oracle一般以2次为准,块被访问2次以上了,它就有机会进入热端。
Oracle为内存中的每个块都添加了一个记录访问次数的标志位,假设图中每个块的访问次数如下:
如果现在又有新块要被读入Buffer cache,Oracle开始从冷端头寻找牺牲者,冷端头第一个块S,它的访问次数是2,香港虚拟主机,那么,它不能被覆盖,只要访问次数大于等于2的块,Oracle会认为它可能会被经常访问到,Oracle要把它移到热端,它会选择R做为本次的牺牲者:
块S会被从冷端移到热端,并且它的访问次数会被清零。此时,块R就是牺牲者了,因为它的访问次数不到两次。
新块Y覆盖了块R,并被移到了冷端块开始处,它的访问次数是1。如果块Y再被访问了一次,它的访问次数变为了2:
虽然Y的访问次数达到了两次,但它不会马上被移到热端,它仍然留在原来的位置,随着不断有新块加入,被插入到它的前面,虚拟主机,它会不断的被向后推移。
如上图,又加入了很多的新块,Y又被推到了冷端头,当再有新块进入Buffer cache时,Y不会是牺牲者,它会被移到热端头S的前面,Y后面的Z,它的访问次数没有达到2,它将会是牺牲者。
好了,这就是Oracle中Buffer cache管理LRU的原理。按照这种方式运作,Oracle可以把常用的块尽量长的保持在Buffer cache中。而且,每有新块进入Buffer cache,Oracle都会从冷端头处,从右向左搜索牺牲块。因为越靠近冷端,块的访问次数有可能越少、最后的访问时间离现在最远。好了,LRU链还没有讲完,下面,我们再讨论一下脏块与脏LRU链的问题。
二、脏块与脏LRU链:
Oracle中修改块的规则是只对Buffer cache中的块进行修改,并不直接修改磁盘中的块。如果要修改的块不在Buffer cache中,Oracle会先将它读入Buffer cache,再在Buffer cache中进行修改。当Buffer cache中的块被修改后,Oracle会把它标记为“脏”块。脏块含有脏数据,脏数据就是用户修改过的数据。Oracle会定期的将脏块写到磁盘中。有一个专门的后台进程就是专门负责写脏块到磁盘的,它就是DBWn。我们也把DBWn写脏块到磁盘这个过程叫做刷新脏块,刷新过后,脏块就不脏了,又变成了干净块。其实,有一个块A,如果Buffer cache中此块的数据和磁盘上块中数据不一致,香港服务器,那么,这个块就是脏块。否则,就是干净块。当修改完成后,因为Oracle只修改Buffer cache,因此,块中数据和磁盘肯定不一致,这时块就是脏块。当块被刷新后,块被写到磁盘,那么,磁盘中块数据和Buffer cache中块的数据又是一致的,此时,块就又变成了干净块。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Python作为当下最大众化的编程语言,相信每天都会有大量的新手朋友进入学习大军的行列。但是无论一门语言是多么的容易学习,其基本概念、基础知识还是比较多的,对于小白来说,一时间要掌握这么多还是有些吃力。今天精选收集了众多Python相关的知识速查表,可以说是包罗万象,以后妈妈再也不用担心大家记不住任何知识点了!Python基础Pythonbasics该速查表包含了所有的Python基本知识,从变量数据类型到列表字符串,从环境安装到常用库的使用,可以说面面俱到。Beginner'sPytho

HTML缓存机制大揭秘:必备的知识点,需要具体代码示例在Web开发中,性能一直是一个重要的考量因素。而HTML缓存机制是提升Web页面性能的关键之一。本文将揭秘HTML缓存机制的原理和实践技巧,并提供具体的代码示例。一、HTML缓存机制的原理Web页面访问过程中,浏览器通过HTTP协议请求服务器获取HTML页面。HTML缓存机制就是将HTML页面缓存在浏览器

如何使用Java实现LRU缓存算法引言:在计算机科学领域,缓存是一种常用的优化技术,用于提高数据读取和写入的速度。LRU(LeastRecentlyUsed)是一种常见的缓存替换策略,它根据数据最近被访问的时间来决定是否从缓存中移除数据。本文将介绍如何使用Java语言实现LRU缓存算法,并提供详细的代码示例。LRU缓存算法的原理LRU缓存算法是一种基于时

一、Python缓存①缓存作用缓存是一种优化技术,可以在应用程序中使用它来将最近或经常使用的数据保存在内存中,通过这种方式来访问数据的速度比直接读取磁盘文件的高很多。假设我们搭建了一个新闻聚合网站,类似于Feedly,其获取不同来源的新闻然后聚合展示。当用户浏览新闻的时候,后台程序会将文章下载然后显示到用户屏幕上。如果不使用缓存技术的话,当用户多次切换浏览相同文章的时候,必须多次下载,效率低下且很不友好。更好的做法就是在获取每篇文章之后,在本地进行内容的存储,比如存储在数据库中;然后,当用户下次

MySQL是世界上最流行的关系型数据库管理系统之一,因其可靠性、高安全性、高扩展性以及相对低的成本而得到了广泛应用。MySQL的数据类型定义了各种数据类型的存储方式,是MySQL的重要组成部分。本文将详解MySQL的数据类型,以及在实际应用中需要注意的一些知识点。一、MySQL的数据类型分类MySQL的数据类型可以分为以下几类:整数类型:包括TINYINT、

Oracle数据类型大揭秘:你必须了解的知识点,需要具体代码示例Oracle作为世界领先的数据库管理系统之一,在数据存储和处理中扮演着重要的角色。在Oracle中,数据类型是非常重要的概念,它定义了数据在数据库中的存储格式、范围和操作方式。本文将揭示Oracle数据类型的各种知识点,并且通过具体的代码示例展示它们的用法和特点。一、常见的数据类型字符型数据类型

网络安全入门:初学者必备知识点是什么?近年来,随着互联网的高速发展,网络安全越来越引起人们的重视。然而,对于很多人来说,网络安全依然是一片未知的海洋。那么,网络安全入门,初学者需要掌握哪些必备知识点呢?本文将为大家梳理一下。一、网络攻击与威胁首先,了解网络攻击和威胁的类型是入门网络安全所必须掌握的知识点。网络攻击的种类多种多样,如钓鱼攻击、恶意软件、勒索软件

重要知识点:掌握CSS响应式布局的必备技巧,需要具体代码示例在现代互联网时代,越来越多的人使用移动设备来浏览网页,因此网页的响应式布局变得尤为重要。响应式布局是指网页能够根据不同的屏幕尺寸和设备类型自动调整布局和样式,以适应不同的用户体验。掌握CSS响应式布局的技巧对于前端开发人员来说是必备的。本文将介绍一些重要的知识点和技巧,并提供具体的代码示例。使用媒体
