18.NIO之零拷贝

[TOC]一、传统IO问题传统的 IO 将一个文件通过 socket 写出File f = new File("helloword/data.txt"); RandomAccessFile file = new RandomAccessFile(file, "r"); byte[] buf = new byte[(int)f.length()]; f...

Java 2022-06-05 AM 718次 0条

17.NIO之IO模型

[TOC]一、IO流程就是对于 Linux 系统, I/O 操作不是一步完成的。此处的 I/O 操作是一个通用型的概念,对于 socket 通信,也可以看作一个 I/O 操作过程,只不过操作的是网络对象。I/O 操作一般分为两个部分:应用程序发起 I/O 操作请求,等待数据,或者将要操作的数据拷贝到系统内核中(比如 socket)。系统内核进行 I/O 操作(一般是内核将数据拷贝到用户进程中...

Java 2022-06-05 AM 795次 0条

16.NIO之多线程优化

[TOC]前言之前说到的服务端程序都是在一个线程上进行的,这个线程不仅负责连接客户端发来的请求,同时还要处理读写事件,这样效率还是不够高。如今电脑都是多核处理器,这意味着可以同时进行多个线程,所以服务端应该充分利用这一点。一、概述服务端线程可以建立多个线程,将这些线程分成两组:单线程配一个选择器(Boss),专门处理 accept 事件创建 cpu 核心数的线程(Worker),每个线程配一...

Java 2022-06-04 PM 747次 0条

15.NIO Selector之处理write事件

一次无法写完例子非阻塞模式下,无法保证把 buffer 中所有数据都写入 channel,因此需要追踪 write 方法的返回值(代表实际写入字节数)用 selector 监听所有 channel 的可写事件,每个 channel 都需要一个 key 来跟踪 buffer,但这样又会导致占用内存过多,就有两阶段策略当消息处理器第一次写入消息时,才将 channel 注册到 selector ...

Java 2022-06-03 PM 755次 0条

14.NIO消息边界问题处理

[TOC]一、消息边界问题的产生1.1 服务端代码import lombok.extern.slf4j.Slf4j; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import ...

Java 2022-06-03 PM 886次 0条

13.Selector处理accept和read事件

[TOC]前言多路复用单线程可以配合 Selector 完成对多个 Channel 可读写事件的监控,这称之为多路复用多路复用仅针对网络 IO、普通文件 IO 没法利用多路复用如果不用 Selector 的非阻塞模式,线程大部分时间都在做无用功,而 Selector 能够保证有可连接事件时才去连接有可读事件才去读取有可写事件才去写入限于网络传输能力,Channel 未必时时可写,一旦 Cha...

Java 2022-06-02 PM 761次 0条

12.NIO之选择器(Selector)

[TOC]一、概述​ Selector一般称为选择器,也可以翻译为多路复用器,是Java NIO核心组件之一,主要功能是用于检查一个或者多个NIO Channel(通道)的状态是否处于可读、可写。如此可以实现单线程管理多个Channel(通道),当然也可以管理多个网络连接。​ 使用Selector的好处在于,可以使用更少的线程来处理更多的通道,相比使用更多的线程,...

Java 2022-06-01 PM 763次 0条