BIO 同步阻塞
同步阻塞,同步指的是请求端是否参与数据的获取,自己进行IO操作,
同步与阻塞并不等同
比如说自旋锁,他并不阻塞,但是他是同步的,他持续的死循环不断轮询来达到同步的这一目的。
NIO 同步非阻塞
这里涉及到一个Select模型
你的客户端发送一个请求给服务端,同时也会将你的连接句柄注册到Select模型上,该模型会不断的轮询里面的所有句柄,如果有response了就会通知客户端自己来遍历Select模型然后获得Response。
而服务端处理完请求,会将response发回给Select模型。
这里就不是简单的一问一答的模式,而是你问了之后,你可以继续做其他的事情,等到Select模型不断轮询发现有你的消息了之后你来遍历取走你的response。
但是同时还有另一种epoll模型,因为Select模型弊端很明显:他只知道Response发生了,但是是哪个Connection他不知道,你必须自己过来遍历所有的句柄然后取走你的Response。Epoll模型则不然,他知道这个Response是给哪个句柄的,通知客户端直接来该句柄领取他的Response即可,而不需要再次遍历。
还有个Poll模型,其实和Select模型没什么大的区别,就只不过是改用链表来存储Connection了而已。
这里同样还是请求端自己来获取数据的,但是同时他又是非阻塞的,因为他是让服务端来通知才去取数据的。
AIO 异步非阻塞
对于NIO来说,我们的业务线程是在IO操作准备好时,得到通知,接着就由这个线程自行进行IO操作,IO操作本身还是同步的。
但是对于AIO来说,则更加的进了一步,它不是在IO准备好时再通知线程,而是在IO操作已经完成后,再给线程发出通知。因此,AIO是完全不会阻塞的。此时,我们的业务逻辑将变成一个回调函数,等待IO操作完成后,由系统自动触发。
这是性能最高的,因为等你接受到通知的时候,你的IO操作是已经完成了,而不是你自己去执行IO操作,所以这是个异步的操作方式。