Java IO多路复用机制详解-程序员宅基地

技术标签: JAVA IO  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同一块内存实现

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chenwiehuang/article/details/105296691

智能推荐

Vue 父组件axios异步更新数据,子组件props 获取不到数据(mounted中),解决办法_vue axios异步请求没有返回就调用了mounted-程序员宅基地

文章浏览阅读1.2k次。当父组件axjos获取数据,子组件使用props接收数据时,执行mounted的时候axjos还没有返回数据,而且mounted只执行一次,这时 props中接收的数据为空解决方案:在对应组件中判断数据的长度..._vue axios异步请求没有返回就调用了mounted

基于Java+SpringBoot+Vue前后端分离仓库管理系统设计实现_仓库管理后端接口案例-程序员宅基地

文章浏览阅读6.2w次,点赞203次,收藏705次。仓库管理系统进行了字典管理、公告管理、用户管理、物资管理、物资申请管理、仓库员管理、统计报表等服务。设备采用关联数据库里的MySQL做为全面的数据库,合理存放数据,合理备份数据,确保数据稳定性。除此之外,程序流程还具备程序流程所需要的所有功能,大大提升了实际操作安全度,使库房管理系统软件从概念迈向实际,真真正正提升了信息资源管理效率。_仓库管理后端接口案例

电脑端播放m3u8视频_m3u8直接打开-程序员宅基地

文章浏览阅读8.2k次,点赞2次,收藏3次。电脑端M3U8文件转mp4概述:在视频这块,m3u8是一种索引文件,其文件内容索引至多个无格式或ts格式的文件。m3u8在ios自带浏览器可直接打开,安卓上的uc浏览器\QQ浏览器等也能运行行。ts格式的windows可以打开,无格式的windos不能直接打开,windows端有几种方案可合成并打开这些文件。我实现的是windows下,借助bat脚本语言和格式工厂的方法,实现m3u8文件所索引..._m3u8直接打开

Linux服务器开发一(基础)_linux 服务器-程序员宅基地

文章浏览阅读6k次,点赞9次,收藏62次。Linux1、Linux介绍Linux是类Unix计算机操作系统的统称。Linux操作系统的内核的名字也是“Linux”。Linux这个词本身只表示Linux内核,但在实际上人们已经习惯了用Linux来形容整个基于Linux内核的系统。Linux是由芬兰大学Linus Torvalds于1991年编写的。2、Linux发行版组成Linux内核应用软件一些GNU程_linux 服务器

【知识回顾】Java常用类库-Java Runtime-程序员宅基地

文章浏览阅读223次。Java Runtime 类是 Java 标准库中的关键类之一,它提供了对当前Java虚拟机实例的访问和控制,允许程序动态地修改和管理运行时环境。每个Java应用程序都有一个Runtime类实例,使得程序能够与其运行的环境相连接。Runtime类所在包为java.lang包,因此在使用的时候不需要进行导包。并且Runtime类被public修饰了,因此该类是可以被继承的。

计算机同步与异步的概念,同步与异步到底是什么???-程序员宅基地

文章浏览阅读2.1k次,点赞3次,收藏4次。总得来说,同步异步出现在以下几个领域:1 计算机网络。数据通信技术中有同步通信与异步通信。同步通信简单的说就是你在发送数据时候我必须同时接受。这个过程有精确的时钟控制。而异步通信是你在发数据时候必须加上开始与结束符号,这样我才可以接受,异步通信没有时钟控制。因为没有了时钟的控制(额外硬件),所以成本低,设备简单,但是传输效率较低。(开始与结束符占了开销)。在网络协议(network protoc..._计算机里的同步和异步

随便推点

计算机毕业设计 asp.net高校失物招领网 毕设-程序员宅基地

文章浏览阅读417次,点赞4次,收藏6次。用户的需求具体体现在各种学习文件的提供、保存、更新和查询方面,这就要求数据库结构能充分满足各种信息的输入和输出。得到上面数据项和数据结构以后,就可以设计出能够满足用户需求的各种实体,以及它们之间的关系,为后面的逻辑结构设计打下基础。根据系统的需求,该系统应该具有六个功能模块:会员注册模块,新闻发布模块,留言本模块,拾到信息公布享模块。设计规划出的实体有:管理员信息实体、注册用户信息实体、信息实体、拾到信息实体、站内新闻实体。2)注册用户信息,包括数据项:ID(系统自动编号),姓名,性别、班级等。

Sora,OpenAI带来的视觉革新-程序员宅基地

文章浏览阅读499次,点赞9次,收藏13次。想象一下,如果你可以仅通过敲击键盘,就能让你的思维火花转化为眼前跳动的影像,那会是怎样的体验?这不是科幻小说的情节,而是OpenAI最新推出的神奇工具——Sora。

Ubuntu20.04 LTS 安装 ros Noetic 树莓派4/PC_树莓派 ubuntu 20.04安装-程序员宅基地

文章浏览阅读655次。Ubuntu 20.04 LTS安装树莓派系统_树莓派 ubuntu 20.04安装

Webug靶场之旅——显错注入-程序员宅基地

文章浏览阅读742次,点赞2次,收藏2次。显错注入显错注入是SQL注入的一种,而SQL注入是指web应用程序对用户输入数据的合法性没有判断,导致攻击者可以构造不同的sql语句来实现对数据库的操作。SQL注入漏洞产生的条件: 1、用户能够控制数据的输入。 2、原本执行需要执行的代码时,拼接了用户的输入。打开webug靶场,打开id为1的靶场后,如图:这里我们使用工具的是Hackbar2.1.3版本,这个是免费的。首先,我们需要判断是否存在SQL注入。在参数后面多加一个单引号,然后将它上传,发现报错了通过页面的返回结果,_webug靶场

AD辅域控制器升级为主域控制器(图形界面操作)_升级域控-程序员宅基地

文章浏览阅读3.5w次,点赞23次,收藏139次。环境介绍Active Directory域控制器已经搭建好主域控和辅域控,主域控故障,手动升级辅域控为主。主域控:2012DC1,ip:192.168.15.1辅域控:2012DC2,ip:192.168.15.21、升级前分别在2012dc1和2012dc2上查询fsmo的归属2、在2012dc1上,打开AD用户和计算机,更改连接的域控制器3、选择20..._升级域控

(一)Spring-Cloud源码分析之核心流程关系及springcloud与springboot包区别(新)_spring cloud 源码-程序员宅基地

文章浏览阅读1k次,点赞3次,收藏4次。很多人搞不懂springboot和spring-cloud的关系到底是什么,也不知道这两者时间有什么区别,今天简单的聊聊。2022年发了一篇Springcloud和Springboot的区别对比,但后面回看总觉得少了点东西,这次重新发个补充一下。_spring cloud 源码

推荐文章

热门文章

相关标签