高速缓存与缓冲区

2024-06-14 00:08
文章标签 缓冲区 高速缓存

本文主要是介绍高速缓存与缓冲区,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自:http://c.biancheng.net/cpp/html/2634.html

1. 磁盘高速缓存(Disk Cache)

操作系统中使用磁盘高速缓存技术来提高磁盘的I/O速度,对高速缓存复制的访问要比原始数据访问更为高效。例如,正在运行的进程的指令既存储在磁盘上,也存储在物理内存上,也被复制到CPU的二级和一级高速缓存中。

不过,磁盘高速缓存技术不同于通常意义下的介于CPU与内存之间的小容量高速存储器,而是指利用内存中的存储空间来暂存从磁盘中读出的一系列盘块中的信息。因此,磁盘高速缓存在逻辑上属于磁盘,物理上则是驻留在内存中的盘块。

高速缓存在内存中分为两种形式:一种是在内存中开辟一个单独的存储空间作为磁速缓存,大小固定;另一种是把未利用的内存空间作为一个缓沖池,供请求分页系统和磁盘I/O时共享。

2. 缓冲区(Buffer)

在设备管理子系统中,引入缓冲区的目的主要有:
  • 缓和CPU与I/O设备间速度不匹配的矛盾。
  • 减少对CPU的中断频率,放宽对CPU中断响应时间的限制。
  • 解决基本数据单元大小(即数据粒度)不匹配的问题。
  • 提高CPU和I/O设备之间的并行性。

其实现方法有:
  • 釆用硬件缓冲器,但由于成本太高,除一些关键部位外,一般不釆用硬件缓冲器
  • 釆用缓冲区(位于内存区域)。

根据系统设置缓冲器的个数,缓冲技术可以分为:
1) 单缓冲
在设备和处理机之间设置一个缓冲区。设备和处理机交换数据时,先把被交换数据写入缓冲区,然后需要数据的设备或处理机从缓冲区取走数据。

如图5-5所示,在块设备输入时,假定从磁盘把一块数据输入到缓冲区的时间为T,操作系统将该缓冲区中的数据传送到用户区的时间为M,而CPU对这一块数据处理的时间为 C。由于T和C是可以并行的,当T>C时,系统对每一块数据的处理时间为M十T,反之则为M+C,故可把系统对每一块数据的处理时间表示为Max(C, T)+M。


图5-5  单缓冲工作示意图
2) 双缓冲
根据单缓冲的特点,CPU在传送时间M内处于空闲状态,由此引入双缓冲。 I/O设备输入数据时先装填到缓冲区1,在缓冲区1填满后才开始装填缓冲区2,与此同时处理机可以从缓冲区1中取出数据放入用户进程处理,当缓冲区1中的数据处理完后,若缓冲区2已填满,则处理机又从缓冲区2中取出数据放入用户进程处理,而I/O设备又可以装填缓冲区1。双缓冲机制提高了处理机和输入设备的并行操作的程度。

如图5-6所示,系统处理一块数据的时间可以粗略地认为是MAC(C, T)。如果C<T,可使块设备连续输入(图中所示情况);如果C>T,则可使CPU不必等待设备输入。对于字符设备,若釆用行输入方式,则釆用双缓冲可使用户在输入完第一行之后,在CPU执行第一行中的命令的同时,用户可继续向第二缓冲区输入下一行数据。而单缓冲情况下则必须等待一行数据被提取完毕才可输入下一行的数据。


图5-6  双缓冲工作示意图

如果两台机器之间通信仅配置了单缓冲,如图5-7(a)所示。那么,它们在任一时刻都只能实现单方向的数据传输。例如,只允许把数据从A机传送到B机,或者从B机传送到A 机,而绝不允许双方同时向对方发送数据。为了实现双向数据传输,必须在两台机器中都设置两个缓冲区,一个用做发送缓冲区,另一个用做接收缓冲区,如图5-7(b)所示。


图5-7  双机通信时缓冲区的设置
3) 循环缓冲
包含多个大小相等的缓冲区,每个缓冲区中有一个链接指针指向下一个缓冲区,最后一个缓冲区指针指向第一个缓冲区,多个缓冲区构成一个环形。

循环缓冲用于输入/输出时,还需要有两个指针in和out。对输入而言,首先要从设备接收数据到缓冲区中,in指针指向可以输入数据的第一个空缓冲区;当运行进程需要数据时,从循环缓冲区中取一个装满数据的缓冲区,并从此缓冲区中提取数据,out指针指向可以提取数据的第一个满缓冲区。输出则正好相反。
4) 缓冲池
由多个系统公用的缓冲区组成,缓冲区按其使用状况可以形成三个队列:空缓冲队列、装满输入数据的缓冲队列(输入队列)和装满输出数据的缓沖队列(输出队列)。还应具有四种缓冲区:用于收容输入数据的工作缓冲区、用于提取输入数据的工作缓冲区、 用于收容输出数据的工作缓冲区及用于提取输出数据的工作缓冲区,如图5-8所示。


图5-8  缓冲区的工作方式

当输入进程需要输入数据时,便从空缓冲队列的队首摘下一个空缓冲区,把它作为收容输入工作缓冲区,然后把输入数据输入其中,装满后再将它挂到输入队列队尾。当计算进程需要输入数据时,便从输入队列取得一个缓冲区作为提取输入工作缓冲区,计算进程从中提取数据,数据用完后再将它挂到空缓冲队列尾。当计算进程需要输出数据时,便从空缓冲队列的队首取得一个空缓冲区,作为收容输出工作缓冲区,当其中装满输出数据后,再将它挂到输出队列队尾。当要输出时,由输出进程从输出队列中取得一个装满输出数据的缓冲区,作为提取输出工作缓冲区,当数据提取完后,再将它挂到空缓冲队列的队尾。

