缓冲区(Buffer)定义

缓冲区(Buffer),它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区,显然缓冲区是具有一定大小的。

有时候,从键盘输入的内容,或者将要输出到显示器上的内容,会暂时进入缓冲区,待时机成熟,再一股脑将缓冲区中的所有内容“倒出”,我们才能看到变量的值被刷新,或者屏幕产生变化。

有时候,用户希望得到最及时的反馈,输入输出的内容就不能进入缓冲区。

为什么要引入缓冲区?

首先,缓冲区可以使低速的输入输出设备和高速运行的程序能够协调工作。
一般来说程序在CPU上运行,其速度必定远超过一般硬件运行速度。例如,硬盘的速度要远低于 CPU,它们之间有好几个数量级的差距,当向硬盘写入数据时,程序需要等待,不能做任何事情,就好像卡顿了一样,用户体验非常差。计算机上绝大多数应用程序都需要和硬件打交道,例如读写硬盘、向显示器输出、从键盘输入等,如果每个程序都等待硬件,那么整台计算机也将变得卡顿。但是有了缓冲区,就可以将数据先放入缓冲区中(内存的读写速度也远高于硬盘),然后程序可以继续往下执行,等所有的数据都准备好了,再将缓冲区中的所有数据一次性地写入硬盘,这样程序就减少了等待的次数,变得流畅起来。

其次,缓冲区可以有效减少硬件设备的读写次数。
如果每次输入输出操作只传输少量数据,就需要传送很多次,这样会浪费很多时间,因为开始读写与终止读写所需要的时间很长,如果将数据送往缓冲区,待缓冲区满后再进行传送会大大减少读写次数,这样就可以节省很多时间。例如,我们想将数据写入到磁盘中,不是立马将数据写到磁盘中,而是先输入缓冲区中,当缓冲区满了以后,再将数据写入到磁盘中,这样就可以减少磁盘的读写次数,不然磁盘很容易坏掉。

简单来说,缓冲区就是一块内存区,它用在输入输出设备和CPU之间,用来存储数据。它使得低速的输入输出设备和高速的CPU能够协调工作,避免低速的输入输出设备占用CPU,解放出CPU,使其能够高效率工作,同时减少操作硬件的次数。

缓冲区的类型

缓冲区分为三种类型:全缓冲、行缓冲和不带缓冲。

1、全缓冲
在这种情况下,当填满标准I/O缓存后才进行实际I/O操作,即一定大小的缓冲区填满后。全缓冲的典型代表是对磁盘文件的读写。

2、行缓冲
在这种情况下,当在输入和输出中遇到换行符时,执行真正的I/O操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的I/O操作。行缓冲的典型代表就是标准输入设备(也即键盘)和标准输出设备(也即显示器)。

比如:对以下语句进行执行,

#include<stdio.h>
#include<unistd.h>    //sleep()函数的头文件
int main(void)
{printf("key0");sleep(5);  //程序将暂停5秒钟printf("key1\n");return 0;
}

执行时将会看到在Windows 平台下,会先输出 key0 语句,过5s后才会输出 key1 语句。这好像与理论矛盾,其实这只是因为在Windows 平台下,输出设备认为是不带缓冲区的;
在Linux 和 Mac OS 平台下,输出设备带有行缓冲区。这时就会等5s后 key0key1 一起输出。

而对于输入设备,没有缓冲区将导致非常奇怪的行为,因此Windows、Linux、Mac OS 在实现时都给输入设备带上了行缓冲,所以 scanf()、getchar()、gets() 等输入函数在每个平台下的表现都一致。

当然,考虑到有些特殊情况希望输入不带有行缓冲,这时有Windows 下特有的 getche() 和 getch() 函数满足这种特殊需求,它们都不带缓冲区。

3、不带缓冲
也就是不进行缓冲处理,例如C语言中的getch和getche即是如此。

缓冲区的刷新条件

不管是行缓冲还是全缓冲,缓冲区满时会自动刷新;
行缓冲遇到换行符\n时会刷新;
关闭文件时会刷新缓冲区;
程序关闭时一般也会刷新缓冲区,这个是由标准库来保障的;

当缓冲区刷新时,就会进行真正的I/O操作。

缓存(Cache)定义

广义的cache包含很多含义:
一、
CPU的Cache,它中文名称是高速缓冲存储器,读写速度很快,几乎与CPU一样。由于CPU的运算速度太快,内存的数据存取速度无法跟上CPU的速度,所以在CPU与内存间设置了Cache为CPU的数据快取区。当计算机执行程序时,数据与地址管理部件会预测可能要用到的数据和指令,并将这些数据和指令预先从内存中读出送到Cache。一旦需要时,先检查Cache,若有就从Cache中读取,若无再访问内存,现在的CPU还有一级Cache,二级Cache。简单来说,Cache就是用来解决CPU与内存之间速度不匹配的问题,避免内存与辅助内存频繁存取数据,这样就提高了系统的执行效率。

二、
磁盘也有Cache,硬盘的Cache作用就类似于CPU的Cache,它解决了总线接口的高速需求和读写硬盘的矛盾以及对某些扇区的反复读取。

三、
浏览器缓存(Browser Caching)是为了节约网络的资源加速浏览,浏览器在用户磁盘上对最近请求过的文档进行存储,当访问者再次请求这个页面时,浏览器就可以从本地磁盘显示文档,这样就可以加速页面的阅览,并且可以减少服务器的压力。这个过程与下载非常类似,不过下载是用户的主动过程,并且下载的数据一般是长时间保存,游览器的缓存的数据只是短时间保存,可以人为的清空。

