Java IO多路复用机制详解
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多路复用机制详解相关推荐
- IO多路复用机制详解
服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的s ...
- 【java】SPI机制详解
1.概述 以前的文章:[SPI]java基础之SPI框架实现 转载:Java常用机制 - SPI机制详解 PI(Service Provider Interface),是JDK内置的一种 服务提供发现 ...
- io多路复用的原理和实现_IO多路复用机制详解
select,poll,epoll机制区别总结: 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞I ...
- Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出 ...
- Java IO流使用详解
1.前言 在众多流行的编程语言中,Java对IO的处理应该是最特殊的,Java打着"尽量减少IO类的设计理念",搞出了目前应该是最复杂的一套IO相关类,并称之为Java流. 对于新 ...
- IO多路复用--epoll详解
epoll 或者 kqueue 的原理是什么? [转自知乎] Epoll 引入简介 首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象. 不管是文件,还是 ...
- Java动态代理机制详解
class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出 ...
- Java 动态代理机制详解
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- Java IO流(详解)
1. File 1. 创建 2. 操作 1. 获取文件信息 2. 目录创建/删除 2. IO流 1. FileInputStream 1. 简单使用 2. 读取中文 2. FileOutputStre ...
- 【Java】内存机制详解(new操作的执行原理)
0.参考资料: http://www.j2megame.org/index.php/content/view/2246/125.html 1.Java的内存机制 Java 把内存划分成两种:一种是栈内 ...
最新文章
- 刷新ImageNet最高分!谷歌大脑华人研究员发布超强Transformer
- (一)win7下cocos2d-x 21 + vs2010
- get/post 接口调用
- mogodb 设置用户名密码认证
- JQuery中的基本筛选选择器
- html css精灵,谈谈CSS Sprites(css精灵)
- Triangle Generative Adversarial Networks
- Hadoop学习笔记(一):MapReduce工作机制
- SuperMap iClient3D for WebGL 示范案例(一)倾斜模型加载
- 在Ubuntu 18.04上安装tesseract 4.1.1
- 超详细软件工程黑书思维导图(从第一章到第八章)
- 2022年考研华中科技大学计算机学院硕士后记
- Excel VBA操作网页 显示滚动进度条
- 秋招公司真题刷题2019-2020java工程师
- 荷香莫深湎,终付秋风落。(模拟
- k8s_day03_02
- 通过网页控制嵌入式设备
- VSPD 7.0 虚拟串口创建不成功能, 修复步骤:
- [NAS] Synology (群晖) DSM 7.X 挂载NTFS硬盘
- 中标麒麟官方源——参考