精华内容
下载资源
问答
  • 缓冲区

    千次阅读 2013-06-12 09:47:44
    什么是缓冲区缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区缓冲区根据其对应的是输入设备还是输出...

    什么是缓冲区


    缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。


    为什么要引入缓冲区


    我们为什么要引入缓冲区呢?

    比如我们从磁盘里取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区可大大提高计算机的运行速度。

    又比如,我们使用打印机打印文档,由于打印机的打印速度相对较慢,我们先把文档输出到打印机相应的缓冲区,打印机再自行逐步打印,这时我们的CPU可以处理别的事情。现在您基本明白了吧,缓冲区就是一块内存区,它用在输入输出设备和CPU之间,用来缓存数据。它使得低速的输入输出设备和高速的CPU能够协调工作,避免低速的输入输出设备占用CPU,解放出CPU,使其能够高效率工作。

    缓冲区的类型

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

    1、全缓冲

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

    2、行缓冲

    在这种情况下,当在输入和输出中遇到换行符时,执行真正的I/O操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的I/O操作。典型代表是键盘输入数据。

    3、不带缓冲

    也就是不进行缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示出来。
    缓冲区的刷新

    下列情况会引发缓冲区的刷新:

    1、缓冲区满时;

    2、执行flush语句;

    3、执行endl语句;

    4、关闭文件。

    可见,缓冲区满或关闭文件时都会刷新缓冲区,进行真正的I/O操作。另外,在C++中,我们可以使用flush函数来刷新缓冲区(执行I/O操作并清空缓冲区),如:cout << flush; //将显存的内容立即输出到显示器上进行显示

    endl控制符的作用是将光标移动到输出设备中下一行开头处,并且清空缓冲区。

    cout < < endl;

    相当于

    cout < < ”\n”< < flush;

    通过实例演示说明

    1、文件操作演示全缓冲

    创建一个控制台工程,输入如下代码:

    #include< fstream >
    using namespace std;
    
    int main()
    {
        //创建文件test.txt并打开
    	ofstream outfile("test.txt");
    
        //向test.txt文件中写入4096个字符’a’
    	for(int n=0;n< 4096;n++)
    	{
    		outfile <<  'a';
    	}
        //暂停,按任意键继续
    	system("PAUSE");
        
        //继续向test.txt文件中写入字符’b’,也就是说,第4097个字符是’b’
    	outfile < <  'b';
    
        //暂停,按任意键继续
    	system("PAUSE");
    
    	return 0;
    }

    上面这段代码很容易理解,已经在代码内部作了注释。

    编写这段小代码的目的是验证全缓冲的大小是4096个字节,并验证缓冲区满后会刷新缓冲区,执行真正的I/O操作。

    编译并执行,运行结果如下:



    此时打开工程所在文件夹下的test.txt文件,您会发现该文件是空的,这说明4096个字符“a”还在缓冲区,并没有真正执行I/O操作。敲一下回车键,窗口变为如下:



    此时再打开test.txt文件,您就会发下该文件中已经有了4096个字符“a”。这说明全缓冲区的大小是4K(4096),缓冲区满后执行了I/O操作,而字符“b”还在缓冲区。
    再次敲一下回车键,窗口变为如下:



    此时再打开test.txt文件,您就会发现字符“b”也在其中了。这一步验证了文件关闭时刷新了缓冲区。


    2、键盘操作演示行缓冲


    先介绍getchar()函数。

    函数原型:int getchar(void);

    说明:当程序调用getchar()函数时,程序就等着用户按键,用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止(回车字符也放在缓冲区中)。当用户键入回车之后,getchar()函数才开始从键盘缓冲区中每次读入一个字符。也就是说,后续的getchar()函数调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才重新等待用户按键。

    不知道您明白了没有,再通俗一点讲,当程序调用getchar()函数时,程序就等着用户按键,并等用户按下回车键返回。期间按下的字符存放在缓冲区,第一个字符作为函数返回值。继续调用getchar()函数,将不再等用户按键,而是返回您刚才输入的第2个字符;继续调用,返回第3个字符,直到缓冲区中的字符读完后,才等待用户按键。

    如果您还没有明白,只能怨我表达能力有限,您可以结合以下实例体会。

    创建一个控制台工程,输入如下代码:

    #include < iostream >
    using namespace std;
    
    int main()
    {
    
    	char c;
    
    //第一次调用getchar()函数
    //程序执行时,您可以输入一串字符并按下回车键,按下回车键后该函数才返回
    	c=getchar();
    
        //显示getchar()函数的返回值
    	cout < <  c < < endl;
    
        //暂停
    	system("PAUSE");
     
    //循环多次调用getchar()函数
    //将每次调用getchar()函数的返回值显示出来
    //直到遇到回车符才结束
    	while((c=getchar())!='\n')
    	{
    		printf("%c",c);
    	}
    
        //暂停
    	system("PAUSE");
    
    	return 0;
    }

    这段小代码也很简单,同样在代码内部都有注释。

    getchar()函数的执行就是采用了行缓冲。第一次调用getchar()函数,会让程序使用者(用户)输入一行字符并直至按下回车键 函数才返回。此时用户输入的字符和回车符都存放在行缓冲区。

    再次调用getchar()函数,会逐步输出行缓冲区的内容。

    好了,本人表达能力有限,还是编译运行程序,通过运行结果自己领会吧。

    编译运行程序,会提示您输入字符,您可以交替按下一些字符,如下:




    您一直按下去,您就会发现当您按到第4094个字符时,不允许您继续输入字符。这说明行缓冲区的大小也是4K。

    此时您按下回车键,返回第一个字符’a’,如下图:



    继续敲一下回车键,将缓冲区的其它的字符全部输出,如下图:



    3、标准错误输出不带缓冲

    如错误输出时使用:

    cerr<<”错误,请检查输入的参数!”;

    这条语句等效于:

    fprintf(stderr, ”错误,请检查输入的参数!”);


    展开全文
  • 颜色缓冲区:就是帧缓冲区(图形设备的内存),需要渲染的场景的每一个像素都最终写入该缓冲区,然后由他渲染到屏幕上显示。深度缓冲区:与帧缓冲区对应,用于记录上面每个像素的深度值,通过深度缓冲区,我们可以...
    • 颜色缓冲区:就是帧缓冲区(图形设备的内存),需要渲染的场景的每一个像素都最终写入该缓冲区,然后由他渲染到屏幕上显示。

    • 深度缓冲区:与帧缓冲区对应,用于记录上面每个像素的深度值,通过深度缓冲区,我们可以进行深度测试,从而确定像素的遮挡关系,保证渲染正确。(注意区分深度测试和背面剔除)

    • 模板缓冲区:与深度缓冲区类似,通过设置模板缓冲每个像素的值,我们可以在渲染的时候只渲染后写模板缓存对应的值,从而在后续的其他绘制可以通过配置模板缓存的参数来决定是否丢弃该片元和如何操作对应该片段对应的模板缓存值。
      模板缓冲区可以为屏幕上的每个像素点保存一个无符号的整数值,在渲染过程中,可以用这个值与一个预先设定的参考值相比较,根据比较的结果来决定是否更新相应的像素点的颜色值。模板测试发生在透明度测试之后,深度测试之前,如果模板测试通过,则相应的像素点更新,否则不更新。

    • 累积缓冲区:允许在渲染到颜色缓冲区之后,不是把结果显示到窗口上,而是把内容复制到累积缓冲区,这样就可以把颜色缓冲区与累积缓冲区中的内容反复进行混合,可以用来进行模糊处理和抗锯齿。

    以上的总结部分转于,且部分在此基础上做了调整:颜色缓冲区、深度缓冲区、模板缓冲区和累积缓冲区

    于是有了自己的总结:
    在这里插入图片描述

    展开全文
  • 缓冲区和双缓冲区

    千次阅读 2020-07-24 15:26:55
    缓冲区 在单缓冲情况下,每当用户进程发出一I/O请求时,OS便在主存中为之分配一缓冲区。在块设备输入时,假定从磁盘把一块数据输入到缓冲区的时间为T,OS将该缓冲区中的数据传送到用户区的时间为M,而CPU对这一块...

    单缓冲区

    在单缓冲情况下,每当用户进程发出一I/O请求时,OS便在主存中为之分配一缓冲区。在块设备输入时,假定从磁盘把一块数据输入到缓冲区的时间为T,OS将该缓冲区中的数据传送到用户区的时间为M,而CPU对这一块数据的处理时间为C,T和C是可以并行的,所以系统对每一块数据的处理时间为MAX(T,C)+M

    双缓冲区

    由于缓冲区是共享资源,生产者与消费者在使用缓冲区时必须互斥。
    如果消费者尚未取走缓冲区的数据,生产者又生产新的数据,也无法将它送入缓冲区,所以设置两个缓冲区。
    双缓冲机制(缓冲对换):在设备输入时,先将数据送入第一缓冲区,装满后转向第二缓冲区。在双缓冲时,系统处理一块数据的时间可以粗略地认为是MAX(C,T)
    在两台机器中,都设置两个缓冲区,一个是发送缓冲区,一个是接收缓冲区

    环形缓冲区

    当输入与输出的速度基本相匹配时,采用双缓冲能获得较好的效果,可使生产者和消费者基本上能并行操作。但当两者的速度相差很远时,双缓冲的效果很不理想,所以引入环形缓冲区

    环形缓冲区:
    在环形缓冲区中包括多个缓冲区,每个缓冲区的大小相同,作为输入的多缓冲区可分为3类:用于装输入数据的空缓冲区,已装满数据的缓冲区G,计算进程正在使用的现行工作缓冲区C。

    缓冲池

    既可以用于输入也可以用于输出的公用缓冲池,在池中设置了多个可供若干个进程共享的缓冲区。

    缓冲池和缓冲区的区别:缓冲区仅仅是一组内存块的链表,而缓冲池则是包含了一个管理的数据结构以及一组操作函数的管理机制,用于管理多个缓冲区

    展开全文
  • 缓冲区溢出以及缓冲区溢出攻击

    千次阅读 2020-08-31 21:35:06
    缓冲区溢出是指当计算机程序向缓冲区内填充的数据位数超过了缓冲区本身的容量。溢出的数据覆盖在合法数据上。理想情况是,程序检查数据长度并且不允许输入超过缓冲区长度的字符串。但是绝大多数程序都会假设数据长度...

    缓冲区溢出是指当计算机程序向缓冲区内填充的数据位数超过了缓冲区本身的容量。溢出的数据覆盖在合法数据上。理想情况是,程序检查数据长度并且不允许输入超过缓冲区长度的字符串。但是绝大多数程序都会假设数据长度总是与所分配的存储空间相匹配,这就为缓冲区溢出埋下隐患。

    展开全文
  • webgl 中渲染到纹理需要用到帧缓冲区,但是同时想使用深度缓冲区和模板缓冲区需要的步骤如下,直接上代码 var width = 800; var height = 600; //创建帧缓冲区对象 var frameBuffer = gl.createFramebuffer();
  • AAudio 音频流内部缓冲区 与 音频数据读写缓冲区 概念 II . AAudio 音频流内部缓冲区 缓冲区帧容量 BufferCapacityInFrames 与 缓冲区帧大小 BufferSizeInFrames 区分 III . AAudio 音频流内部缓冲区 缓冲区帧容量 ...
  • 从抽象的角度看,也就是说,一个用户进程在内存中有自己的一个进程缓冲区,系统底层也有自己的一个内核缓冲区,read系统调用,就是将进程缓冲区中的数据复制到内核缓冲区中,而write系统调用则是将内核缓冲区中的...
  • java缓冲区

    万次阅读 2018-11-26 21:38:43
    1 缓冲区的分类 ByteBuffer CharBuffer ShortBuffer IntBuffer LongBuffer FloatBuffer DoubleBuffer 2 ByteBuffer读取数据的操作 容量(capacity):表示Buffer最大数据容量,缓冲区容量不能为负,并且建立后不能...
  • 缓冲区,刷新缓冲区

    千次阅读 2016-05-19 23:45:21
    一直不明白缓冲区,今天对缓冲区有了全面的认识。下面介绍缓冲区: 1.什么是缓冲区  缓冲区又叫缓存,是内存空间的一部分。就是在存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间叫缓冲区。 ...
  • tcp缓冲区

    千次阅读 2019-02-08 16:40:39
    每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。 二、缓冲区的意义 write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送到目标机器。一旦将...
  • 字节缓冲区,顾名思义“缓冲”对象是字节,但是字节缓冲区又是一个特殊的缓冲区,因为字节是操作系统及其IO设备使用的基本数据类型。 字节缓冲区和其他缓冲区最明显的区别在于,他们可以成为通道所执行的IO的源头和...
  • 用户进程缓冲区和内核缓冲区

    千次阅读 2019-04-29 16:20:46
    但实际上有一部分人把用户进程缓冲区和系统空间的缓冲区的概念混淆了,包括这两种缓冲区的用法和所要解决的问题,还有其它类似的概念。本文就来区分一下不同的缓冲区概念(主要针对类unix平台)。 用户进程和操作...
  • arcgis建立缓冲区

    万次阅读 多人点赞 2017-12-23 14:14:32
    缓冲区是地理空间目标的一种影响范围或服务范围,具体指在点、线、面实体的周围,自动建立的一定宽度的多边。
  • 输入缓冲区与输出缓冲区

    千次阅读 2018-05-17 23:24:34
    本博文通过一段程序来理解输入缓冲区与输出缓冲区。程序如下:/************************************************************************* @Author: wanghao @Created Time : Thu 17 May 2018 06:03:12 AMPDT ...
  • OpenGL 深度缓冲区 Z缓冲区 介绍

    千次阅读 2014-02-08 09:48:51
    【颜色缓冲区】  颜色缓冲区(COLOR_BUFFER)就是帧缓冲区(FRAME_BUFFER),你需要渲染的场景最终每一个像素都要写入该缓冲区,然后由它在渲染到屏幕上显示. 【深度缓冲区】  深度缓冲区(DEPTH_BUFFER)与帧...
  • 环形缓冲区C语言实现

    万次阅读 多人点赞 2018-08-23 17:03:10
    环形缓冲区 1. 环形缓冲区的特性 1、先进新出 2、当缓冲区被使用完,且又有新的数据需要存储时,丢掉历史最久的数据,保存最新数据 现实中的存储介质都是线性的,因此我们需要做一下处理,才能在功能上实现...
  • 多图详解缓冲区溢出问题

    万次阅读 多人点赞 2020-11-18 23:43:21
    缓冲区溢出一个常见的后果是:黑客利用函数调用过程中程序的返回地址,将存放这块地址的指针精准指向计算机中存放攻击代码的位置,造成程序异常中止。为了防止发生严重的后果,计算机会采用栈随机化,利用金丝雀值...
  • 缓冲区

    千次阅读 2016-08-27 23:15:21
    缓冲区今天看大规模分布式存储系统,看到双缓冲这一部分内容,加之之前项目中应用到双缓冲思想,故总结双缓冲知识如下,其中程序是参看stackoverflow的,具体网址找不到了,故未标注在参看文献中。 简介 双缓冲区...
  • TCP的发送缓冲区和接收缓冲区

    千次阅读 2020-03-15 16:54:24
    每个Tcp socket连接在内核中都有一个发送缓冲区和接收缓冲区,TCP的全双工的工作模式以及TCP的流量(拥塞)控制便是依赖于这两个独立的buffer以及buffer的填充状态。 单工:只允许甲方向乙方传送信息,而乙方不能向...
  • 什么是缓冲区

    千次阅读 2021-01-24 21:57:46
    1. 什么是缓冲区 缓冲区又称为缓存,它是内存空间的一部分。 也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区缓冲区根据其对应的是输入设备...
  • 刷新缓冲区

    千次阅读 2019-01-22 18:52:17
    最初,printf()语句把输出发送到一个叫缓冲区的中间存储区域,然后缓冲区内容在不断被发送到屏幕上。C规定了什么时候才能发送:当缓冲区满、遇到换行字符或需要输入时。 像这样缓冲区把数据发送到屏幕或者文件中被...
  • 缓冲区管理

    千次阅读 2019-09-03 23:20:50
    在现代操作系统中,几乎所有的I/O设备在与处理机交换数据时都用了缓冲区。 缓冲的引入  引入缓冲区的原因有很多,可归结为以下几点:  (1) 缓和CPU与I/O设备间速度不匹配的矛盾。  (2) 减少对CPU的中断频率,...
  • 磁盘缓冲区和内存缓冲区

    千次阅读 2015-03-24 11:16:49
    一般编程所说的缓冲区指的是内存缓冲区,这是程序所设置的一块内存空间,用来暂存从其他设备读入的数据或者是即将写入其他设备的数据;  而磁盘缓冲区有两种:  意是上面说的内存缓冲区,只是它是专门为读取或...
  • 清空输入缓冲区

    千次阅读 2019-03-24 23:49:49
    所有从键盘输入的数据,,不管是字符还是数字,都是先存储在内存中的一个缓冲区里面,叫做键盘缓冲区,简称“输入缓冲区”或者“输入流”。 #include<stdio.h> int main(void) { int a, b, c; scanf("%d", &...
  • 循环缓冲区

    千次阅读 2018-07-26 09:55:46
    这次需要记录之前了解到的参考自linux内核循环队列kfifo的循环缓冲区实现方法。 1、循环缓冲区的实现依靠队列来实现,也就是分配一个数组来存储实际数据。 2、对于一个循环缓冲区来说,我们需要关注的点有: ①...
  • 那么就可以将非阻塞I/O方式下的数据传输比做数据传输的集装箱方式(在字节和低层数据传输之间,多了一层缓冲区,因此,可以将缓冲区看做是装载字节的集装箱)。  如果将同步I/O方式下的数据传输比做数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 783,593
精华内容 313,437
关键字:

缓冲区