3. 高速缓存与缓冲区的对比

高速缓存是可以保存数据拷贝的高速存储器,访问高速缓存比访问原始数据更高效速度更快。其对比见表5-1。
表5-1 高速缓存和缓冲区的对比
  高速缓存 缓冲区
 相同点都是介于高速设备和低速设备之间
区别存放数据存放的是低速设备上的某些数据的复制数据,也就是高速缓存上有的低速设备上面必然有存放的是低速设备传递给高速设备的数据(或者是高速设备传送给低速设备的数据),而这些数据在低速设备(或者高速设备)却不一定有备份,这些数据在从缓存区传送到髙速设备(或者低速设备)
目的高速缓存存放的是高速设备经常要访问的数据,如果高速设备要访问的数据不在高速缓存中,高速设备就需要访问低速设备高速设备和低速设备的通信都要经过缓存区,高速设备永远不会直接去访问低速设备

这篇关于高速缓存与缓冲区的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1058813

相关文章

【0324】Postgres内核 Shared Buffer Access Rules (共享缓冲区访问规则)说明

0. 章节内容 1. 共享磁盘缓冲区访问机制 (shared disk buffers) 共享磁盘缓冲区有两套独立的访问控制机制:引用计数(a/k/a pin 计数)和缓冲区内容锁。(实际上,还有第三级访问控制:在访问任何属于某个关系表的页面之前,必须持有该关系表的适当类型的锁。这里不讨论关系级锁。) Pins 在对缓冲区做任何操作之前,必须“对缓冲区pin”(即增加其引用计数, re

工作集、granule、缓冲区、缓冲池概念及关系?

工作集、granule、缓冲区、缓冲池概念及关系? granule:为了让内存在db_chache_size和shared_pool_size之间高效的移动,oracle在9i重构SGA,使用固定大小的内存块即为granule。这个参数就是为什么当你分配给shared pool值的时候,为什么有时候比你分配的值要大一点,但是granule的整数倍。 缓冲区:内存存放数据的地方,类似于数

圆形缓冲区-MapReduce中的

这篇文章来自一个读者在面试过程中的一个问题,Hadoop在shuffle过程中使用了一个数据结构-环形缓冲区。 环形队列是在实际编程极为有用的数据结构,它是一个首尾相连的FIFO的数据结构,采用数组的线性空间,数据组织简单。能很快知道队列是否满为空。能以很快速度的来存取数据。 因为有简单高效的原因,甚至在硬件都实现了环形队列。 环形队列广泛用于网络数据收发,和不同程序间数据交换(比如内核与应用

Kafka【五】Buffer Cache (缓冲区缓存)、Page Cache (页缓存)和零拷贝技术

【1】Buffer Cache (缓冲区缓存) 在Linux操作系统中,Buffer Cache(缓冲区缓存)是内核用来优化对块设备(如磁盘)读写操作的一种机制(故而有一种说法叫做块缓存)。尽管在较新的Linux内核版本中,Buffer Cache和Page Cache已经被整合在一起,但在理解历史背景和功能时,了解Buffer Cache仍然很有帮助。 Buffer Cache 的历史和定义

两个月冲刺软考——概念+求已知内存按字节编址从(A)…到(B)…的存储容量+求采用单/双缓冲区需要花费的时间计算 类型题目讲解

1.四个周期的区别与联系 时钟周期:也称为CPU周期或机器周期,是CPU操作的基本时间单位。 指令周期:是指CPU执行一条指令所需的全部时间。一个指令周期通常由多个时钟周期组成,因为执行一条指令可能需要多个步骤,如取指令、译码、执行、访存和写回等。 总线周期:总线周期是数据在计算机总线上传输所需的时间。 它涉及CPU与其他系统组件(如内存、输入/输出设备)之间的数据传输。一个总线周期可能包括

一个免锁环形缓冲区的实现

面是串口DMA+环形缓冲区的实现,数据收发是异步的,不需要死等。 关于环形缓冲区参考: 1 2 http://blog.csdn.net/jieffantfyan/article/details/53572103 实现原理 程序是在串口中断收发方式的基础上设计的,应用层通过环形缓冲区进行串口数据读取,环形缓冲区作为一级缓存,增加DMA作为二级缓存。相对中断方式这种设计可以减少串口进入中断的次数,

利用Redis高速缓存实现Tomcat集群在Nginx负载均衡机制下的Session共享

为什么要共享session? 我们使用单台Tomcat的时候不会有共享sesssion的疑虑,只要使用Tomcat的默认配置即可,session即可存储在Tomcat 但是随着业务的扩大,增加Tomcat节点构成Tomcat集群大势所趋,分布式带来了增加更大规模并发请求的优势,但是也随之到来了一个问题,每个Tomcat只存储来访问自己的请求产生的session,如果Tomcat-A已经为客

golang基础-终端读(Scanln\bufio)、bufio文件读、、ioutil读读压缩、缓冲区读写、文件写入、文件拷贝

终端读写Scanln、Sscanfbufio带缓冲区的读bufio文件读(1)bufio文件读(2)通过ioutil实现读读取压缩文件文件写入文件拷贝 终端读写Scanln、Sscanf package mainimport ("fmt")var (firstName, lastName, s stringi intf

文章解读与仿真程序复现思路——电网技术@EI\CSCD\北大核心《基于双缓冲区生成对抗模仿学习的电力系统实时安全约束经济调度》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

Linux 用户缓冲区

1. 文件描述符的分配规则 我们知道Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入stdin--0, 标准输出stdout--1, 标准错误stderr--2。0,1,2对应的物理设备一般是:键盘,显示器,显示器.接下来我们来研究文件描述符的分配规则,代码如下。 #include<stdio.h>#include<sys/types.h>#include<sys/st