Netty系列(一)NIO基础

浮生半日闲 发布于 2023-03-05 13 次阅读


NIO即non-blocking I/O(非阻塞式IO)。指的是应用程序在调用NIO完成某个操作时,内核立即返回,不会将CPU时间切换给其他进程,应用程序在返回后,可以得到足够的CPU时间继续完成其他的事情。

与之相对的是阻塞式IO,当应用程序调用阻塞式IO完成某个操作时,应用程序会被挂起,等待内核完成操作。

下面介绍NIO的三大组件:

1、channel

channel是数据传输通道。同样是数据传输,NIO中的channel和IO中的Stream的区别如下:

  • Stream是单向的,即我们用Stream去读写数据的时候,读写是分离的,必须指定用的是InputStream还是OutputStream;而channel则不同,它是双向的,可读可写;
  • Stream是阻塞式的,而channel可以异步读写;
  • Stream中的数据,可以选择先读入到缓存中去(BufferInputStream/BufferOutputStream),而channel则必须通过缓存才能读写。

2、Buffer

前面说到channel必须通过缓存才能读写数据,这里的缓存即内存缓冲区(Buffer),目的是暂存从channel中读入的数据或者向channel中写入的数据。其内部实现为一个在内存中的字节数组:

public abstract class Buffer {
    // Invariants: mark <= position <= limit <= capacity
    // 标记的位置 
    private int mark = -1;
    // 当前指针位置
    private int position = 0;
    // 限制位置
    private int limit;
    // 容量
    private int capacity;

    long address;
}

具体的读写数据的原理在后面ByteBuffer时再进行详细说明。

3、selector

selector是一个选择器,配合一个线程去管理多个channel,它通过获取channel上发生的事件,不让线程吊死在同一个channel上。