我终于搞清楚,bio 、 nio、aio的区别到底在哪!

83 阅读1分钟

首先我们举一个访问redis获取数据的例子:

客户端 发送一个 get a 命令大致需要的流程是

1 建立 连接 也就是 accept

2 读取 命令内容 get a

3 回写给客户端 get a 的结果

accept 是一个必须要阻塞的点(先记住)

而后面两个操作 是io操作,也就是需要操作系统去准备数据,并且操作系统准备数据是需要时间的。

这段时间 在bio中 线程就要傻傻的等待着,也就是会阻塞着的。这样整个流程会很慢,因为后面还有其他的连接事件、io事件等。nio就在这个时候诞生了,操作系统内核有三个函数 分别是 select 、poll、epoll。拿select举例,就是在等待io操作的时候,操作系统会告诉线程,数据有没有准备好,如果没有准备好,你可以先忙其他的事,这个时候线程就不用傻傻的等待了,他可以去处理下一个redis连接,然后 等处理好连接,下一次会再过来询问操作系统 有没有准备好数据呀?没有我下次再来,有的话,那我就拿着数据返回给客户端了。这样就可以整个流程的时间了。关键点就在于 bio节省了 等待数据准备的时间,拿这部分时间干别的事了。

而 aio就更牛了,直接说你也别来看了,来这跑也挺麻烦的,数据准备好了,我直接通知你。这样我连问都不用问,时间就进一步缩短了。