| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 以后谁再问你什么是多路复用io,那他就算踢到钢板上了 -> 正文阅读 |
|
[Java知识库]以后谁再问你什么是多路复用io,那他就算踢到钢板上了 |
io是很多Java / python / go开发人员的重灾区,如果平时开发没接触过,可能就只知道个阻塞/非阻塞、同步/异步,厉害一点的再来个多路复用 今天,我就带着你探索一下io的发展史,以后再有人问你io,那他就是纯纯踢到钢板上了 网络上关于io的文章多如牛毛,但是下面这段话你可能是第一次看到(看得懂就看,看不懂就跳过,该你懂的时候自然会懂): 不管是windows还是linux,所有牵涉到 io 的操作,都无法由应用程序直接完成,把文件操作权限开放给用户是很危险的,想执行io操作,必须使用操作系统内核提供的函数,但这些函数不需要我们亲自调用,Java已经帮我们做好了封装,我们在开发时调相关api即可,如下图这两个包
ok废话说完,我们先把相关概念梳理清楚
光看概念脑瓜子嗡嗡的吧,没关系,请看大屏幕~ 干饭 公司附近有家网红饭店,每天去他们家吃饭的小姐姐特别多,当然你不要误解我的意思,我是想说他们家饭很好看,啊…不对,我的意思是他们家小姐姐很好吃,啊呸…也不对 总之我经常去,期间我的点餐方式经历了以下几个版本:
取餐和io之间的关系:
关于操作系统对于io到nio的函数支持,演变过程比较复杂,你需要先搞懂操作系统如何实现零拷贝,请移步 零拷贝技术浅浅析 关于io / nio,其实就上面这点东西,千万别被绕晕了,今天我们的主题是 多路复用io 老规矩,先抛几个兄弟们最最最常见的疑惑,这些疑惑在下文都会找到答案:
传统的网络通信都是使用socket,流程如下:
流程来看没啥毛病,但是你要知道,accept是阻塞的,也就是说同时只能处理一个请求,如果你想同时处理多个,可以用多线程,但这样又会引发另一个问题:操作系统中的线程多了后,需要耗费大量资源来管理线程和上下文切换(这里啰嗦一句,不管什么场景,线程并不是越多越好,到达某个阈值后,线程越多效率反而越低) 所以,想优雅地同时处理多个请求,操作系统内核必须实现单个线程监听多个socket,即 io多路复用 linux系统对多路复用的支持有三种:
来看看这三种函数的实现,关于他们三个的性能也就大概清楚了 select
参数解释:
至此,一个线程只能管理一个连接的痛点算是解决了,但还存在两个问题:
所以linux引入了poll,解决文件描述符限制的问题 poll
参数解释:
相对于select,poll其实就突破了文件描述符的限制,但仍然需要我们遍历每个文件描述符来检测是否就绪 所以,Linux2.6引入了epoll epollepoll有三个函数epoll_create、epoll_ctl 和 epoll_wait
epoll模型支持自定义监听的描述符数量,也可以直接返回就绪的描述符 大名鼎鼎的redis在Linux系统的实现就是用的epoll模型,所以即使是单线程,也能轻松应对高并发的客户端访问 说了这么多,那到底什么是io多路复用?复用的是什么? 这两个问题我觉得很难解释,可能等以后真正接触到操作系统层面的知识了,才会真正悟透吧 个人对于复用的看法: 首先肯定不是对socket的复用,一个请求对应一个socket耶稣来了也改变不了; 也不是对线程的复用,但好像也可以这么理解,因为毕竟是一个线程管理多个socket; 所谓复用,可能并不是非得复用某一个东西,我觉得是通过一次到内核的请求实现对多个socket的管理这个行为 关于上面提到的各种函数了解即可,不用太深入研究,我也是翻了好些文档才得到这些信息,没必要在上面花太多时间,不然脑瓜子嗡嗡的~,我现在脑瓜子就嗡嗡的,果然懂得越多不懂得就越多。。。 ok我话说完 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 11:45:39- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |