4.1.6 并行计算对buf置换的影响
并行计算对buf置换的影响,是指在多用户状态下,对buf中的缓存块同时读写时缓冲区的调度、处理、需要考虑的问题等等。
假设,A、B是三名仓库管理员,各管着100个仓库,每个仓库装入、取出哪个货主的货物,由管理员负责管理分配
A管理员,当有货主想取货物时,A都带着货主去每个仓库辨认一下货物是否是货主的,如是,则给货主支取;当有货主想存货物时,A都去每个仓库看一下,找到一个空的仓库,把货物存放进去;当货主想存货物而没有空仓库时,上级曾经规定,把最长不来取货的仓库腾空给新货主使用,所以,A管理员有个清理仓库的职责,但如果货物有价值,则先保存(到另外地方)货物使得仓库可被再用。
B管理员,是个聪明的人,他不想在有货主提取或存入货物时老跑每个仓库查看具体情况,而是把每个仓库、货主的情况记载下来(元信息),每次货主存取货物,都先查记载,这样便于管理。
C管理员,管理着高级仓库,每个仓库存储的货物,可以为多个货主提供存取服务(即每个仓库中的货物,可以被一个货主独占,也可以被多个或者共同查看—读、独自取—写)。
这样的假设,表明了对于仓库管理的需求和实际管理方式, B、C结合的管理,是最好的选择。
从代码的角度,在“4.1.4.2 Buf的元信息结构”节中,给出的BufferDesc结构的内容:
BufferDesc结构的成员
|
加减锁
操作函数/宏
|
锁模式
|
说明
|
buf_hdr_lock
|
LockBufHdr
UnlockBufHdr
|
PG的自旋锁(SpinLock)
|
1. 对自己(BufferDesc)进行保护
2. 当有refcount、usage_count等需要被改写时,加buf_hdr_lock锁
|
io_in_progress_lock
|
LWLockAcquire
LWLockRelease
|
LW_SHARED
LW_EXCLUSIVE
|
1. 为本层(数据缓冲区)与下层(数据存储层)交换数据提供防止并发错误的机制
|
content_lock
|
LockBuffer
UnlockBuffers
|
BUFFER_LOCK_SHARE
BUFFER_LOCK_EXCLUSIVE
|
1. 对缓冲区进行保护
2. 当上层(数据访问层)读写缓冲区可能发生冲突时,可以使得读读并发,读写并发时先读不影响写、写不影响读
3. 为上层访问缓冲区提供防止并发错误的机制
|
BufferDesc结构的其他成员
|
数据类型
|
作用
|
说明
|
tag
|
BufferTag
|
外存的物理块的地址,是联系外存(物理地址)和内容(buf)的关键部分
|
|
flags
|
BufFlags
|
描述buf处于的状态
Buf从空闲到被使用,期间,可以被修改(脏页,BM_DIRTY
),脏页需要被刷出才可重用;
Buf也可以出于正在被读入或刷出状态,这时,会特别标识为BM_IO_IN_PROGRESS;
当buf出现错误时,会报告错误。
|
可以有下述状态:
BM_DIRTY
BM_VALID
BM_TAG_VALID
BM_IO_IN_PROGRESS
BM_IO_ERROR
BM_JUST_DIRTIED
BM_PIN_COUNT_WAITER
BM_CHECKPOINT_NEEDED
|
usage_count
|
uint16
|
使用计数器。被使用多少次,都自增1,直到涨到最大(用BM_MAX_USAGE_COUNT表示最大的限制数)
|
|
refcount
|
unsigned
|
Pin计数器(引用计数器)。被backend(带有用户连接的进程)pin住多少次。
|
|
buf_id
|
int
|
指向buf缓冲区的“指针”(buf缓冲区使用数组,所以用int做下标暂称之为指针)
|
|
freeNext
|
int
|
执行空闲缓冲区的“指针”(buf缓冲区使用数组,所以用int做下标暂称之为指针)
|
|
特别注意:
Buf,是内存操作,是内外存交流的汇集点,起着承上启下的作用,但其本身位于内存中,故很多操作,和内存紧密相关,需要特别的注意。
很多细节,需要阅读代码+仔细揣摩、才能明白体会深刻。很多与其他模块相关联的点,没有提及,但可能也影响着buf的管理。
分享到:
相关推荐
本文主要以《深入理解计算机》3.38题为例,详细地介绍了该题目的解题过程,主要目的是利用程序缓冲区溢出以达到改变程序的输出(攻击程序)。 要解决这类题目,需要对过程调用的栈帧变化、指令的作用有较深入的了解...
经典缓冲区溢出攻击源代码,包含详细的分析文档,不可多得的 <br>资源,对于理解缓冲区溢出原理以及汇编语言有很好的帮助。《 <br>深入理解计算机系统》一书中使用到的例子,我将这个例子进行 <br>了详细的...
深入理解程序设计.使用Linux汇编语言...., 文件处理及缓冲区分析;, 记录读写及修改;, 通过测试及错误处理打造健壮程序;, 程序共享;, 内存布局及处理;, 计算机的计数原理;, 程序优化(时机、位置及方式)。
本文从根本上讲解了scanf函数的应用,以及输入时键盘缓冲区的数据形式,相信读完之后你会对scanf有更深一层次的认识。
应大家要求上传。可嵌入到工程上的C语言实现的内存泄漏检查代码!!!!!!!!!!深入理解LINUX内存管理学习笔记。常见的内存错误。以及缓冲区缓冲区溢出攻击:原理,防御及检测,并给出全部代码以及ppt
本文将对数据库缓冲区溢出漏洞的原理进行深入分析,并探讨其风险性和防范方法。 一、数据库缓冲区溢出漏洞的定义 缓冲区溢出是一种常见的安全漏洞,存在于数据库系统中。它是指将大的数据存入小缓冲区,而不对存入...
这就是"等待队列".(有多种原因可以让进程进入TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE状态, 如等待缓冲区被填充, 等待 锁被释放等, 于是就构造一个链表, 链表中的进程都在等待同一事件的产生.).解Linux内核正版...
在java中,所有实例域、静态域和数组元素存储在堆内存中,堆内存在线程之间共享(本文使用“共享变量”这个术语代指实例域,静态域和数组...它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。 。。。。。。
缓冲区溢出学习的入门教程,深入浅出,非常容易理解。比较详细,从基础讲起,用实例分析,适合新手入门学习。
2. 增加了很多关于由算术运算溢出以及缓冲区溢出造成安全漏洞的内容。 3. 更详细讲述了处理器对异常的发现和处理。 4. 描述了基于Intel Core i7处理器的存储器层次结构,还增加了固态硬盘的内容。 5. 强调并发性...
以android4.1代码为基础,综合了网络上的内容,加入了自己的一些理解。 目录: Activity的启动与GSurface的创建 Activity与...共享内存缓冲区同步策略 SurfaceView实现原理分析 特殊的应用——Chromium
一般情况下,由键盘输入的字符并没有直接送入程序,而是被存储在一个缓冲区当中。下面这篇文章主要给大家介绍了关于C语言中输入输出流与缓冲区的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
笔者在最近项目的开发中需要使用到“屏幕双缓冲”技术,“屏幕双缓冲”是GUI客户端中最经常使用的一种技术,但是这种技术在iPhone平台似乎很少被人使用到,网上的资料基本很难找到,这点让笔者很是不解.
种攻击,目的就在于:当程序没有对缓冲区溢出做足够防范时,立交 攻击者可能会如何利用这些安全漏洞 ;通过实验,能更好的理解写 出安全的程序的重要性,也能了解到一些编译器和操作 ;以及系统 提供的帮助改善...
1) ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用 2) StringBufferInputStream:把一个String对象作为InputStream 3) FileInputStream:把一个文件作为InputStream,实现对文件的读取操作 4) ...
ByteBuf内存池设计可以实现缓冲区的重用,提高性能。灵活的TCP参数配置能力可以满足不同的用户场景。并发优化包括volatile的大量、正确使用,CAS和原子类的广泛使用,线程安全容器的使用,以及通过读写锁提升并发...
5. Linux 网络设备驱动包处理的动作:传统的网络设备驱动包处理的动作可以概括为:数据包到达网卡设备,网卡设备依据配置进行 DMA 操作,网卡发送中断,唤醒处理器,驱动软件填充读写缓冲区数据结构,数据报文达到...
对于一个刚刚入门的php程序员来说,php缓冲区是几乎透明的。在他们心目中,一个echo print_r 函数,数据便会‘嗖’的一声飞到浏览器上,显示出来。我也一直如此单纯地认为。 其实,在技术的世界里,向来都是由简单到...
先决条件在深入研究缓冲区溢出之前,您应该熟悉: 基本的 C/C++ 理解。 Linux 权限。 基本装配知识。 GDB 和程序内存分配(堆栈、帧)。 GNU 项目调试器(又名 GDB)特别有用,因为我不会详细介绍如何使用它,如果您...