`
wsql
  • 浏览: 11794336 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

深入理解缓冲区(十)

 
阅读更多

4.1.4.3 Buf的主体结构

形式上是“char *”,本质上是内存开辟出的一块地址连续的区域。

关键问题是:数据库如何使用这块区域(缓冲区调度算法)。

4.1.4.4 Buf的置换调度策略管理相关数据结构

第一个相关结构:SharedBufHash

作用:哈希表,用于缓存块的快速查找。

第二个相关结构:BufferStrategyControl

/*

* The shared freelist control information.

*/

typedef struct

{

/* Clock sweep hand: index of next buffer to consider grabbing */

int nextVictimBuffer; // 指向缓存块(缓存块是地址连续的,所以把缓存块当作数组,用int型下标即可表示下一个要被置换的缓存块的位置)

int firstFreeBuffer; /* Head of list of unused buffers */

int lastFreeBuffer; /* Tail of list of unused buffers */

/*

* NOTE: lastFreeBuffer is undefined when firstFreeBuffer is -1 (that is,

* when the list is empty)

*/

/*

* Statistics. These counters should be wide enough that they can't

* overflow during a single bgwriter cycle.

*/

uint32 completePasses; /* Complete cycles of the clock sweep */

uint32 numBufferAllocs; /* Buffers allocated since last reset */

} BufferStrategyControl;

深入理解缓冲区(十) - 那海蓝蓝 - 那海蓝蓝的博客

说明:

1. 上图,左侧,是解释区,第一椭圆说明了整体缓存的情况;第二个椭圆表示PostgreSQL数据库初始化后,在data(数据目录)中初始化出的配置文件,此文件存放数据启动、运行时需要的各种参数,其中,有关缓存的参数是“shared_buffers”,表示缓冲区大小,实际大小的计算方式,参见上图;“NBuffers”是代码中和缓冲区相关的变量,其值源于GUC参数“shared_buffers”。

2. 上图,右侧,是缓冲区。由四块地址连续的区域组成。分别是:缓存头、缓存块集合、缓存块快速查找hashtable、置换策略指示器。

3. 缓冲区的第一个部分:【缓存头】,与【缓存块集合】一一对应,每一个缓存块,都有自己的一份使用情况信息,保存在【缓存头中】。

4. 缓冲区的第二个部分:【缓存块集合】,与外存的数据块对应,是n:m的关系。当缓存块还有空闲的时候,则从空闲链表中取缓存块共上层(数据访问层)使用,否则,使用“clock”算法,淘汰一个页面(页面大小对应一个块,8k),然后给这个页面置相应值(如可能读入新数据到缓存块)并他的元信息(缓存头中对应的使用情况信息,如是否加锁等),最后返回这个块

5. 缓冲区的第三个部分:【缓存块快速查找hashtable】,把所有缓存块注册到一个hash表中,便于快速查找缓存块

6. 缓冲区的第四个部分:【置换策略指示器】,与缓存块的页面淘汰算法直接相关,指示了哪个缓存块可以被淘汰(注意图中从【置换策略指示器】发出的线的指向,对应的变量是nextVictimBuffer,其用法“nextVictimBuffer++”,表明缓存块是从前到后逐个被淘汰的,这就是简单的“clock”算法,但并非说:缓存块是依次被淘汰,而是从前到后,找到没有被使用的、可被淘汰的---如脏页、引用计数为零的---进行淘汰,当nextVictimBuffer达到最大值,则变为零,从前面再重新开始淘汰)。


分享到:
评论

相关推荐

    《深入理解计算机系统》3.38题解——缓冲区溢出攻击实例文档

    本文主要以《深入理解计算机》3.38题为例,详细地介绍了该题目的解题过程,主要目的是利用程序缓冲区溢出以达到改变程序的输出(攻击程序)。 要解决这类题目,需要对过程调用的栈帧变化、指令的作用有较深入的了解...

    linux下缓冲区溢出攻击源代码

    经典缓冲区溢出攻击源代码,包含详细的分析文档,不可多得的 <br>资源,对于理解缓冲区溢出原理以及汇编语言有很好的帮助。《 <br>深入理解计算机系统》一书中使用到的例子,我将这个例子进行 <br>了详细的...

    深入理解scanf函数输入时键盘缓冲区

    本文从根本上讲解了scanf函数的应用,以及输入时键盘缓冲区的数据形式,相信读完之后你会对scanf有更深一层次的认识。

    深入理解程序设计使用Linux汇编语言

    深入理解程序设计.使用Linux汇编语言...., 文件处理及缓冲区分析;, 记录读写及修改;, 通过测试及错误处理打造健壮程序;, 程序共享;, 内存布局及处理;, 计算机的计数原理;, 程序优化(时机、位置及方式)。

    linux内存和缓冲区完美教程大全

    应大家要求上传。可嵌入到工程上的C语言实现的内存泄漏检查代码!!!!!!!!!!深入理解LINUX内存管理学习笔记。常见的内存错误。以及缓冲区缓冲区溢出攻击:原理,防御及检测,并给出全部代码以及ppt

    深入理解Linux内核-勘误表

    这就是"等待队列".(有多种原因可以让进程进入TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE状态, 如等待缓冲区被填充, 等待 锁被释放等, 于是就构造一个链表, 链表中的进程都在等待同一事件的产生.).解Linux内核正版...

    《深入理解JAVA内存模型》PDF

    在java中,所有实例域、静态域和数组元素存储在堆内存中,堆内存在线程之间共享(本文使用“共享变量”这个术语代指实例域,静态域和数组...它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。 。。。。。。

    缓冲区溢出学习的入门教程-Q版缓冲区溢出教程

    缓冲区溢出学习的入门教程,深入浅出,非常容易理解。比较详细,从基础讲起,用实例分析,适合新手入门学习。

    深入理解计算机系统(原书第2版)[英文版]

    2. 增加了很多关于由算术运算溢出以及缓冲区溢出造成安全漏洞的内容。 3. 更详细讲述了处理器对异常的发现和处理。 4. 描述了基于Intel Core i7处理器的存储器层次结构,还增加了固态硬盘的内容。 5. 强调并发性...

    深入理解Surface系统

    以android4.1代码为基础,综合了网络上的内容,加入了自己的一些理解。 目录: Activity的启动与GSurface的创建 Activity与...共享内存缓冲区同步策略 SurfaceView实现原理分析 特殊的应用——Chromium

    深入理解iPhone屏幕双缓冲技术

    笔者在最近项目的开发中需要使用到“屏幕双缓冲”技术,“屏幕双缓冲”是GUI客户端中最经常使用的一种技术,但是这种技术在iPhone平台似乎很少被人使用到,网上的资料基本很难找到,这点让笔者很是不解.

    C语言中输入输出流与缓冲区的深入讲解

    一般情况下,由键盘输入的字符并没有直接送入程序,而是被存储在一个缓冲区当中。下面这篇文章主要给大家介绍了关于C语言中输入输出流与缓冲区的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

    _Attacklab实验报告.pdf

    种攻击,目的就在于:当程序没有对缓冲区溢出做足够防范时,立交 攻击者可能会如何利用这些安全漏洞 ;通过实验,能更好的理解写 出安全的程序的重要性,也能了解到一些编译器和操作 ;以及系统 提供的帮助改善...

    深刻理解java io

    1) ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用 2) StringBufferInputStream:把一个String对象作为InputStream 3) FileInputStream:把一个文件作为InputStream,实现对文件的读取操作 4) ...

    深入理解Java源码:提升技术功底,深度掌握技术框架,快速定位线上问题

    ByteBuf内存池设计可以实现缓冲区的重用,提高性能。灵活的TCP参数配置能力可以满足不同的用户场景。并发优化包括volatile的大量、正确使用,CAS和原子类的广泛使用,线程安全容器的使用,以及通过读写锁提升并发...

    php中ob函数缓冲机制深入理解

    对于一个刚刚入门的php程序员来说,php缓冲区是几乎透明的。在他们心目中,一个echo print_r 函数,数据便会‘嗖’的一声飞到浏览器上,显示出来。我也一直如此单纯地认为。 其实,在技术的世界里,向来都是由简单到...

    Buffer-Overflows:缓冲区溢出漏洞利用介绍

    先决条件在深入研究缓冲区溢出之前,您应该熟悉: 基本的 C/C++ 理解。 Linux 权限。 基本装配知识。 GDB 和程序内存分配(堆栈、帧)。 GNU 项目调试器(又名 GDB)特别有用,因为我不会详细介绍如何使用它,如果您...

    基于C语言开发的环形缓冲区.zip

    在进行毕业设计、课程设计或大作业时,选择具备学习借鉴价值的项目可以帮助你理解和应用所学知识,同时也可以通过修改和扩展来实现其他功能。 通过参与实际项目,你可以应用所学的理论知识,深入了解软件开发或其他...

    并发控制-生产者-消费者问题实验报告

    并发控制-生产者-消费者问题实验报告

Global site tag (gtag.js) - Google Analytics