为什么会有IO多路复用
BIO
同步阻塞式IO,以饭店举例,把客人当做一个请求。饭店当做服务端。
当有人点菜时,菜没上来,他就一直在收银台等,后面的人也不能点菜。
这样肯定不行,太慢了。
NIO
同步非阻塞式IO。
这时候,在优化一下,客人过来,点完菜,后厨生成单子,每次有客人来,他都要看所有的单子,即使那个单子已经完成了,没东西。
IO多路复用
第三中,就是客户点完菜,就去坐着,菜做完了,通知客人来取。
这只是我的理解,有不对的,还请纠正
实例
Redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,一次放到文件事件分派器,事件分派器将事件分发给事件处理器。
多路复用快的原因在于,操作系统提供了这样的系统调用,使得原来的 while 循环里多次系统调用,变成了一次系统调用 + 内核层遍历这些文件描述符。
epoll是现在最先进的IO多路复用器,Redis、Nginx,linux中的Java NIO都使用的是epoll。
这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。
在多路复用IO模型中,会有一个内核线程不断地去轮询多个 socket 的状态,只有当真正读写事件发送时,才真正调用实际的IO读写操作。因为在多路复用IO模型中,只需要使用一个线程就可以管理多个socket,系统不需要建立新的进程或者线程,也不必维护这些线程和进程,并且只有真正有读写事件进行时,才会使用IO资源,所以它大大减少来资源占用。