I/O 基础

缓冲区操作

缓冲区以及缓冲区是如何工作,是所有I/O的基础。“输入/输出”就是把数据移进或移出缓冲区。

进程执行I/O操作,就是向操作系统发出请求,让它要么把缓冲区的数据排干(写),要么用数据把缓冲区填满(读)。进程使用这一机制处理所有数据进出操作。

从磁盘读数据到进程内存区:
read-from-disk-into-user-process

进程使用 read( ) 系统调用,要求其缓冲区被填满。内核随即向磁盘控制硬件发出命令,要求其从磁盘读取数据。磁盘控制器把数据直接写入内核内存缓冲区,这一步通过DMA完成,无需主CPU 协助。一旦磁盘控制器把缓冲区装满,内核即把数据从内核空间的临时缓冲区拷贝到进程执行 read( ) 调用时指定的缓冲区。

用户空间与内核空间

  • 用户空间:用户空间是常规进程所在区域,是非特权区域,比如该区域的代码不能直接访问硬件设备。
  • 内核空间:内核空间是操作系统所在区域,有特别的权利:能与设备控制器通讯,控制用户区域进程的运行状态等等。

所有I/O都直接或间接通过内核空间,通过请求页面调度完成。

当进程请求I/O操作的时候,它执行一个系统调用将控制权移交给内核。内核随即采取必要步骤,找到进程所需数据,并把数据传送到用户空间内指定的缓冲区。如果数据已在内核空间,直接拷贝即可;如果不在内核空间,则进程被挂起,内核着手把数据读进内存。

发散、汇聚

根据发散、汇聚的概念,进程只需一个系统调用,就能把一连串缓冲区地址传递给操作系统,然后内核就可以顺序填充或排干多个缓冲区,读的时候把数据发散到多个用户空间缓冲区,写的时候再从多个缓冲区把数据汇聚起来。

scatter-gather

继续阅读

Java 7 SDP

名词解释:

  • RDMA,Remote Direct Memory Access,远程直接内存存取。为低延迟应用提供了一种协议,可以直接访问其他计算机的内存,而不需要操作系统的参与。
  • InfiniBand: InfiniBand (IB) 是一项新的基于交换光纤结构的 I/O 技术。 它为将 I/O 设备连接到主机以及主机到主机通信提供了高带宽、低延迟的互连。InfiniBand提供了对RDMA的支持。
  • SDP:Sockets Direct Protocol,套接字直接协议。是一种网络协议用于支持在InfiniBand连接上的流连接。

概览

SDP本质上是一种TCP绕过技术。当SDP允许时,一个应用程序尝试打开一个TCP连接,TCP机制被绕过了,通信直接到IB网络。

当应用程序尝试绑定到一个TCP地址时,底层软件根据配置文件里的信息决定是否重新绑定到一个SDP协议。这个过程可以在绑定过程或连接过程(但对每个连接只发生一次)。

不需要修改应用代码里的API就可以利用SDP协议:实现是透明的并被经典网络(java.net)和NIO(java.nio.channels)包支持。

SDP默认是禁止的,开启步骤:

  • 创建一个SDP配置文件;
  • 设置系统属性指向配置文件路径。

继续阅读