网站建设都有什么栏目,上海网站建设的价格,公司网站怎么自己制作,php做网站导购模板文章目录 前言阻塞与非阻塞同步与异步复杂的网络IO真正的异步IOIO分类与示例总结 前言
这几个名词在程序开发时经常听到#xff0c;但是突然问起来各个词的含义一时间还真是说不清楚#xff0c;貌似这几个词都是翻译过来的#xff0c;每个人的解释都不太一样#xff0c;我… 文章目录 前言阻塞与非阻塞同步与异步复杂的网络IO真正的异步IOIO分类与示例总结 前言
这几个名词在程序开发时经常听到但是突然问起来各个词的含义一时间还真是说不清楚貌似这几个词都是翻译过来的每个人的解释都不太一样我对这几个词的理解也不是一成不变的随着开发经验的积累渐渐有了自己的记忆方式所以总结一下不一定准确有问题可以一起聊一聊。
先说说我的结论阻塞与非阻塞是指等待执行结果时的状态同步与异步是指获取执行结果的方式读起来有点绕口听起来也迷迷糊糊的没关系我们用具体的例子来说明应该就容易理解了。 阻塞与非阻塞
先说说『阻塞与非阻塞是指等待执行结果时的状态』这一句是说在执行某个操作或者某个函数时在没有拿到我们想要的结果时我们的状态是怎样的如果是一直等就是【阻塞】的如果发现没有结果就去做别的事情了就是【非阻塞】的。
以常见的网络IO为例服务器对客户端连接的socket调用read函数试图获取客户端发送的请求数据但是客户端并不总是有数据发送过来所以想要获得数据我可以采用【阻塞】方式一直等也可以采用【非阻塞】方式在发现此时没有数据时就先去干别的事一会再来看看。
同步与异步
再来说说『同步与异步是指获取执行结果的方式』这一句以游戏中的常见升级发奖为例可以主动调用升级函数在执行完成后返回升级的结果然后根据结果来发奖励也就是【同步】写法也可以注册一个监听等级变化的回调函数注册完我就不管了当升级时会将升级的结果通过回调函数传回来这就是【异步】处理方式。
复杂的网络IO
为什么同步和异步没有用网络IO来举例呢因为网络IO这里的情况更加复杂虽然你注册了回调函数但它很可能是个同步IO究竟怎么回事一起来看看。
我们知道要想从IO读取数据需要经历「内核数据准备好」和「数据从内核态拷贝到用户态」两个过程还是以read函数为例如果设置为阻塞模式相当于read函数等待了「内核数据准备好」和「数据从内核态拷贝到用户态」两个过程然后取到IO数据如果设置成非阻塞模式当内核数据没准备好会直接返回也就是不会等待第一个过程但是当数据准备好时会直接等待第二个过程完成后将结果数据返回。
所以无论是否阻塞我们都等待了第二个阶段等着它执行完成后获取结果所以这两种都是同步IO。
那作为IO多路复用里的“一哥”epoll也是同步IO吗是的那封装了select/poll/epoll的libevent可是用了Reactor模式支持事件回调它也是同步IO吗是的
真正的异步IO
有点惊呆了不是吗那究竟什么是异步IO呢还真有Windows 里实现了一套完整的支持 socket 的异步编程接口 IOCP而 Linux 是在 2019 年 5.1 版本 内核首次引入的高性能异步I/O 框架 io_uring我确实都没用过感兴趣的可以试一下
是否是异步IO就看「数据从内核态拷贝到用户态」这个过程需不需要等待如果需要逻辑层自己等待这个过程取数据就是同步IO如果这个过程都不用等调用回调函数时已经把内核态的数据拷贝出来并且通过回调将数据进行了回传这就是异步IO。
IO分类与示例
所以总结下来一共有这么几种同步阻塞IO同步非阻塞IO异步IO为啥不区分异步阻塞IO和异步非阻塞IO呢你在阻塞时搞个异步试试办不到吧所以异步只能与非阻塞搭配也就习惯只写异步IO了。
一顿理论讲下来可能还是比较抽象那我们再举个日常生活中的例子比如中午买饭的过程
同步阻塞IO就好像你去食堂吃面条但是你去这一锅面条还没煮好然后你就一直在那里等啊等等了一段时间终于做好了数据准备的过程但是你还得继续等工作人员把面条内核空间打到你的餐盘里用户空间才能找个桌子开始吃饭。
同步非阻塞IO就好像你又去食堂吃饭问大叔饭做好了没有告诉你没有你就离开了过了一会你又来饭堂问大叔饭做好了吗人家说说做好了于是你等着把饭打到你的餐盘里后面这个过程你是得等待的。
异步IO就好像你在十分焦急的写BUG这时到饭点肚子饿了给食堂大叔打电话等饭做好了麻烦给我送一份等到饭好了真的送来直接就能吃了一直在抓紧写BUG中间没有等待做梦中
我想大部分同学吃午饭都是第一种同步阻塞IO吧第二种同步非阻塞IO可能也有但是不是要重新排队啊如果是第三种异步IO的情况我只能说大哥/姐我跟你混了~~
总结
IO分为同步阻塞IO同步非阻塞IO异步IO三类异步IO有Windows平台的 IOCP 和 Linux 平台的 io_uring从IO读取数据需要经历「内核数据准备好」和「数据从内核态拷贝到用户态」两个过程分析阻塞和非阻塞看是否等待第一个过程分析同步与异步看是否等待第二个过程 反爬链接请勿点击原地爆炸概不负责 人生的岔路口不知是机会还是风险边走边看吧毕竟路还是在脚下空想也到不了终点~