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

    千次阅读 2016-04-15 15:30:51
    缓冲区像前篇文章讨论的那样被写满和释放,对于每个非布尔原始数据类型都有一个缓冲区类,尽管缓冲区作用于它们存储的原始数据类型,但缓冲区十分倾向于处理字节,非字节缓冲区可以再后台执行从字节或到字节的转换,...

    什么是缓冲区

    一个缓冲区对象是固定数量的数据的容器,其作用是一个存储器,或者分段运输区,在这里数据可被存储并在之后用于检索。缓冲区像前篇文章讨论的那样被写满和释放,对于每个非布尔原始数据类型都有一个缓冲区类,尽管缓冲区作用于它们存储的原始数据类型,但缓冲区十分倾向于处理字节,非字节缓冲区可以再后台执行从字节或到字节的转换,这取决于缓冲区是如何创建的。

    缓冲区的工作与通道紧密联系。通道是I/O传输发生时通过的入口,而缓冲区是这些数据传输的来源或目标。对于离开缓冲区的传输,待传递出去的数据被置于一个缓冲区,被传送到通道;待传回的缓冲区的传输,一个通道将数据放置在所提供的缓冲区中。这种在协同对象之间进行的缓冲区数据传递时高效数据处理的关键。

    Buffer类的家谱

    下图是Buffer的类层次图。在顶部是通用Buffer类,Buffer定义所有缓冲区类型共有的操作,无论是它们所包含的数据类型还是可能具有的特定行为:

    缓冲区基础

    概念上,缓冲区是包在一个对象内的基本数据元素数组。Buffer类相比一个简单数组的优点是它将关于数据的数据内容和信息包含在一个单一的对象中,Buffer类以及它专有的子类定义了一个用于处理数据缓冲区的API。下面来看一下Buffer类所具有的属性和方法:

    1、属性

    所有的缓冲区都具有四个属性来提供关于其所包含的数据元素的信息,它们是:

    属      性 作      用
    capacity 容量,指缓冲区能够容纳的数据元素的最大数量,这一容量在缓冲区创建时被设定,并且永远不能被改变
    limit 上界,指缓冲区的第一个不能被读或写的元素,或者说是,缓冲区中现存元素的计数
    position 位置,指下一个要被读或写的元素的索引,位置会自动由相应的get()和put()函数更新
    mark 标记,指一个备忘位置,调用mark()来设定mark=position,调用reset()来设定postion=mark,标记未设定前是未定义的

    这四个属性总是遵循以下的关系:0 <= mark <= position <= limit <= capacity

    2、方法

    下面看一下如何使用一个缓冲区,Buffer中提供了以下的一些方法:

    方      法 作      用
    Object array() 返回此缓冲区的底层实现数组
    int arrayOffset() 返回此缓冲区的底层实现数组中第一个缓冲区还俗的偏移量
    int capacity() 返回此缓冲区的容量
    Buffer clear() 清除此缓冲区
    Buffer flip() 反转此缓冲区
    boolean hasArray() 告知此缓冲区是否具有可访问的底层实现数组
    boolean hasRemaining() 告知在当前位置和限制之间是否有元素
    boolean isDirect() 告知此缓冲区是否为直接缓冲区
    boolean isReadOnly() 告知此缓冲区是否为只读缓存
    int limit() 返回此缓冲区的上界
    Buffer limit(int newLimit) 设置此缓冲区的上界
    Buffer mark() 在此缓冲区的位置设置标记
    int position() 返回此缓冲区的位置
    Buffer position(int newPosition) 设置此缓冲区的位置
    int remaining() 返回当前位置与上界之间的元素数
    Buffer reset() 将此缓冲区的位置重置为以前标记的位置
    Buffer rewind() 重绕此缓冲区

    关于这个API有一点值得注意的,像clear()这类函数,通常应当返回的是void而不是Buffer引用。这些函数将引用返回到它们在(this)上被引用的对象,这是一个允许级联调用的类设计方法。级联调用允许这种类型的代码:

    buffer.mark();
    buffer.position(5);
    buffer.reset();

    被简写成:

    buffer.mark().position(5).reset();
    

    缓冲区代码实例

    对缓冲区的使用,先看一段代码,然后解释一下:

    复制代码
     1 public class TestMain
     2 {
     3     /**
     4      * 待显示的字符串
     5      */
     6     private static String[] strs = 
     7     {
     8         "A random string value",
     9         "The product of an infinite number of monkeys",
    10         "Hey hey we're the monkees",
    11         "Opening act for the Monkees:Jimi Hendrix",
    12         "Scuse me while I kiss this fly",
    13         "Help Me! Help Me!"
    14     };
    15     
    16     /**
    17      * 标识strs的下标索引
    18      */
    19     private static int index = 0;
    20     
    21     /**
    22      * 向Buffer内放置数据
    23      */
    24     private static boolean fillBuffer(CharBuffer buffer)
    25     {
    26         if (index >= strs.length)
    27             return false;
    28         
    29         String str = strs[index++];
    30         for (int i = 0; i < str.length(); i++)
    31         {
    32             buffer.put(str.charAt(i));
    33         }
    34         
    35         return true;
    36     }
    37     
    38     /**
    39      * 从Buffer内把数据拿出来
    40      */
    41     private static void drainBuffer(CharBuffer buffer)
    42     {
    43         while (buffer.hasRemaining())
    44         {
    45             System.out.print(buffer.get());
    46         }
    47         System.out.println("");
    48     }
    49     
    50     public static void main(String[] args)
    51     {
    52         CharBuffer cb = CharBuffer.allocate(100);
    53         while (fillBuffer(cb))
    54         {
    55             cb.flip();
    56             drainBuffer(cb);
    57             cb.clear();
    58         }
    59     }
    60 }
    复制代码

    逐一解释一下:

    1、第52行,CharBuffer是一个抽象类,它不能被实例化,因此利用allocate方法来实例化,相当于是一个工厂方法。实例化出来的是HeapCharBuffer,默认大小是100。根据上面的Buffer的类家族图谱,可以看到每个Buffer的子类都是使用allocate方法来实例化具体的子类的,且实例化出来的都是Heap*Buffer

    2、第24行~第36行,每次取String数组中的一个,利用put方法放置一个数据进入CharBuffer中

    3、第55行,调用flip方法,这是非常重要的。在缓冲区被写满后,必须将其清空,但是如果现在在通道上直接执行get()方法,那么它将从我们刚刚插入的有用数据之外取出未定义数据;如果此时将位置重新设置为0,就会从正确的位置开始获取数据,但是如何知道何时到达我们所插入数据末端呢?这就是上界属性被引入的目的----上界属性指明了缓冲区有效内容的末端。因此,在读取数据的时候我们需要做两件事情:

    (1)将上界属性limit设置为当前位置    (2)将位置position设置为0

    这两步操作,JDK API给开发者提供了一个filp()方法来完成,flip()方法将一个能够继续添加数据元素的填充状态的缓冲区翻转成一个准备读出元素的释放状态,因此每次准备读出元素前,都必须调用一次filp()方法

    4、第41行~第48行,每次先判断一下是否已经达到缓冲区的上界,若存在则调用get()方法获取到此元素,get()方法会自动移动下标position

    5、第57行,对Buffer的操作完成之后,调用clear()方法将所有属性回归原位,但是clear()方法并不会改变缓冲区中的任何数据

    缓冲区比较

    缓冲区的比较即equals方法,缓冲区的比较并不像我们想像得这么简单,两个缓冲区里面的元素一样就是相等,两个缓冲区相等必须满足以下三个条件:

    1、两个对象类型相同,包含不同数据类型的buffer永远不会像等,而且buffer绝不会等于非buffer对象

    2、两个对象都剩余相同数量的元素,Buffer的容量不需要相同,而且缓冲区中剩余数据的索引也不必相同。但每个缓冲区中剩余元素的数目(从position到limit)必须相同

    3、在每个缓冲区中应被get()函数返回的剩余数据元素序列必须一致

    如果不满足上面三个条件,则返回false。下面两幅图演示了两个缓冲区相等和不相等的场景,首先是两个属性不同的缓冲区也可以相等:

    然后是两个属性相同但是被等为不相等的缓冲区:

    批量移动数据

    缓冲区的设计目的就是为了能够高效地传输数据。一次移动一个数据元素,其实并不高效,如在下面的程序清单中所看到的那样,Buffer API提供了向缓冲区内外批量移动数据元素的函数:

    复制代码
    public abstract class CharBuffer
        extends Buffer
        implements Comparable<CharBuffer>, Appendable, CharSequence, Readable
    {
        ...
        public CharBuffer get(char[] dst){...}
        public CharBuffer get(char[] dst, int offset, int length){...}
        public final CharBuffer put(char[] src){...}
        public CharBuffer put(char[] src, int offset, int length){...}
        public CharBuffer put(CharBuffer src){...}
        public final CharBuffer put(String src){...}
        public CharBuffer put(String src, int start, int end){...}
        ...      
    }
    复制代码

    其实这种批量移动的合成效果和前文的循环在底层实现上是一样的,但是这些方法可能高效得多,因为这种缓冲区实现能够利用本地代码或其他的优化来移动数据。

    字节缓冲区

    字节缓冲区和其他缓冲区类型最明显的不同在于,它们可能成为通道所执行I/O的源头或目标,如果对NIO有了解的朋友们一定知道,通道只接收ByteBuffer作为参数。

    如我们所知道的,操作系统在内存区域进行I/O操作,这些内存区域,就操作系统方面而言,是相连的字节序列。于是,毫无疑问,只有字节缓冲区有资格参与I/O操作。也请回想一下操作系统会直接存取进程----在本例中是JVM进程的内存空间,以传输数据。这也意味着I/O操作的目标内存区域必须是连续的字节序列,在JVM中,字节数组可能不会在内存中连续存储,或者无用存储单元收集可能随时对其进行移动。在Java中,数组是对象,而数据存储在对象中的方式在不同的JVM实现中各有不同。

    出于这一原因,引入了直接缓冲区的概念。直接缓冲区被用于与通道和固有I/O线程交互,它们通过使用固有代码来告知操作系统直接释放或填充内存区域,对用于通道直接或原始存取的内存区域中的字节元素的存储尽了最大的努力。

    直接字节缓冲区通常是I/O操作最好的选择。在设计方面,它们支持JVM可用的最高效I/O机制,非直接字节缓冲区可以被传递给通道,但是这样可能导致性能损耗,通常非直接缓冲不可能成为一个本地I/O操作的目标,如果开发者向一个通道中传递一个非直接ByteBuffer对象用于写入,通道可能会在每次调用中隐含地进行下面的操作:

    1、创建一个临时的直接ByteBuffer对象

    2、将非直接缓冲区的内容复制到临时缓冲中

    3、使用临时缓冲区执行低层次I/O操作

    4、临时缓冲区对象离开作用于,并最终成为被回收的无用数据

    这可能导致缓冲区在每个I/O上复制并产生大量对象,而这种事都是我们极力避免的。

    直接缓冲区是I/O的最佳选择,但可能比创建非直接缓冲区要花费更高的成本。直接缓冲区使用的内存是通过调用本地操作系统的代码分配的,绕过了标准JVM堆栈。建立和销毁直接缓冲区会明显比具有堆栈的缓冲区更极爱破费,这取决于主操作系统以及JVM实现。直接缓冲区的内存区域不受无用存储单元收集支配,因为它们位于标准JVM堆栈之外。

    直接ByteBuffer是通过调用具有所需容量的ByteBuffer.allocateDirect()函数产生的:

    复制代码
    public abstract class ByteBuffer
        extends Buffer
        implements Comparable<ByteBuffer>
    {
        ...
        public static ByteBuffer allocateDirect(int capacity)
        {
            return new DirectByteBuffer(capacity);
        }
        ...
    }
    复制代码
    展开全文
  • 颜色缓冲区:就是帧缓冲区(图形设备的内存),需要渲染的场景的每一个像素都最终写入该缓冲区,然后由他渲染到屏幕上显示。深度缓冲区:与帧缓冲区对应,用于记录上面每个像素的深度值,通过深度缓冲区,我们可以...
    • 颜色缓冲区:就是帧缓冲区(图形设备的内存),需要渲染的场景的每一个像素都最终写入该缓冲区,然后由他渲染到屏幕上显示。

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

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

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

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

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

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

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

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

    展开全文
  • AAudio 音频流内部缓冲区 与 音频数据读写缓冲区 概念 II . AAudio 音频流内部缓冲区 缓冲区帧容量 BufferCapacityInFrames 与 缓冲区帧大小 BufferSizeInFrames 区分 III . AAudio 音频流内部缓冲区 缓冲区帧容量 ...



    I . AAudio 音频流内部缓冲区 与 音频数据读写缓冲区 概念



    1 . AAudio 音频流内部缓冲区本质 : 该缓冲区是在音频设备中进行维护的 , AAudio 音频流会先将数据传入该缓冲区 , 然后才进行播放 ;


    2 . 音频数据读写缓冲区 : 是在内存中维护的 , 其本质就是一个 void* 类型的数组 , 其数组字节大小由用户设定 ;


    3 . 概念区分 : 注意将 AAudio 音频流内部缓冲区 与 音频数据读写缓冲区 区分清楚 ; 两个是完全不同的概念 ;



    II . AAudio 音频流内部缓冲区 缓冲区帧容量 BufferCapacityInFrames 与 缓冲区帧大小 BufferSizeInFrames 区分



    下面要区分两个概念 , 一个是缓冲区帧容量 BufferCapacityInFrames , 一个是缓冲区帧大小 BufferSizeInFrames , 这两个开发者都可以设置 ;

    • ① 缓冲区帧容量 BufferCapacityInFrames : 是音频设备的缓冲区最大值 ;
    • ② 缓冲区帧大小 BufferSizeInFrames : 用户实际使用的缓冲区大小 , 小于等于 缓冲区容量 ;

    做一个形象的比喻 , 水杯有 2L 的容量 , 最大可以装 2L 水 , 2L 相当于缓冲区帧容量 ; 但是我们在水杯的 1.5L 位置画了一个最高水位线 , 表示盛水时不能高于 1.5L , 这个 1.5L 就是我们使用的实际缓冲区帧大小 ;

    每帧的样本数就是通道数 , 单声道每帧 1 个样本 , 立体声 每帧 2 个样本 , 每个样本的大小与样本格式有关 , 16 位样本 每个样本 2 字节 ;



    III . AAudio 音频流内部缓冲区 缓冲区帧容量 BufferCapacityInFrames



    AAudio 音频流内部 缓冲区帧容量 : 音频设备的缓冲区最大值 ;

    • ① 设置缓冲区最大容量 : 调用 AAudioStreamBuilder_setBufferCapacityInFrames() 方法可以设置音频设备缓冲区最大容量 ;
    • ② 获取缓冲区最大容量 : 调用 AAudioStream_getBufferCapacityInFrames() 方法可以获取当前音频设备缓冲区的最大容量 ;


    IV . AAudio 音频流内部缓冲区 缓冲区帧大小 BufferSizeInFrames



    AAudio 音频流内部缓冲区帧大小 : 为音频设备设置了缓冲区最大容量 , 但是我们可能用不了这么大缓冲区 , 只使用其中一部分作为缓冲区 ;

    • ① 缓冲区帧大小 限制 : 缓冲区帧大小 BufferSizeInFrames 只能小于等于 缓冲区帧容量 BufferCapacityInFrames ;
    • ② 设置 缓冲区帧大小 作用 : 增加 缓冲区帧大小 BufferSizeInFrames 会增加音频延迟 , 反之会减小延迟 ;
    • ③ 设置缓冲区帧大小 方法 : AAudioStreamBuilder_setBufferSizeInFrames() ;
    • ④ 获取缓冲区帧大小 方法 : AAudioStreamBuilder_getBufferSizeInFrames() ;


    V . AAudio 音频流内部缓冲区 脉冲串



    1 . 脉冲串概念 : 音频设备读取 音频内部缓冲区数据时 , 会以离散的脉冲串形式从缓冲区中读取音频数据 , 每个脉冲串都包含多个音频帧 ;


    2 . 脉冲串设置 : 脉冲串包含的帧个数 , 以及脉冲串的读取速度 , 这两个属性由 Android 系统控制 , 与音频设备的电路相关 ;


    3 . 脉冲串属性固定 : 脉冲串的大小 和 速度 是无法修改的 , 可以根据 内部缓冲区 包含的脉冲串数量 设置内部缓冲区大小 ;


    4 . 脉冲串 性能相关 设置 : AAudio 音频流的 内部缓冲区帧大小 是 脉冲串大小的整数倍时 , 音频延迟最短 ;



    VI . AAudio 音频流内部缓冲区 工作机制 ( 播放音频 )



    1 . 写出数据到内部缓冲区 : 使用 AAudio 音频流 播放音频时 , 先将数据写入 AAudio 音频流的内部缓冲区 , 该过程会阻塞线程 , 直到写入完成 ;

    该缓冲区为音频设备内部维护的


    2 . AAudio 音频流 会以 离散的 脉冲串形式 , 读取内部缓冲区中的音频数据 , 然后播放出来 ;


    3 . 图示 : 内部缓冲区工作机制如下图 ;

    在这里插入图片描述



    VII . AAudio 音频流内部缓冲区 优化



    1 . AAudio 音频流内部缓冲区优化步骤 : 设置一个合适的 缓冲区帧大小 BufferSizeInFrames , 先设置一个较大的缓冲区 , 逐步减小该缓冲区大小 , 监控 XRun ( 超限 或 欠载 ) 数值 , 当出现了上述情况 , 说明缓冲区减小到极限 , 出现了播放问题 , 此时再稍微将缓冲区调大 , 最终的缓冲区大小刚合适 , 兼顾性能与功能 ;

    备选方案 : 先设置肯定出问题一个最小值 , 此时肯定会出现缓冲区不足的情况 , 逐步增加缓冲区大小 , 直到流畅读写为止 ;


    2 . 调整时间 : 缓冲区大小调整的过程几乎是一瞬间完成的 , 在开始播放第一帧数据时就已经完成 ;


    3 . 静音调整 : 缓冲区调整时 , 可以静音初始化缓冲区大小 , 确保用户听不到电流声 ;


    4 . 不断调整 : 在音频播放的过程中 , 系统的性能可能随时改变 , 这个缓冲区的大小也要跟着实时修改 , 一旦监测到了 欠载 UnderRun 或 超限 OverRun 就马上调整缓冲区大小 ;


    该过程可以参考上一篇博客 : 【Android 高性能音频】AAudio 缓冲区控制 ( XRun | 欠载 UnderRun | 超限 OverRun | 获取缓冲区大小 | 设置缓冲区大小 )



    VIII . 音频数据读写缓冲区



    1 . 概念区分 ( AAudio 内部缓冲区 / 音频读写缓冲区 ) : 该缓冲区是由用户自己维护的 , 与 AAudio 音频流缓冲区没有任何关系 , 不要混淆这两个概念 ;


    2 . 缓冲区本质 : 音频读写缓冲区是在堆内存中维护的 , 其本质就是一个 void* 类型的数组 , 其数组字节大小由用户设定 ;


    3 . 读写缓冲区作用 : 读取音频数据时 , 将音频数据先读取到该缓冲区中 ;


    4 . 性能分析 : 该音频数据读写缓冲区 与 采样效率相关 , 采样是需要消耗额外性能的 , 如果该缓冲区很大 , 一次采集很多样本 , 采样的效率会很高 , 但是减少了灵活性 , 如果采样太少 , 就会额外消耗很多性能 ;

    展开全文
  • 缓冲区,刷新缓冲区

    千次阅读 2016-05-19 23:45:21
    一直不明白缓冲区,今天对缓冲区有了全面的认识。下面介绍缓冲区: 1.什么是缓冲区  缓冲区又叫缓存,是内存空间的一部分。就是在存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间叫缓冲区。 ...
  • webgl 中渲染到纹理需要用到帧缓冲区,但是同时想使用深度缓冲区和模板缓冲区需要的步骤如下,直接上代码 var width = 800; var height = 600; //创建帧缓冲区对象 var frameBuffer = gl.createFramebuffer();
  • arcgis建立缓冲区

    万次阅读 2017-12-23 14:14:32
    缓冲区是地理空间目标的一种影响范围或服务范围,具体指在点、线、面实体的周围,自动建立的一定宽度的多边。
  • 从抽象的角度看,也就是说,一个用户进程在内存中有自己的一个进程缓冲区,系统底层也有自己的一个内核缓冲区,read系统调用,就是将进程缓冲区中的数据复制到内核缓冲区中,而write系统调用则是将内核缓冲区中的...
  • java缓冲区

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

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

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

    千次阅读 2018-05-17 23:24:34
    本博文通过一段程序来理解输入缓冲区与输出缓冲区。程序如下:/************************************************************************* @Author: wanghao @Created Time : Thu 17 May 2018 06:03:12 AMPDT ...
  • 直接与非直接缓冲区   字节缓冲区跟其他缓冲区类型最明显的不同在于,它们可以成为通道所执行的 I/O 的源头和/或目标。其实发现通道只接收ByteBuffer作为参数这个将Channel的时候会发现。 类型 优点 缺点 ...
  • Oracle: ORA-06512:字符串缓冲区太小

    万次阅读 2018-11-22 17:55:52
    问题现象:ORA-06512:字符串缓冲区太小 报错截图 解决思路: 出现以上报错后点击"是",plsql会直接定位到以下的程序报错位置; plsql提示的报错位置 由于是查询语句,我现在需要查出在查哪条数据...
  • tcp缓冲区

    千次阅读 2019-02-08 16:40:39
    每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。 二、缓冲区的意义 write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送到目标机器。一旦将...
  • 缓冲区

    千次阅读 2016-05-05 15:26:11
    假设一个缓冲区与一个磁盘块大小相同,把一个磁盘块读入缓冲区的时间为100μs,将缓冲区的数据传送到用户区的时间是50μs,CPU对一块数据进行分析的时间为50μs。在单缓冲区和双缓冲区结构下,读入并分析完该文件的...
  • 刷新缓冲区

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

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

    千次阅读 2015-03-24 11:16:49
    一般编程所说的缓冲区指的是内存缓冲区,这是程序所设置的一块内存空间,用来暂存从其他设备读入的数据或者是即将写入其他设备的数据;  而磁盘缓冲区有两种:  意是上面说的内存缓冲区,只是它是专门为读取或...
  • 什么是缓冲区?有什么作用?2.单缓冲3.双缓冲4.单缓冲和双缓冲通信时的区别5.循环缓冲区6.缓冲池 0.思维导图 1.什么是缓冲区?有什么作用? 2.单缓冲 T>C时的例子: T<C时: 3.双缓冲 T>C+M时: T...
  • 循环缓冲区

    千次阅读 2018-07-26 09:55:46
    这次需要记录之前了解到的参考自linux内核循环队列kfifo的循环缓冲区实现方法。 1、循环缓冲区的实现依靠队列来实现,也就是分配一个数组来存储实际数据。 2、对于一个循环缓冲区来说,我们需要关注的点有: ①...
  • 字节缓冲区,顾名思义“缓冲”对象是字节,但是字节缓冲区又是一个特殊的缓冲区,因为字节是操作系统及其IO设备使用的基本数据类型。 字节缓冲区和其他缓冲区最明显的区别在于,他们可以成为通道所执行的IO的源头和...
  • 数据缓冲区高速缓冲

    千次阅读 2015-09-26 15:19:36
    数据缓冲区高速缓冲 缓冲头部 一个缓冲区有两部分组成:一个含有磁盘上数据的存储数组和一个标识该缓冲区的 缓冲头部。 一个缓冲区的数据与文件系统上一个逻辑磁盘块中的数据相对应,并且通过考察缓 冲头部中...
  • 文件缓冲区

    千次阅读 2017-04-08 16:20:16
    系统自动在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区从内存向磁盘输出数据,必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘。 如果从磁盘向计算机读入数据,则一次从磁盘文件将一批数据输入到...
  • 本篇文章将介绍如何使用在ubuntu16.04中设置缓冲区以及配置缓冲区使用策略 创建缓冲区文件 创建一个大小为4G的缓冲区文件 sudo fallocate -l 4G /swapfile 赋予权限Swap分区文件权限 sudo chmod 600 ...
  • TCP/UDP的接收缓冲区和发送缓冲区

    千次阅读 2018-11-23 15:25:30
    每个TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区,TCP的全双工的工作模式以及TCP的流量(拥塞)控制便是依赖于这两个独立的buffer以及buffer的填充状态。 1.1 接收端冲区 接收缓冲区把数据缓存入内核,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 76,610
精华内容 30,644
关键字:

缓冲区