1、在Java中,常见的IO模型有4种,

  • 同步阻塞IO(Blocking IO)
  • 同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(New IO)库。
  • IO多路复用(IO Multiplexing):也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。这里复用的是指复用一个或几个线程,用一个或一组线程处理多个IO操作,减少系统开销小,不必创建和维护过多的进程/线程;
  • 异步IO(Asynchronous IO):即经典的Proactor设计模式,也称为异步非阻塞IO。

2、同步与阻塞概念

1)同步和异步的概念描述的是用户线程与内核的交互方式

  • 同步是指用户线程发起IO请求后需要等待或者轮询内核IO操作完成后才能继续执行;
  • 异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会通知用户线程,或者调用用户线程注册的回调函数。

2)阻塞和非阻塞的概念描述的是用户线程调用内核IO操作的方式

  • 阻塞是指IO操作需要彻底完成后才返回到用户空间;
  • 非阻塞是指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成。

“真正”的异步IO需要操作系统更强的支持。在IO多路复用模型中,事件循环将文件句柄的状态事件通知给用户线程,由用户线程自行读取数据、处理数据。而在异步IO模型中,当用户线程收到通知时,数据已经被内核读取完毕,并放在了用户线程指定的缓冲区内,内核在IO完成后通知用户线程直接使用即可。(图片来自https://blog.csdn.net/sehanlingfeng/article/details/78920423)

相比于IO多路复用模型,异步IO并不十分常用,不少高性能并发服务程序使用IO多路复用模型+多线程任务处理的架构基本可以满足需求。Java的NIO是基于I/O复用来实现的。

3、IO多路复用的底层原理

IO多路复用使用两个系统调用(select/poll/epoll和recvfrom),blocking IO只调用了recvfrom;select/poll/epoll 核心是可以同时处理多个connection,而不是更快,所以连接数不高的话,性能不一定比多线程+阻塞IO好,多路复用模型中,每一个socket,设置为non-blocking,阻塞是被select这个函数block,而不是被socket阻塞的。

1)select机制

客户端操作服务器时就会产生这三种文件描述符(简称fd):writefds(写)、readfds(读)、和exceptfds(异常)。select会阻塞住监视3类文件描述符,等有数据、可读、可写、出异常 或超时、就会返回;返回后通过遍历fdset整个数组来找到就绪的描述符fd,然后进行对应的IO操作。

优点:
  几乎在所有的平台上支持,跨平台支持性好
缺点:
  由于是采用轮询方式全盘扫描,会随着文件描述符FD数量增多而性能下降。
  每次调用 select(),需要把 fd 集合从用户态拷贝到内核态,并进行遍历(消息传递都是从内核到用户空间)
  默认单个进程打开的FD有限制是1024个,可修改宏定义,但是效率仍然慢。

2)poll机制

基本原理与select一致,只是没有最大文件描述符限制,因为采用的是链表存储fd。

3)epoll机制

epoll之所以高性能是得益于它的三个函数
  1)epoll_create()系统启动时,在Linux内核里面申请一个B+树结构文件系统,返回epoll对象,也是一个fd
  2)epoll_ctl() 每新建一个连接,都通过该函数操作epoll对象,在这个对象里面修改添加删除对应的链接fd, 绑定一个callback函数。
  3)epoll_wait() 轮训所有的callback集合,并完成对应的IO操作

优点:
  没fd这个限制,所支持的FD上限是操作系统的最大文件句柄数,1G内存大概支持10万个句柄
  效率提高,使用回调通知而不是轮询的方式,不会随着FD数目的增加效率下降
  内核和用户空间mmap同一块内存实现

Java IO多路复用机制详解相关推荐

  1. IO多路复用机制详解

    服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的s ...

  2. 【java】SPI机制详解

    1.概述 以前的文章:[SPI]java基础之SPI框架实现 转载:Java常用机制 - SPI机制详解 PI(Service Provider Interface),是JDK内置的一种 服务提供发现 ...

  3. io多路复用的原理和实现_IO多路复用机制详解

    select,poll,epoll机制区别总结: 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞I ...

  4. Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

    class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出 ...

  5. Java IO流使用详解

    1.前言 在众多流行的编程语言中,Java对IO的处理应该是最特殊的,Java打着"尽量减少IO类的设计理念",搞出了目前应该是最复杂的一套IO相关类,并称之为Java流. 对于新 ...

  6. IO多路复用--epoll详解

    epoll 或者 kqueue 的原理是什么? [转自知乎] Epoll 引入简介 首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象. 不管是文件,还是 ...

  7. Java动态代理机制详解

    class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出 ...

  8. Java 动态代理机制详解

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  9. Java IO流(详解)

    1. File 1. 创建 2. 操作 1. 获取文件信息 2. 目录创建/删除 2. IO流 1. FileInputStream 1. 简单使用 2. 读取中文 2. FileOutputStre ...

  10. 【Java】内存机制详解(new操作的执行原理)

    0.参考资料: http://www.j2megame.org/index.php/content/view/2246/125.html 1.Java的内存机制 Java 把内存划分成两种:一种是栈内 ...

最新文章

  1. 刷新ImageNet最高分!谷歌大脑华人研究员发布超强Transformer
  2. (一)win7下cocos2d-x 21 + vs2010
  3. get/post 接口调用
  4. mogodb 设置用户名密码认证
  5. JQuery中的基本筛选选择器
  6. html css精灵,谈谈CSS Sprites(css精灵)
  7. Triangle Generative Adversarial Networks
  8. Hadoop学习笔记(一):MapReduce工作机制
  9. SuperMap iClient3D for WebGL 示范案例(一)倾斜模型加载
  10. 在Ubuntu 18.04上安装tesseract 4.1.1
  11. 超详细软件工程黑书思维导图(从第一章到第八章)
  12. 2022年考研华中科技大学计算机学院硕士后记
  13. Excel VBA操作网页 显示滚动进度条
  14. 秋招公司真题刷题2019-2020java工程师
  15. 荷香莫深湎,终付秋风落。(模拟
  16. k8s_day03_02
  17. 通过网页控制嵌入式设备
  18. VSPD  7.0  虚拟串口创建不成功能,  修复步骤:
  19. [NAS] Synology (群晖) DSM 7.X 挂载NTFS硬盘
  20. 中标麒麟官方源——参考

热门文章

  1. matlab 窗函数频谱,功率谱、频率分辨率、频谱泄漏与窗函数
  2. Nature杂志总编辑:如何培养一个有价值的研究者
  3. ESP32利用百度智能云实现图像识别 文字识别
  4. 广域网、城域网及局域网技术
  5. 局域网、城域网、广域网、国际互联网(internet)
  6. pcshare完美版
  7. Java工作流系统jflow从表功能介绍一
  8. 金蝶k3 与用友ncc凭证同步
  9. ESP32烧录Arduino生成的bin文件
  10. 从12306获取全国火车站的字典