网站首页 > 技术文章 正文
概述
是否和我有一样的困惑。什么阻塞IO、非阻塞IO、同步IO、异步IO,多路复用(epoll)等本质还是同步IO,这时可能你和我一样懵逼多路复用是同步的IO,那么使用epoll的nginx、redis、swoole等服务端程序又是异步的,这不前后矛盾么?网上文章又是五花八门,越看越糊涂。终于我无法忍受这样概念不清晰,乱麻一般的萦绕在我的心头。我决定要彻底拨开云雾见蓝天,啊!终于在一个阳光明媚的午后,就彻底顿悟了,这感觉如同德芙一般丝滑。今天就跟随我的步伐让你有丝滑一般的感觉,兄弟们走起来!!!!
网络I/O
IO:IO是input/ouput英文缩写,顾名思义就是输入输出的意思,在计算中以CPU为视角,所有和外设(键盘、显卡、网卡、打印机的等)的数据操作都是涉及IO操作,外设流向CPU的是input,流向外设的就是ouput。网络IO就是网卡和CPU之间的数据交互。
思考一个问题:网卡数据流向CPU都经过哪些流程
用户进程发起一个网络IO操作的时候,大致上分为三个部分
- 用户进程读取数据,读取数据只会有三个可能(有数据、没有数据、出错)
- 网卡数据从网卡外设到内核空间(此过程现代计算机是不需要CPU参与,网卡控制器通过DMA技术直接搬运到内核空间)。数据完成空网卡控制器会发出中断信号。
- 数据到内核之后CPU负责复制(在此我们先不考虑零拷贝情况)到用户空间。
用户进程和内核交互围绕着1和3进行。到此在1和3环节就会有很多故事发生了。且听我慢慢道来!!!!
在给出分类之前我先抛出阻塞、非阻塞、异步、同步的定义,定义来自《UNIX 网络编程卷一 》的 6.2 章节
根据 POSIX 定义:
- A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes(导致请求进程阻塞, 直到 IO 操作完成)。
- An asynchronous I/O operation does not cause the requesting process to be blocked(不导致请求进程阻塞)。
上述定义是说:如果在1阶段系统挂起用户进程,那么该IO操作就是阻塞IO,反之不挂起,就是非阻塞IO。如果在2阶段系统挂起用户进程,那么这次IO操作就是同步,反之不挂起就是异步。
有了上述的定义,我们如何尚方宝剑一样,在也不担心傻傻分不清网络IO相关晦涩难懂的概念了。就如同初中老师教会我们如何判断什么是化学反应变化是物理变化,判断标准就是看有无新的物质生成。我们判断网络分类标准就是如上述的定义。对,就是这么狭义!!!
操作针对上述1和3处理行为,我们将网络IO分类下列5类。
- 阻塞IO 此IO操作在1和3两个阶段,用户进程都在休眠状态
- 非阻塞I/O 此IO操作在1阶段未被挂起,3阶段被挂起
- 多路复用I/O 此IO操作在1阶段 (select,poll)被挂起、epoll未挂起,3阶段被挂起
- 信号驱动I/O 此IO操作在1阶段未挂起,的数据到从网卡到内核之后,CPU通过信号机制通知用户进程。用户进程3阶段被挂起
- 异步I/O 此IO操作在1和3阶段都不需要用户进程参与,数据拷贝完成后CPU会通知用户进程
此刻来一张很经典的图
从图中和上述定义就能看到真正的异步IO只有最后一个是。其余四个都是同步IO。对于同步和异步深入理解,其实在3这个阶段CPU需要拷贝数据到用户空间,等于用户进程切换到内核空间去执行拷贝操作,这个时候用户进程只能被挂起等待CPU拷贝数据直到完成。用户进程被挂起这段时间,用户进程的后续代码都是无法执行的只能同步等待。
并发编程模型
追求性能极致的程序员们,不遗余力地压榨CPU。基于系统提供的网络IO模型,人类设计出形形色色的并发模型。
- 阻塞IO这种是完美无法提供并发的能力,只能串行的去处理客户端连接,所以网络IO就有了新的发展,进入到了非阻塞IO
- 非阻塞IO 这种IO模型 就能设计出多线程、多进程并发模型
- 多路复用 这便是并发能力秘密武器,基于这种网络IO 衍生出了 reactor反应堆并发模型,大名鼎鼎的nginx、redis就是reactor模型
- 信号驱动和异步IO 暂时还未有更多的使用
异步编程模型
在上述的并发模型中其实单纯靠多进程和多线程,还无法达到人们的预期。所以就有了异步编程模型,异步编程模型的宗旨就是,用户程序调用同步的网络IO 模拟异步IO。人们经常说的异步IO更多指的是 异步编程模型(netty就是典型的异步IO)
在异步编程过有两个核心的技术技术回调和协程。
总结
并非同步IO就会性能差,异步IO就会性能好。要具体情况而定!!!
猜你喜欢
- 2024-10-21 面试官:NIO非阻塞网络编程原理了解吗?一文深度讲解避坑
- 2024-10-21 Java阻塞队列中的异类,SynchronousQueue底层实现原理剖析
- 2024-10-21 超详细的I/O多路复用概念、常用I/O模型、系统调用等介绍
- 2024-10-21 非阻塞同步算法与CAS(比较和交换)无锁算法 - 美因茨
- 2024-10-21 为什么要学IO模型(同步阻塞,异步非阻塞)?
- 2024-10-21 非阻塞同步机制和CAS 治疗青光眼的药物中,降压机制是使阻塞房角开放的是
- 2024-10-21 一文搞懂什么是阻塞IO、信号驱动IO、Reactor模型、零拷贝
- 2024-10-21 Java面试常见问题:阻塞与非阻塞,同步与异步
- 2024-10-21 聊聊Java BIO(同步阻塞IO)、NIO(非阻塞IO)、AIO(异步IO)
- 2024-10-21 探索IO模型:从同步阻塞到异步非阻塞
你 发表评论:
欢迎- 11-19零基础学习!数据分析分类模型「支持向量机」
- 11-19机器学习 | 算法笔记(三)- 支持向量机算法以及代码实现
- 11-19我以前一直没有真正理解支持向量机,直到我画了一张图
- 11-19研一小姑娘分享机器学习之SVM支持向量机
- 11-19[机器学习] sklearn支持向量机
- 11-19支持向量机
- 11-19初探支持向量机:用大白话解释、原理详解、Python实现
- 11-19支持向量机的核函数
- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)