当前位置: 首页 > news >正文

IO基础-IO多路复用基础

Java的Selector封装了底层epoll和poll的API,可以通过指定如下参数来调用执行的内核调用, 在Linux平台,如果指定

-Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.PollSelectorProvider 则底层调用poll,

-Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider 或者不指定,则底层调用epoll。

一、I/O多路复⽤比较

I/O多路复⽤与传统的多线程/多进程模型相⽐,I/O多路复⽤的最⼤优势是系统开销⼩,系统不需要创建新的额外进程或者线程,也不需要维护这些线程和进程的运⾏行,降低了系统的维护⼯作量,节省了系统的资源。

二、多路复用IO模型的实践方式对比(更准确的说Selector实现方式)

1、数据结构存储区别

        select 使⽤用fd_set(bitmap数组保存⽂文件描述符)默认1024

        poll 使⽤pollfd结构(链表保存⽂件描述符) fd打开数量最大是系统上限。

        epoll 使⽤用红黑树和双向链表保存⽂件描述符 fd打开数量最⼤是系统上限。

2、轮询的⽅方式

        select 遍历连接总数时间复杂度为O(n)

        poll 遍历连接总数时间复杂度为O(n)

        epoll最⼤的优点就在于它只管你“活跃”的连接,fd就绪后进行回调。时间复杂度为O(1)

3、⽤用户态和内核态切换

        select、poll 用户态和内核态切换,需要fd来回拷⻉。

        epoll 使⽤mmap加速内核与内存⽤户空间的消息传递

4、epoll的高性能原因:

        1、epoll使用了红黑树来保存需要监听的文件描述符事件,epoll_ctl增删改操作快速。

        2、epoll不需要遍历就能获取就绪fd,直接返回就绪链表即可。

        3、linux2.6 之后使用了mmap技术,数据不在需要从内核复制到用户空间,零拷贝。

        思考:是不是解决了C10K问题。解决了,还可以进行优化吗?

        可以使用 Reactor模式解决阻塞点。

参考:这次答应我,一举拿下 I/O 多路复用!

http://www.lryc.cn/news/341237.html

相关文章:

  • Python机器学习项目开发实战:如何进行人脸识别
  • 管理能力学习笔记五:识别团队角色,因才施用
  • Real3DPortrait照片对口型,数字人,音频/视频驱动数字人
  • Stable Diffusion之Ubuntu下部署
  • LeetCode-15-三数之和问题
  • springboot2集成东方通tongweb嵌入式版
  • 【二分查找】Leetcode 33. 搜索旋转排序数组【中等】
  • Zephyr Windows开发环境搭建
  • 如何安全地设置MySQL数据库的IP白名单
  • Chatgpt掘金之旅—有爱AI商业实战篇|品牌故事业务|(十六)
  • 为什么要部署IP SSL证书?怎么申请?
  • 最新免费 ChatGPT、GPTs、AI换脸(Suno-AI音乐生成大模型)
  • 前端的未来已然到来
  • Open CASCADE学习|gp_XYZ与gp_Mat
  • BMS绝缘电阻检测原理【转】
  • 优秀的测试开发工程师需要掌握哪些技能?
  • 思维树(Tree of Thoughts)的概念
  • 探索设计模式的魅力:抽象工厂模式的艺术
  • 果园系统养殖游戏喂养偷菜种植浇水养成小程序
  • Windows版PHP7.4.9解压直用(免安装-绿色-项目打包直接使用)
  • 凡泰极客亮相2024 亚马逊云科技出海全球化论坛,为企业数字化出海赋能
  • 新零售门店、商品、会员管理指标体系总览
  • 网上订餐系统|基于springboot的网上订餐系统设计与实现(源码+数据库+文档)
  • python的抽象类和抽象方法
  • Android MVVM架构学习——ViewModel DataBinding
  • 防抖与节流
  • 理解 Nginx 的多站点配置:为每个网站单独配置
  • 支持向量机模型pytorch
  • 轮转数组(力扣)
  • 批量插入10w数据方法对比