同样Cache也有大小,例如现在市面上购买的CPU的cache越大,级数越多,CPU的访问速度越快。cache在很多方面都有应用,就不一一列举了。

缓存(Cache)与缓冲区(Buffer)的主要区别

Buffer的核心作用是用来缓冲,缓和冲击。比如你每秒要写100次硬盘,对系统冲击很大,浪费了大量时间在忙着处理开始写和结束写这两件事嘛。用个buffer暂存起来,变成每10秒写一次硬盘,对系统的冲击就很小,写入效率就高了,并极大缓和了冲击。

Cache的核心作用是加快取用的速度。比如你一个很复杂的计算做完了,下次还要用结果,就把结果放手边一个好拿的地方存着,下次不用再算了。加快了数据取用的速度。

简单来说,就是Buffer偏重于输出操作,而Cache偏重于输入操作。

缓冲区(Buffer)与缓存(Cache)异同相关推荐

  1. 缓冲区(buffer)与缓存(cache)

    下面介绍缓冲区的知识. 一.什么是缓冲区 缓冲区(buffer),它是内存空间的一部分.也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区, ...

  2. 缓冲(Buffer)与缓存(Cache)

    缓冲介绍 缓冲区是一块特定的内存区域.开辟缓冲区的目的是通过缓解应用程序上下层之间的性能差异,提高系统的性能.在日常生活中,缓冲的一个典型应用是漏斗. 缓冲最常用的场景就是提高I/O的速度.为此,JD ...

  3. 缓存(cache)与缓冲(buffer)

    相关文章: <MySQL:更新过程(buffer pool与redo.bin.undo log)> <Redis:持久化RDB与AOF> <Java8之BufferedI ...

  4. Java NIO基础之缓冲区buffer(笔记 day01)

    学习笔记,仅供参考,禁止搬运,如有不正确的地方欢迎大家指正,谢谢!!! 一.缓冲区buffer  代码 package com.lihefei.nio.day01; import org.junit. ...

  5. NIO(一)——缓冲区Buffer

                                        NIO(一)--Buffer NIO简介 NIO即New IO,是用来代替标准IO的,提供了与标准IO完全不同传输方式. 核心: ...

  6. Linux内存buffer和cpu cache的区别

    1.cache 和 buffer的区别 cache是高速缓存,用于CPU和内存之间的缓冲: buffer是I/O缓存,用于内存和硬盘的缓冲<1>.Cache最初用于cpu cache, 主 ...

  7. 计算机缓存Cache以及Cache Line详解

    转载: 计算机缓存Cache以及Cache Line详解 - 围城的文章 - 知乎 https://zhuanlan.zhihu.com/p/37749443 L1,L2,L3 Cache究竟在哪里? ...

  8. 简单聊聊PostgreSQL buffer与OS cache

    0.概述 缓存可以说是数据库中相当重要的一部分,很多性能相关的问题都与之息息相关.那么我们今天就聊聊在PostgreSQL中的缓存. 1.为什么需要缓存? 在数据库中似乎我们最关心的是磁盘IO,经常会 ...

  9. JAVA NIO缓冲区(Buffer)------ByteBuffer常用方法详解

    缓冲区(Buffer) 缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储,这部分预留的内存空间就叫做缓冲区: 使用缓冲区有这么两个好处: 1.减少实际 ...

最新文章

  1. 兼容性自动化测试 | HUAWEI DevEco Studio云测服务等您来体验
  2. Elasticsearch优化
  3. 【PAT】A1106 Lowest Price in Supply Chain
  4. window环境编译在linux环境运行的golang程序
  5. JUnit的各种断言
  6. webService学习8:wsdl文档解释
  7. php的foreach
  8. UpdatePanel 属性学习之 UpdateMode
  9. oracle big table1,关于Big_Table脚本的一些有关问题
  10. 使用DataX从ORACLE同步数据到MYSQL
  11. window10保存文件时提示联系管理员_东芝2000AC扫描文件到远程域共享服务器
  12. Spring 加载Bean流程
  13. 【语音编码】基于matlab ADPCM编解码【含Matlab源码 553期】
  14. 方立勋_30天掌握JavaWeb_回顾复习
  15. excel计算数据的差和的公式和方法、相关系数、绝对误差
  16. RS-485什么情况下需要上下拉电阻?
  17. 8.0时代的微信营销怎么玩,才能挖掘用户最大价值
  18. 为什么转置512x512矩阵,会比513x513矩阵慢很多?
  19. 1688按关键词搜索
  20. 计算机专业大几用到移动硬盘,2T有轻薄,4T大容量,双盘在面前,你会怎么选?—希捷2T移动硬盘评测...

热门文章

  1. MAX7219芯片驱动基于51内核
  2. onfocus获得焦点、onblur失去焦点
  3. 账号分享ios《Florence》
  4. 移动宽带获取 IPv6
  5. python埃及分数式_埃及分数式
  6. 【微信小程序】使用npm并引入vant-weapp组件库
  7. nodeName 与 tagName 的区别
  8. JMeter接口并发测试
  9. arcsde java_ArcSDE Java API
  10. 下一个爱因斯坦或许出自超级人工智能阶段