Netty学习之I/O 模型和Java NIO 编程(2)

上一篇 / 下一篇  2022-12-08 11:35:18

  3.6.3 Selector方法
  public static Selector open():得到一个选择器对象
  public int select(long timeout):监控所有注册的通道,当其中IO操作可以进行时,将对应的SelectionKey加入到内部集合中返回,参数为超时时间
  public Set<SlectionKey> selectedKeys():从内部集合中得到所有的SlectionKey
  selector.select() //阻塞
  selector.select(1000) //阻塞1000s
  selector.wakeup(); //唤醒 selector
  selector.selectNow(); //不阻塞, 立马返还
  3.7 NIO 非阻塞 网络编程原理分析图
  NIO 非阻塞 网络编程相关的(Selector、 SelectionKey、 ServerScoketChannel 和 SocketChannel) 关系梳理图
  ·当客户端连接时, 会通过 ServerSocketChannel 得到 SocketChannel
  · Selector 进行监听 select 方法, 返回有事件发生的通道的个数.
  · 将 socketChannel 注册到 Selector 上, register(Selector sel, int ops), 一个 selector 上可以注册多个 SocketChannel
  · 注册后返回一个 SelectionKey, 会和该 Selector 关联(集合)
  · 进一步得到各个 SelectionKey (有事件发生)
  · 在通过 SelectionKey 反向获取 SocketChannel , 方法 channel()
  · 可以通过 得到的 channel , 完成业务处理
  3.8 SelectionKey
  SelectionKey, 表示 Selector 和网络通道的注册关系, 共四种:
  int OP_ACCEPT: 有新的网络连接可以 accept, 值为 16
  int OP_CONNECT: 代表连接已经建立, 值为 8
  int OP_READ: 代表读操作, 值为 1
  int OP_WRITE: 代表写操作, 值为 4
  3.9 ServerSocketChannel
  ServerSocketChannel 在服务器端监听新的客户端 Socket 连接。
  3.10 SocketChannel
  SocketChannel,网络 IO 通道,具体负责进行读写操作。NIO 把缓冲区的数据写入通道, 或者把通道里的数据读到缓冲区。
  3.11 NIO 与零拷贝
  3.11.1 基本介绍
  在 Java 程序中, 常用的零拷贝有 mmap(内存映射) 和 sendFile。
  所谓零拷贝,是从操作系统角度来看没有CPU拷贝。
  3.11.2 传统IO模型
  DMA: direct memory access 直接内存拷贝(不使用 CPU)
  3.11.4 mmap 优化
  mmap 通过内存映射, 将文件映射到内核缓冲区, 同时, 用户空间可以共享内核空间的数据。
  3.11.5 sendFile 优化
  Linux 2.1 版本 提供了 sendFile 函数, 其基本原理如下: 数据根本不经过用户态, 直接从内核缓冲区进入到Socket Buffer,同时,由于和用户态完全无关,就减少了一次上下文切换。
  系统调用:需要进行线程上下文切换,但不是进程上下文切换
  3.11.6 sendFile改进
  Linux 在 2.4 版本中, 做了一些修改, 避免了从内核缓冲区拷贝到 Socket buffer 的操作, 直接拷贝到协议栈,从而再一次减少了数据拷贝。
  这里还是有一次少量数据的CPU拷贝。
  kernel buffer → socket buffer
  拷贝的信息很少,比如length,offset等,消耗很低,可以忽略。

TAG: 软件开发 Java java

 

评分:0

我来说两句

Open Toolbar