`
yeshucheng
  • 浏览: 24625 次
  • 性别: Icon_minigender_1
  • 来自: 登陆上海
社区版块
存档分类
最新评论

认识缓冲区Buffer

OS 
阅读更多

 

数据对于输入和输出的操作耗时是非常严重的问题,如果把这个问题放入到网络上去看待更甚是值得注意的一个问题了。假如结合基础的OS知识我们也知道如果要减少这种I/O操作的耗时或者也可以说提升这种效率的话,最大的可能就是减少物理读写的次数,而且尽可能做到主存数据的重读性(操作系统也在加强说明更多减少抖动现象的产生)。

java.nio包中我们可以直接来操作相对应的API了。可以让java更加方便的直接控制和运用缓冲区。缓冲区有几个需要了解的特定概念需要详尽来解释,才能更好的知道我们下面一些列需要针对的问题实质。

属性

容量(capacity):顾名思义就是表示缓冲区中可以保存多少数据;

极限(limit):缓冲区中的当前数据终结点。不过它是可以动态改变的,这样做的好处也是充分利用重用性;

位置(position):这个也好理解,其实就是指明下一个需要读写数据的位置。

上面上个关系还可以具体用图示的方式来表达整体概念,如下图所示:


在极限的时候就说到可以修改它,所以对于它的操作由以下方法:

l         clear():首先把极限设置为容量,再者就是需要把位置设置为0

l         flip():把极限设置为位置区,再者就是需要把位置设置为0

l         rewind():不改变极限,不过还是需要把位置设置为0

最为最基础的缓冲区ByteBuffer,它存放的数据单元是字节。首先要强调的是ByteBuffer没有提供公开的构造方法,只是提供了两个静态的工厂方法。

l         allocate(int capacity):返回一个ByteBuffer对象,参数表示缓冲区容量大小。

l         allocateDirect (int capacity):返回一个ByteBuffer对象,参数也是一样表示缓冲区容量大小。

在这里需要注意的是在使用两者的时候需要特别小心,allocateDirect和当前操作系统联系的非常紧密,它牵涉到使用native method的方法,大家知道一旦本地方法就是需要考虑调用dll(动态链接库)这个时候基本也就失去了JAVA语言的特性,言外之意对于耗资源非常大。所以如果考虑到当前使用的缓存区比较庞大而且是一个长期驻留使用的,这个时候可以考虑使用它。

分享到:
评论

相关推荐

    Apache Storm Buffer内部机制简介Prezi幻灯片

    在Storm的执行模型中,Buffer起着至关重要的作用,它作为数据缓冲区,优化了数据处理流程。本Prezi幻灯片将带你初步了解Storm中的Buffer内部机制。 Buffer是Storm处理数据的核心组件之一,它负责存储待处理的数据,...

    缓冲区溢出之第一章

    缓冲区溢出(Buffer Overflow)是指程序在试图向内存中写入数据时,超过了预分配的缓冲区边界,导致相邻内存区域的数据被覆盖或破坏。这种现象通常是由于编程时对内存操作的不当管理引起的,尤其是当没有正确检查...

    43 直接强行把redo log写入磁盘?非也,揭秘redo log buffer.pdf

    在MySQL数据库中,InnoDB存储引擎使用Redo日志来记录事务性的操作,并通过日志缓冲区(Redo Log Buffer)来缓存Redo日志。下面将详细介绍Redo日志的结构、缓冲机制以及Redo日志缓冲区相关知识点。 首先,Redo日志...

    缓冲池模拟及实现.docx

    - `Buffer`结构体包含缓冲区号、缓冲内容和指向下一个缓冲区的指针。 - `putBuf`和`getBuf`函数分别用于向队列添加和从队列取出缓冲区。 - `ConstructBuffer`函数用于构建缓冲池,创建线程及初始化信号量。 此外,...

    StageFright_Video Buffer傳輸流程

    `OMX_EmptyThisBuffer`函数用于清空输入缓冲区,而`OMX_FillThisBuffer`则用于填充输出缓冲区。这一系列操作确保了解码前后的数据传输顺畅。 2. **解码与反馈** 当`OMXvideodecoder`接收到输入端口的数据后,会...

    NIO学习系列:核心概念及基本读写

    4. **处理缓冲区**:读取完成后,可以通过`buffer.flip()`切换缓冲区到读模式,然后通过`buffer.get()`获取数据。 #### 写入操作 1. **创建缓冲区**:创建`ByteBuffer`,可以预先填充数据。 2. **分配通道**:同样...

    node.js中的buffer.toString方法使用说明

    Buffer(缓冲区)是Node.js中用于处理二进制数据的对象,它继承自JavaScript的Uint8Array类型,提供了一种在Node.js中进行流式数据处理,网络通信,文件操作等操作时,对二进制数据进行操作的方法和属性。...

    PB18111707_吕瑞_lab31

    【缓冲区溢出与安全防护】 缓冲区溢出是一种常见的计算机安全漏洞,它发生在程序试图将超过预定大小的数据写入固定大小的内存区域——即缓冲区时。当发生溢出,额外的数据会覆盖相邻的内存空间,可能导致程序崩溃...

    71117408_梅洛瑜_Operation system experiment report_2th1

    - 缓冲区:定义了一个`char buffer[10]`的缓冲区,用于存储当前的状态。 - 访问缓冲区时会改变其中的值,并打印出来显示状态变化。 6. **实验结果**: - 提供了在Ubuntu和Windows系统下的实验结果,但具体的结果...

    操作系统-生产者与消费案例实践报告手册.docx

    - **mutex**:用于保护对共享缓冲区buffer的访问,初值设为1,表示任何时候只允许一个线程访问缓冲区。 - **empty**:表示缓冲区中空闲位置的数量,初值设为BUFFER_SIZE。 - **full**:表示缓冲区中已填充的数据...

    nodejs pef文档

    3. 缓冲区(Buffer):在 Node.js 中 Buffer 类是用于处理二进制数据的全局类。Node.js 的文件系统操作经常涉及二进制数据,Buffer 类提供了在 JavaScript 中表示二进制数据的方法。手册会介绍如何创建 Buffer 对象...

    CSAPP AttackLab实验解决源码(亲测有效!!!)

    这个实验旨在教授计算机系统的安全性,防止攻击者定位攻击和锻炼使用金丝雀防护,特别是关于缓冲区溢出漏洞的理解和利用。在这个实验中,尝试利用缓冲区溢出漏洞来修改程序的执行流程,从而实现未授权的操作,比如...

    io流的认识练习

    最后,Java NIO(New IO)是Java 1.4引入的一个新模块,提供了非阻塞I/O操作,如通道(Channel)、选择器(Selector)和缓冲区(Buffer)。NIO相比传统的IO流,更适合处理高并发、大数据量的场景。 在进行`IO流`和`...

    Buffer0verflow OpenSecurity-开源

    Buffer0verflow 是一个常见的安全问题,它发生在程序尝试写入内存缓冲区时,超过了预分配的空间,导致数据溢出到相邻的内存区域。这种漏洞可能导致程序崩溃,甚至可能被恶意攻击者利用来执行任意代码,控制系统。...

    bnchelp_bnc使用手册_BNC_

    在深入理解BNC的使用之前,我们首先需要对网络中的缓冲区有个基本的认识。缓冲区是存储暂时等待处理的数据的空间,它在提高网络效率、减少拥塞和确保数据传输稳定方面扮演着关键角色。 本手册"bnchelp_bnc使用手册_...

    ORACLE 数据库入门.ppt

    - SGA(System Global Area)是Oracle数据库在操作系统内存中分配的一片区域,占用了60-70%的内存,其主要组成部分包括共享池(shared pool)、数据库缓冲区(database buffer cache)和重做日志缓冲区(redo log ...

    操作系统实验五

    通过本次实验,不仅加深了对进程间通信(特别是管道通信)的理解,还对虚拟内存中的页面置换算法有了更深刻的认识。尤其是对于各种置换算法的实际应用效果,通过实验结果的对比,能够直观感受到它们在不同场景下的...

    DX 基本三角形的绘制

    为了将数据传输到GPU,我们需要使用ID3D11DeviceContext的`CreateBuffer`方法,并通过`IASetVertexBuffers`接口将缓冲区绑定到渲染管线的输入组装阶段。 接下来,我们需要设置输入布局,这是GPU读取顶点数据的方式...

Global site tag (gtag.js) - Google Analytics