ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java NIO(New IO)

2020-06-09 17:51:28  阅读:244  来源: 互联网

标签:file Java NIO 阻塞 FD IO New select


前言

在开始正文前,先来看几个概念

  1. 同步异步:同步异步描述的是用户进程和内核进行的交互。同步是用户进程发起 IO 操作后需要等待或轮询内核,等内核 IO 操作完成后才能继续。异步是发起 IO 操作后,可以继续操作,等内核 IO 操作完成是会通知用户进程。
  2. 阻塞和非阻塞:阻塞和非阻塞描述的是用户线程调用内核IO操作的方式:阻塞是指IO操作需要彻底完成后才返回到用户空间;而非阻塞是指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成。

Java 中 NIO 和传统 IO 的区别:

io nio
面向Stream 面向Buffer
阻塞 IO 非阻塞,多路复用

多路复用

非阻塞 IO 中需要用户线程在每个IO通路上,各自不断轮询IO状态,来判断是否有可处理的数据。如果把一个连接的可读可写事件剥离出来,使用单独的线程来对其进行管理。多个IO通路都复用这个管理器来管理socket状态,这个叫I/O多路复用。

Linux 对多路复用的支持

1. select

下面是 Linux man 手册上对 select 的描述。

NAME         
        select,  pselect, FD_CLR, FD_ISSET,FD_SET, 
        FD_ZERO - synchronous I/O multiplexing
DESCRIPTION       
       select() allows a program to monitor multiple file descriptors,
       waiting until one or more of the file descriptors become "ready" for
       some class of I/O operation (e.g., input possible).  A file
       descriptor is considered ready if it is possible to perform a
       corresponding I/O operation (e.g., read(2), or a sufficiently small
       write(2)) without blocking.

       select() can monitor only file descriptors numbers that are less than
       FD_SETSIZE; poll(2) and epoll(7) do not have this limitation.  See
       BUGS.

select 对监听的数量有限制

2. poll

poll 与 select 没区别,采用了链表实现,没有数量限制。

3. epoll

select 和 poll 都是遍历文件描述符,epoll 是通过监听回调的机制处理。

Java NIO

Java NIO 由以下几个核心部分组成:

  • Channels
  • Buffers
  • Selectors

下面看下简单的概念,原理暂不展开。

1. Channel

定义参见下方截取的 Java 注释。比传统的 IO 抽象层次更高。

/**
 * A nexus for I/O operations.
 *
 * <p> A channel represents an open connection to an entity such as a hardware
 * device, a file, a network socket, or a program component that is capable of
 * performing one or more distinct I/O operations, for example reading or
 * writing.
  */

2. Buffer

下面是 Java 类注释的部分描述。

/**
 * A container for data of a specific primitive type.
 */

3. Selector

就是上文提到的“多路复用”。

Reference

  1. Redis的epoll模型
  2. Linux man

标签:file,Java,NIO,阻塞,FD,IO,New,select
来源: https://www.cnblogs.com/walterlee/p/13074270.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有