• Linux34_buffer和cache


    buffer(缓冲)是为了提高内存和硬盘(或其他I/O设备)之间的数据交换的速度而设计的。

    cache(缓存)从CPU角度考虑,是为了提高cpu和内存之间的数据交换速度而设计的。

    Buffer的核心作用是用来缓冲,缓和冲击。

    比如你每秒要写100次硬盘,对系统冲击很大,浪费了大量时间在忙着处理开始写和结束写这两件事嘛。

    用个buffer暂存起来,变成每10秒写一次硬盘,对系统的冲击就很小,写入效率高了,日子过得爽了。极大缓和了冲击。

    Cache的核心作用是加快取用的速度。

    比如你一个很复杂的计算做完了,下次还要用结果,就把结果放手边一个好拿的地方存着,下次不用再算了。

    加快了数据取用的速度。简单来说就是buffer偏重于写,而cache偏重于读。



    内存与缓存区(cache):

    内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。
    计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。
    内存(Memory)也被称为内存储器,其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。

    缓存是CPU的一部分,它存在于CPU中,CPU存取数据的速度非常的快,一秒钟能够存取、处理十亿条指令和数据(术语:CPU主频1G),
    而内存就慢很多,快的内存能够达到几十兆就不错了,可见两者的速度差异是多么的大。

    缓存是为了解决CPU速度和内存速度的速度差异问题。
    内存中被CPU访问最频繁的数据和指令被复制入CPU中的缓存,这样CPU就可以不经常到象“蜗牛”一样慢的内存中去取数据了,
    CPU只要到缓存中去取就行了,而缓存的速度要比内存快很多。

    因为缓存只是内存中少部分数据的复制品,所以CPU到缓存中寻找数据时,也会出现找不到的情况(因为这些数据没有从内存复制到缓存中去),
    这时CPU还是会到内存中去找数据,这样系统的速度就慢下来了,不过CPU会把这些数据复制到缓存中去,以便下一次不要再到内存中去取。

    因为随着时间的变化,被访问得最频繁的数据不是一成不变的,也就是说,刚才还不频繁的数据,此时已经需要被频繁的访问,
    刚才还是最频繁的数据,现在又不频繁了,所以说缓存中的数据要经常按照一定的算法来更换,这样才能保证缓存中的数据是被访问最频繁的。

    内存有RAM和ROM两种
    RAM(随机存储器) 和ROM(只读存储器)
    RAM是掉电以后,其中信息就消失;
    ROM在掉电以后信息也不会消失;

    RAM又分两种
    一种是静态RAM:SRAM;
    一种是动态RAM:DRAM。
    前者的存储速度要比后者快得多,我们现在使用的内存一般都是动态RAM。

    缓存通常都是静态RAM,速度是非常的快,但是静态RAM集成度低(存储相同的数据,静态RAM的体积是动态RAM的6倍),价格高(同容量的静态RAM是动态RAM的四倍),
    由此可见,扩大静态RAM作为缓存是一个非常愚蠢的行为,但是为了提高系统的性能和速度,我们必须要扩大缓存,这样就有了一个折中的方法,
    不扩大原来的静态RAM缓存,而是增加一些高速动态RAM做为缓存, 这些高速动态RAM速度要比常规动态RAM快,但比原来的静态RAM缓存慢,
    我们把原来的静态ram缓存叫一级缓存,而把后来增加的动态RAM叫二级缓存。
    一级缓存二级缓存中的内容都是内存中访问频率高的数据的复制品(映射),
    它们的存在都是为了减少高速CPU对慢速内存的访问。

    通常CPU找数据或指令的顺序是:先到一级缓存中找,找不到再到二级缓存中找,如果还找不到就只有到内存中找;



     磁盘与缓冲区(buffer):

    扇区设备的最小寻址单元,也叫 "硬扇区" 或 "设备块"。

    是操作系统中文件系统的最小寻址单元,也叫 "文件块" 或 "I/O 块"。

    每个块包含一个或多个扇区,但大小不能超过一个页面,所以一个页可以容纳一个或多个内存中的块。

    当一个块被调入内存时,它要存储在一个缓冲区中。每个缓冲区与一个块对应,它相当于是磁盘块在内存中的表示。

    buffer 在操作系统中指 buffer cache, 中文一般翻译为 "缓冲区"。

    buffer cache 只有块的概念而没有文件的概念,它只是把磁盘上的块直接搬到内存中而不关心块中究竟存放的是什么格式的文件。



    Buffer和page chche:

    buffers是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。

    linux有一个守护进程定期清空缓冲内容(即写入磁盘),也可以通过sync命令手动清空缓冲。

    缓冲区(buffer),它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间;

    这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区,显然缓冲区是具有一定大小的。

    缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。

    高速设备与低速设备的不匹配,势必会让高速设备花时间等待低速设备,我们可以在这两者之间设立一个缓冲区。

    缓冲区的作用:
    可以解除两者的制约关系,数据可以直接送往缓冲区,高速设备不用再等待低速设备,提高了计算机的效率。

    可以减少数据的读写次数,如果每次数据只传输一点数据,就需要传送很多次,这样会浪费很多时间,

    因为开始读写与终止读写所需要的时间很长,如果将数据送往缓冲区,待缓冲区满后再进行传送会大大减少读写次数,这样就可以节省很多时间。

    它使得低速的输入输出设备和高速的CPU能够协调工作,避免低速的输入输出设备占用CPU,解放出CPU,使其能够高效率工作。

    下列情况会引发缓冲区的刷新:
      缓冲区满时;
      关闭文件。
    可见,缓冲区满或关闭文件时都会刷新缓冲区,进行真正的I/O操作。

    page cache,中文一般翻译为 "页高速缓存"。

    页高速缓存是内核实现的磁盘缓存。它主要用来减少对磁盘的 I/O 操作。

    具体地讲,是通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问。

    页高速缓存缓存的是内存页面。缓存中的页来自对普通文件、块设备文件(这个指的就是 buffer cache 呀)和内存映射文件的读写。

    页高速缓存对普通文件的缓存我们可以这样理解:

    当内核要读一个文件(比如 /etc/hosts)时,它会先检查这个文件的数据是不是已经在页高速缓存中了。

    如果在,就放弃访问磁盘,直接从内存中读取。这个行为称为缓存命中。

    如果数据不在缓存中,就是未命中缓存,此时内核就要调度块 I/O 操作从磁盘去读取数据。

    然后内核将读来的数据放入页高速缓存中。这种缓存的目标是文件系统可以识别的文件(比如 /etc/hosts)。

    页高速缓存对块设备文件的缓存就是我们在前面介绍的 buffer cache。

    因为独立的磁盘块通过缓冲区也被存入了页高速缓存(缓冲区最终是由页高速缓存来承载的)。

    到这里我们应该搞清楚了:无论是缓冲区还是页高速缓存,它们的实现方式都是一样的。

    缓冲区只不过是一种概念上比较特殊的页高速缓存罢了。//页告诉缓存和缓冲区是一回事,都是内存空间内的缓冲区

    那么为什么 free 命令不直接称为 cache 而非要写成 buff/cache?

    这是因为缓冲区和页高速缓存的实现并非天生就是统一的。

    在 linux 内核 2.4 中才将它们统一。

    更早的内核中有两个独立的磁盘缓存:页高速缓存缓冲区高速缓存。前者缓存页面,后者缓存缓冲区。

    buffer是即将要被写入磁盘的,而page cache是被从磁盘中读出来的。

    buffer是由各种进程分配的,被用在如输入队列等方面。

    一个简单的例子如某个进程要求有多个字段读入,在所有字段被读入完整之前,进程把先前读入的字段放在buffer中保存。

    page cache经常被用在磁盘的I/O请求上,如果有多个进程都要访问某个文件,于是该文件便被做成page cache以方便下次被访问,这样可提高系统性能。



    Cache:

    cache:缓存区,是高速缓存,是位于CPU和主内存之间的容量较小但速度很快的存储器,因为CPU的速度远远高于主内存的速度;

    CPU从内存中读取数据需等待很长的时间,而Cache保存着CPU刚用过的数据或循环使用的部分数据;

    这时从Cache中读取数据会更快,减少了CPU等待的时间,提高了系统的性能。

    cache并不是缓存文件的,而是缓存块的(块是I/O读写最小的单元);

    cache一般会用在I/O请求上,如果多个进程要访问某个文件,可以把此文件读入cache中,

    这样下一个进程获取CPU控制权并访问此文件直接从Cache读取,提高系统性能。



    参考链接:

    Linux中Buffer和Cache的区别: https://www.cnblogs.com/qiaoyanlin/p/6746791.html
    缓冲区(buffer)与缓存(cache):https://www.cnblogs.com/mlgjb/p/7991903.html

    一级缓存和二级缓存的理解:https://blog.csdn.net/weixin_34409741/article/details/85840650?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control

  • 相关阅读:
    JQuery checkbox全选多次点击后无效解决方法
    mongodb更新数据
    EasyUI--datebox设置默认时间
    转载:MyEclipse中防止代码格式化时出现换行的情况的设置
    Java 多维数组 按某列 排序
    Java Entry使用
    matlab使用reshape时按照列优先原则取元素和摆放元素
    boost--signal
    boost--function
    boost--bind
  • 原文地址:https://www.cnblogs.com/grooovvve/p/14176197.html
Copyright © 2020-2023  润新知