关于io估计点击到这里的或多或少对bio,nio,aio, 阻塞,非阻塞,同步异步已经有了初步的了解,但是还是很迷茫, 到底这几个名词有什么区别和联系?
我直接抛出结论吧:
1: IBM的技术网站上有个家伙写了篇文章将IO分为 四个象限, 同步阻塞,同步非阻塞, 异步阻塞,异步非阻塞, 这篇文章是错的,不要觉得IBM就一定正确
2:csdn和知乎上很多高分回答,99%也是错的, 在知乎上 https://www.zhihu.com/question/19732473 地下的评论和举例子也挺多, 大部分也是也是错的
陈硕的回答是正确的,我copy过来,不过他并没有做详细的解释:
在处理 IO 的时候,阻塞和非阻塞都是同步 IO。只有使用了特殊的 API 才是异步 IO。

正确的划分是,从两个步骤看问题,一次IO请求经历两个阶段:
1: 用户态发起请求到内核态 ,内核返回结果
2: 内核将IO内容返回给用户态程序
如果在用户态程序发起请求一直到用户态获取到数据都需要等待,那么这种IO模型就是同步模型, 这里来看,BIO一定是同步模型,nio只是在第一步没有等待
但是在发现内核告诉他有数据产生了,然后用户态程序自己🈶发起一次调用,也就是关键的第二部中还是需要等待, 因此nio也是同步模型
所以select, poll epull是同步非阻塞模型, nio是同步阻塞模型, 只有aio是真正的异步模型, 没有异步阻塞或者异步非阻塞模型这一说.
接下来说, select模型是因为有1024的最大并发限制,尽管可以修改,但是限于操作系统限制,也不会太大,
pull模型是在select的基础上,去掉了最大连接数限制,
epull是在pull模型上,轮训fid(就是网络连接socket)的时候,只处理发生了IO事件的fid, 提升了响应效率
具体的这方面倒是网文挺多,后边可以详细补充下