设为首页 - 加入收藏
广告 1000x90
您的当前位置:144177黄大仙有求必应 > 静态缓冲区 > 正文

Linux高速缓冲区原理

来源:未知 编辑:admin 时间:2019-06-26

  首先我们为什么需要高速缓冲区而不是直接访问块设备中的数据。这是因为,IO设备和内存之间的读写速度不匹配而且有一点数据需要写入或者读出磁盘就访问磁盘,磁盘很快就会损坏,而高速缓冲区就起了一个中间过程的作用,把数据存在高速缓冲区中,需要读取磁盘上的数据时,尝试匹配高速缓冲区中的数据,匹配成功了,那就直接从高速缓冲区中取数据,然后内核再来操作,如果要存入数据,也是先经过缓冲区,再存入磁盘。这样就避免了每次都对IO设备进行操作。

  高速缓冲区在整个物理内存中的位置处于内核区和主内存区之间。这里引用《linux0.11代码完全注释》中的图。

  在高速缓冲区内部,分成了两个部分,一个是缓冲头结构,另一个是缓冲块。每个缓冲块的大小与块设备上的磁盘逻辑块的大小相同,而缓冲头结构用于连接起缓冲块,以及设置一些属性。结构如图:

  那么内核要使用缓冲块时,是怎么和物理设备对应起来的呢?就比如向某个设备写了一些数据,存储在缓冲块中,这个缓冲块怎么才能把数据写入磁盘中。答案是在缓冲头结构中存储了块设备号和缓冲数据的逻辑块号,它们一起唯一确认了缓冲块数据对应的块设备和数据块。并且为了快速的在缓冲区中查看数据块是否在缓冲区中,使用了hash表结构以及空闲缓冲块队列来进行操作和管理,在linux0.11中采用的散列函数是:#define _hash(dev, block) ((unsigned)(dev^block))%NR_HASH。NR_HASH是哈希数组的长度。结构如图:

  在图中,双向箭头代表哈希在同一个表项的双向链表指针,对应b_prev和b_next字段。虚线表示当前连接在空闲缓冲块链表中空闲缓冲块之间的链表指针,free_list是空闲链表的头指针。

  在内核中使用getblk()函数来获取合适的缓冲块。该函数调用get_hash_table()函数,在hash表中确认指定设备号和逻辑块号的缓冲块是否存在,如果存在的话,直接返回对应的缓冲头结构的指针。否则,会从空闲链表头开始对整个空闲链表进行扫描,寻找可以用的空闲缓冲区。有可能可以用的有多个空闲缓冲区,这时就要根据缓冲头结构的修改标志和锁定标志组合而成的权值,来判断哪个空闲块最合适。如果找到的空闲块即没有被修改也没有被锁定,那就使用该空闲块了。如果没有找到空闲块,那就让当前进程进入睡眠,等到继续执行时再次寻找。如果该空闲块被锁定,那么当前进程也需要进入睡眠,等待其它进程解锁。如果在睡眠等待的过程中,该缓冲块又被其它进程占用,就需要重新开始搜索缓冲块了。如果没被其它进程占用,就判断该缓冲块是否已被修改(还未写到盘中),如果已被修改,就将该块写盘,并等待该块解锁。此时如果该缓冲块又被其它进程占用,就又只有重新找空闲的缓冲块了。这里还有一种意外的情况,那就是在当前进程睡眠时,其它进程把我们需要的缓冲块已经加入了hash队列中,所以需要最后搜索一次hash队列,如果在hash队列中找到了该缓冲块,就只好重新执行以上操作了。最后,得到了一块没有被进程引用也没有被上锁以及没有被修改的空闲缓冲块,将该块的引用计数置1,并复位其它的标志,把该缓冲头结构从空闲表中取出。在设置了该缓冲块所属的设备号和相应的逻辑号后,再把该缓冲头结构放入hash表对应表项头部和空闲队列队尾。最后,返回该缓冲块头的指针。流程图如图:

  getblk函数返回的可能是一个新的空闲块,也可能是含有我们需要的数据的缓冲块。因此对于读取数据块操作函数bread(),就需要判断该缓冲块的更新标志,已知道所含数据是否有效,如果有效则直接返回给进程,否则就调用底层块读写函数ll_rw_block(),并同时睡眠,等待数据从物理设备写入缓冲块,醒了之后再重新判断是否有效,如果还是不行,那就释放该缓冲块,并返回NULL。流程图如图:

  当程序想要释放一个缓冲块时,调用brelse()函数,释放缓冲块并唤醒因为等待该缓冲块而进入睡眠的进程。

  最后,除了驱动程序之外,其它上层程序对块设备的读写操作都需要经过高速缓冲区管理程序来实现数据的读写。它们之间的联系主要是通过bread()函数和ll_rw_block()函数实现。如图所示:

  struct buffer_head *h = start_buffer;

  //如果内存末端为1M,则要减掉显存和BIOS所占的内存640K--1M之间

  // 这段代码用于初始化缓冲区,建立空闲缓冲区环链表,并获取系统中缓冲块的数目。

  // 操作的过程是从缓冲区高端开始划分1K 大小的缓冲块,与此同时在缓冲区低端建立描述该缓冲块

  // 的结构buffer_head,并将这些buffer_head 组成双向链表。

  // h 是指向缓冲头结构的指针,而h+1 是指向内存地址连续的下一个缓冲头地址,也可以说是指向h

  // 缓冲头的末端外。为了保证有足够长度的内存来存储一个缓冲头结构,需要b 所指向的内存块

  // 初始化hash 表(哈希表、散列表),置表中所有的指针为NULL。

  文件系统-高速缓冲区:首先我们为什么需要高速缓冲区而不是直接访问块设备中的数据。这是因为,IO设备的读写速度和CPU的处理速度差距太大,而高速缓冲区就起了一个中间过程的作用。需要读取磁盘上的数据时,先...博文来自:Move_now的博客

  为什么oracle能够对于大量数据进行访问时候能彰显出更加出色表现,就是通过所谓的高速缓存来实现数据的高速运算与操作。在之前的博文中我已经说过sql的执行原理,当我们访问数据库的数据时候,首先不是从数...博文来自:wanghjbuf

  本文转自:linux:磁盘缓冲区和页高速缓存的联系与区别博文来自:Alans Blog

  Linux使用的缓存不管在硬件设计还是软件设计中,高速缓存是获得高性能的常用手段。Linux使用了多种和内存管理相关的高速缓存。1.缓冲区高速缓存:   缓冲区高速缓存中包含了由块设备使用的数据缓冲区...博文来自:鱼思故渊的专栏

  注:本文为个人学习过程中的笔记和总结,如有错误,还望指出。Unix文件系统设计文件系统概貌一个文件的表示由一个索引节点来定义,该节点描述了文件在磁盘上的位置布局,以及文件所有者,权限以及存取时间等信息...博文来自:hnzhrh

  关于linux0.11文件系统高速缓冲的见解以下内容截选自《Linux内核完全注释(修正版v3.0)》第12章文件系统。 以上是书中完整的对高速缓冲基本概念的说明。接下来小编我挑选其中一些代码进行进一...博文来自:小棋学编程的博客

  共享池在数据库中可以说是相当重要动力资源,关系着数据库的性能瓶颈。什么是共享池呢?    共享池是内存结构中SGA(系统全局区)的一部分,包含了:库缓冲区、数据字典缓冲区、服务器结果缓冲区、预留池,也...博文来自:Kernelry的专栏

  一.我们可以通过配置SharedPool(保证用户在内存中查找到已经缓存的语句)改进性能;还有一个重要的方法就是:使用户可以在内存找到他们所请求的数据! 这就需要通过DatabaseBufferCac...博文来自:okhymok的博客

  从块设备中读取数据是很慢的(I/O操作相对于内存操作来说是比较慢的),所以为了不让CPU浪费宝贵的时间来等待读取块设备上的数据,就在内存中开辟了一段内存地址用来预获取最近使用过的多块设备块上的数据。当...博文来自:YuZhiHui_No1的专栏

  当select*fromemp;时,服务器进程首先在数据库高速缓冲区中搜索所需的数据。如果找到了就直接使用而不进行磁盘操作,如果没有找到,就进行磁盘操作把数据文件中的数据读入到数据库高速缓冲区中。  ...博文来自:龙神add-走向数据架构师的路

  数据缓冲区高速缓冲缓冲头部一个缓冲区有两部分组成:一个含有磁盘上数据的存储数组和一个标识该缓冲区的缓冲头部。一个缓冲区的数据与文件系统上一个逻辑磁盘块中的数据相对应,并且通过考察缓冲头部中的标识字段来...博文来自:Legendary_life的专栏

  关于Oracle的高速缓存是什么,以及它的原理,请参见:一...博文来自:蜡笔小辛的专栏

  Linux缓冲区介绍标准I/O为我们提供了3种类型的缓冲区:全缓冲区、行缓冲区、无缓冲区。(1)全缓冲区:这种缓冲区默认大小为BUFSIZ,具体大小与系统定义有关。在缓冲区慢或主动调用缓冲区刷新函数f...博文来自:王木木

  1.磁盘高速缓存(DiskCache)操作系统中使用磁盘高速缓存技术来提高磁盘的I/O速度,对高速缓存复制的访问要比原始数据访问更为高效。例如,正在运行的进程的指令既存储在磁盘上,也存储在物理内存上,...博文来自:lijun_nuist的博客

  设置重做日志缓冲区的目的就是为了在数据库崩溃的时候可以进行恢复数据库。当oracle进行dml或者ddl操作的时候,在写数据高速缓冲区之前,先写入重做日志缓冲区。oracle执行dml操作的时候,只有...博文来自:龙神add-走向数据架构师的路

  《Linux/UNIX系统编程手册(全2册)》第13章文件I/O缓冲,本章描述了这两种类型的缓冲,并讨论了其对应用程序性能的影响。本章还讨论了可以屏蔽或影响缓冲的各种技术,以及直接I/O技术--在某些...博文来自:xiaofei0859的专栏

  缓冲区高速缓存Linux 采用了缓冲区高速缓存机制,而不同于其他操作系统的“写透”方式,也就是说,当你把一个数据写入文件时,内核将把数据写入内存缓冲区,而不是直接写入磁盘。在这里要用到一个数据结构 b...博文来自:liuyuanqing2010的专栏

  一.我们可以通过配置SharedPool(保证用户在内存中查找到已经缓存的语句)改进性能; 还有一个重要的方法就是:使用户可以在内存找到他们所请求的数据!这就需要通过DatabaseBufferCac...博文

  ROM是只读内存(Read-OnlyMemory)的简称,是一种只能读出事先所存数据的固态半导体存储器。其特性是一旦储存资料就无法再将之改变或删除。通常用在不需经常变更资料的电子或电脑系统中,资料并...博文来自:HelloJave的博客

  好久没继续,心中有愧呀。一、介绍块设备驱动中包含了三部分代码:硬盘驱动,ramdisk驱动,软盘驱动。这三个部分的代码是一致的,采用了相同的处理方式。就是说对底层来说,不同硬件采用不同的方式读取数据,...博文来自:Amao_come_on 的专栏

  注:2.6内核版本使用下列方式,旧版本内核可以参考内核版本3.2页回写机制可参考:之后版本...博文来自:SweeNeil

  我们都知道在使用泛型时,数值类型要声明为其对应的功能类才能正常使用,不然就会报错。最近我在使用ArrayListInterger进行排序时,发现结果跟我所想的大相庭径,于是我查看了下Interger...博文来自:magician_Coder的博客

  SGA之数据库缓冲区高速缓存数据库缓冲区高速缓存是SGA的一部分,用于存放从数据文件读取的数据块的副本。并行连接到实例的所有用户共享对数据库缓冲区高速缓存的访问。它的管理方法为:LRU(最近最少使用)...博文来自:Rachel715的专栏

  ARP高速缓存里面存放了最近的Internet地址到MAC地址之间的映射记录。高速缓存的每一项的生存时间一般是20分钟,起始时间从被创建时开始计算。LWIP里面的全局变量arp_talbe的结构体成员...博文来自:unsv29的专栏

  对文件系统的一切存取操作,内核都能通过每次直接从磁盘上读或写入磁盘实现,但这样的方式受到磁盘传输速率的限制,比如读写速度较慢的磁盘会使系统的响应时间加长、吞吐率降低。为了解决多次读写磁盘所花费的大量时...博文来自:博客

  如果您买过计算机,那么您肯定听说过“缓存”这个词。现代计算机都有L1和L2缓存,许多计算机现在还有L3缓存。可能还有热心朋友在缓存方面给您出过主意,像“别买赛扬的芯片,它里面没有任何缓存!”。    ...博文来自:王佳伟的博客

  这个官方答案是A。个人觉得应该是B,为什么是A?博文来自:u011423279的博客

  内核设置全局性的缓冲池为进程分配task_struct结构,这些小块存储不局限于某个子程序,并且动态变化。Linux采用slab的缓冲区分配和管理方法。在slab方法中,每种数据结构都有自已专用的缓冲...博文来自:Rebirth__Man的博客

  缓冲技术某种程度上而言也是符合银弹理论,增加了一层抽象层–缓冲区,用于解决上下游机器介质速度不匹配导致的程序速度缓慢的问题。缓冲器是一个存储器,它可以是硬件级的,即独立于内存外设置的专门硬件缓冲器(内...博文来自:墨篙和小奶猫

  本文讲什么?老样子,在正式开始介绍“高速缓冲存储器”之前,我们先来了解一下其相关的信息。我相信,上面这张图你一定已经非常熟悉了,没错,这就是在本章绪论说的“存储器的层次结构”。上一讲我们介绍了存储层次...博文来自:最高权限比特流

  原文连接:这个系列会总结计算机,网络相关的一些重要的底层原理。很多底层原理大家上学的时候都学过...博文来自:FreeeLinuxs blog

  首先,这两个都是属于OracleSGA(系统全局区,SystemGlobalArea)中的内存区域,SGA简单的说就是Oracle从系统内存中划出去自用的内存区域。数据库缓冲池:学名数据库缓冲区缓存(...博文

  1.磁盘高速缓存(DiskCache)操作系统中使用磁盘高速缓存技术来提高磁盘的I/O速度,对高速缓存复制的访问要比原始数据访问更为高效。例如,正在运行的进程的指令既存储在磁盘上,也存储在物理内存上,...博文来自:abel__ing的博客

  应用背景数据采集系统在工业测控、环境监测等方面的应用非常广泛。随着科学技术的发展,数据采集技术正向着高精度、高速度、稳定可靠、集成化及实时系统的方向发展。传统的基于MCU的数据采集、A/D转换产品,无...博文来自:hyesco的专栏

  缓冲刷新(即,数据真正写到输出设备或文件)的原因很多:程序正常结束,作为main函数的renturn操作的一部分,缓冲刷新被执行。缓冲区满时,需要刷新缓冲,而后新的数据才能继续写入缓冲区可以使用操纵符...博文来自:hjhomw的博客

  之所以写这篇博客是因为作者在使用的时候做出了错误的操作作者在文本编辑模式中对文本进行了命令的操作结果发现没有任何的响应,后来发现应该是在指令模式下进行操作,以下就是相应的具体命令删除:x    //删...博文来自:little white cats blog

  数据缓冲区高速缓冲在内核启动初始化是被划分成1024、2048块大小的双向链表形式而被内核管理的。同时还有一组哈希队列使得内核可以快速找到所需数据的缓冲块是否在高速缓冲中。一个哑节点free_list...博文来自:lmdyyh5722756的专栏

  1、前言最近项目中用到一个环形缓冲区(ringbuffer),代码是由linux内核的kfifo改过来的。缓冲区在文件系统中经常用到,通过缓冲区缓解cpu读写内存和读写磁盘的速度。例如一个进程A产...博文来自:鱼思故渊的专栏

  4.1           Sed工作原理 sed是一个非交互式的流编辑器。所谓非交互式,是指使用sed只能在命令行下输入编辑命令来编辑文本,然后在屏幕上查看输出;而所谓流编辑器,是指sed每次只从文...博文来自:huangmr的专栏

  NIO1、通道2、缓冲区 (间接内存-非直接缓冲区,直接内存--直接缓冲区)3、阻塞通道示例4、非阻塞通道示例----选择器(多路复用IO模型)---主要是将通道和selector·选择器进行绑定,基...博文来自:Mark2When的博客

  在上一篇聊聊高并发(三十三)从一致性(Consistency)的角度理解Java内存模型我们说了Java内存模型是一个语言级别的内存模型抽象,它屏蔽了底层硬件实现内存一致性需求的差异,提供了对上层的统...博文来自:ITer_ZC的专栏

  [3]:环形缓冲区   前一个帖子提及了队列缓冲区可能存在的性能问题及解决方法:环形缓冲区。今天就专门来描述一下这个话题。  为了防止有人给咱扣上“过度设计”的大帽子,事先声明一下:只有当存储空间的分...博文来自:Thinking in code

  先说一下保护消息边界,就是指传输协议把数据当作一条独立的消息在网上传输,接收端只能接收独立的消息。这个机制决定了udp的特性:1.udp可以多线程对同一个fd进行发包操作,如果是tcp多线程发送,会让...博文来自:Linux C/C++后台开发

  高速电机的命名定义:高速电机,也称主轴电机,广义范围来讲,高速电机又可以被称为电主轴,高速电主轴等等,通常是指转速超过10000r/min的电机,目前最高转速可达300000r/min高速电机又分为:...博文

  编写高效的程序不止在于算法的精巧,还要尽可能贴合计算机的硬件,最大化硬件效益,最佳利用CPU微指令、缓存等。其中缓存的意义可见重要。缓存的主要作用是暂时保存数据,供下次访问时使用。出现背景早期的存储层...博文来自:Java X

  本篇文章是根据我的上篇博客,给出的改进版,由于时间有限,仅做了一个简单的优化。相关文章:将excel导入数据库2018年4月1日,新增下载地址链接:点击打开源码下载地址十分抱歉,这个链接地址没有在这篇...博文来自:Lynn_Blog

  最近比较有空,大四出来实习几个月了,作为实习狗的我,被叫去研究Docker了,汗汗! Docker的三大核心概念:镜像、容器、仓库 镜像:类似虚拟机的镜像、用俗话说就是安装文件。 容器:类似一个轻量...博文来自:我走小路的博客

  前言:前段时间做项目用到了图片裁剪,调用系统裁剪图片,结果在我的小米3上一直有问题,裁剪界面打不开,在其他设备上没问题,于是研究其他软件是怎么做的,淘宝的裁剪图片是自己做的,当然没问题,京东的是调用的...博文来自:zwenkai

  Intellij IDEA 如何通过数据库表生成带注解的实体类图文详细教程 Intellij IDEA 如何通过数据库表生成带注解的实体类 Contents 第一步:新建...博文来自:liu_yulong的专栏

  灰度图像的自动阈值分割(Otsu 法)机器视觉领域许多算法都要求先对图像进行二值化。这种二值化操作阈值的选取非常重要。阈值选取的不合适,可能得到的结果就毫无用处。今天就来讲讲一种自动计算阈值的方法。这...博文来自:Ivan 的专栏

  用以前以前写过的自定义课表软件 ,Android 自定义View课程表表格 原生View截图合成分享的图片 看到的是图片只显示到11节处,下面的没有...博文来自:ShallCheek

  本matplotlib安装过程在一定程度上参考了 因为学习机器学习的需要,又准备参考《机器学...博文来自:SCUT_Arucee的博客

  1.为什么是Fiddler? 抓包工具有很多,小到最常用的web调试工具firebug,达到通用的强大的抓包工具wireshark.为什么使用fiddler?原因如下: a.Firebug虽然可以抓包...博文来自:专注、专心

  servlet页面代码:@每次请求时产生一个token(一般为时间戳),存于session中并随之用hidden提交,在servlet中判断接收到的token和session中的是否一致来判断是否重复...博文来自:高调做事,低调做人!

  首先,确定你已经有了CSR证书请求、开发证书和App ID。如果你不是第一次开发iOS应用程序,那么你可能已经有了这些东西。那么你可以继续以下的步骤。一、配置App ID登录你的provisionin...博文来自:kmyhy的专栏

  目前还没有写出这个demo,不过可以参考下面这两个链接,一个是显示日期的,还有一个是合并单元格: 合并单元格: 博文来自:dddd的博客

  以回归为例吧,回归在某些场合可能更精准 支持连续变量和类别变量,类别变量就是某个属性有三个值,a,b,c,需要用Feature Transformers中的vectorindexer处理 上来是一堆...博文来自:chencheng12077的博客

  扫二维码关注,获取更多技术分享 本文承接之前发布的博客《 微信支付V3微信公众号支付PHP教程/thinkPHP5公众号支付》必须阅读上篇文章后才可以阅读这篇文章。由于最近一段时间工作比较忙,...博文来自:Marswill

  强连通分量: 简言之 就是找环(每条边只走一次,两两可达) 孤立的一个点也是一个连通分量   使用tarjan算法 在嵌套的多个环中优先得到最大环( 最小环就是每个孤立点)   定义: int Ti...博文来自:九野的博客

  jquery/js实现一个网页同时调用多个倒计时(最新的) 最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! //js ...博文来自:Websites

  简述关于gif的使用在实际项目中我用的并不多,因为我感觉瑕疵挺多的,很多时候锯齿比较严重,当然与图存在很大的关系。关于生成gif的方法可以提供一个网站preloaders,基本是可以满足需求的。简述 ...博文来自:本博客暂停更新,后期专注维护个人公众号『高效程序员』,欢迎关注!

  今天为了休息下,换换脑子,于是就找到了我之前收藏的一篇python的文章,是关于ddos攻击的一个脚本,正好今天有空,就实践下了。 附上源码pyDdos.py: #!/usr/bin/env ...博文来自:jeepxiaozi的专栏

本文链接:http://that-a-way.com/jingtaihuanchongqu/227.html

相关推荐:

网友评论:

栏目分类

现金彩票 联系QQ:24498872301 邮箱:24498872301@qq.com

Copyright © 2002-2011 DEDECMS. 现金彩票 版权所有 Power by DedeCms

Top