个人简介

Echo Blog


江湖无名 安心练剑
  • Java NIO-09-零拷贝之 Sendfile
    sendfile() 为了简化用户接口,同时还要继续保留 mmap()/write() 技术的优点: 减少 CPU 的拷贝次数,Linux 在版本 2.1 中引入了 sendfile() 这个系统调用。 sendfile() 不仅减少了数据拷贝操作,它也减少了上下文切换。 首先:sendfile() 系统调用利用 DMA 引擎将文件中的数据拷贝到操作系统内核缓冲区中,然后数据被拷贝到...
    2018-09-22 04:20:47 | Java
  • Java NIO-09-零拷贝之 MMAP
    MMAP 在 Linux 中,减少拷贝次数的一种方法是调用 mmap() 来代替调用 read,比如: tmp_buf = mmap(file, len); write(socket, tmp_buf, len); 流程 首先,应用程序调用了 mmap() 之后,数据会先通过 DMA 拷贝到操作系统内核的缓冲区中去。 接着,应用程序跟操作系统共享这个缓冲区,这样,操作系统内核和...
    2018-09-22 04:20:47 | Java
  • Java NIO-09-零拷贝之 DMA
    DMA DMA 的好处 在介绍DMA之前我想问大家:我们为什么要引入DMA,DMA对我们有什么好处那? 计算机系统中各种常用的数据输入/输出方法有查询方式(包括无条件及条件传送方式)和中断方式,这些方式适用于CPU与慢速及中速外设之间的数据交换。 但当高速外设要与系统内存或者要在系统内存的不同区域之间进行大量数据的快速传送时,就在一定程度上限制了数据传送的速率。 直接存储器存取(D...
    2018-09-22 04:20:47 | Java
  • Java NIO-09-零拷贝之直接 I/O
    直接 I/O 的动机 在介绍直接 I/O 之前,这一小节先介绍一下为什么会出现直接 I/O 这种机制,即传统的 I/O 操作存在哪些缺点。 什么是缓存 I/O (Buffered I/O) 缓存 I/O 又被称作标准 I/O,大多数文件系统的默认 I/O 操作都是缓存 I/O。 在 Linux 的缓存 I/O 机制中,操作系统会将 I/O 的数据缓存在文件系统的页缓存( page c...
    2018-09-22 04:20:47 | Java
  • Java NIO-09-零拷贝之写时复制
    对应用程序地址空间和内核之间的数据传输进行优化的零拷贝技术 前面提到的几种零拷贝技术都是通过尽量避免用户应用程序和操作系统内核缓冲区之间的数据拷贝来实现的,使用上面那些零拷贝技术的应用程序通常都要局限于某些特殊的情况:要么不能在操作系统内核中处理数据,要么不能在用户地址空间中处理数据。 而这一小节提出的零拷贝技术保留了传统在用户应用程序地址空间和操作系统内核地址空间之间传递数据的技术,但...
    2018-09-22 04:20:47 | Java
  • Java NIO-09-零拷贝之内存共享 buffer share
    缓冲区共享 还有另外一种利用预先映射机制的共享缓冲区的方法也可以在应用程序地址空间和操作系统内核之间快速传输数据。 采用缓冲区共享这种思想的架构最先在 Solaris 上实现,该架构使用了“ fbufs ”这个概念。 这种方法需要修改 API。 应用程序地址空间和操作系统内核地址空间之间的数据传递需要严格按照 fbufs 体系结构来实现,操作系统内核之间的通信也是严格按照 fbufs...
    2018-09-22 04:20:47 | Java
  • Java NIO-09-零拷贝
    业务代码中的拷贝 在业务代码的编写中,我们会遵循分层的思想。 前端页面传递一个 Restful,我们在 controller 变为 vo,然后到 service 变为 bean,在数据库操作变为 dao。 每一次都要进行属性的复制。 如果直接从 vo=>入库,可以认为是一种零拷贝。 Linux 系统 传统拷贝 传统的 Linux 操作系统的标准 I/O 接口是基于数据拷贝...
    2018-09-22 04:20:47 | Java
  • Java NIO-09-17-零拷贝之 java 实现
    Java NIO 零拷贝实现 基本概念 在 Java NIO 中的通道(Channel)就相当于操作系统的内核空间(kernel space)的缓冲区。 而缓冲区(Buffer)对应的相当于操作系统的用户空间(user space)中的用户缓冲区(user buffer): 通道(Channel)是全双工的(双向传输),它既可能是读缓冲区(read buffer),也可能是网络缓冲区...
    2018-09-22 04:20:47 | Java