redis-I/O多路复用的理解(最新I/O理解在最后)

前言

I/O 事件发生,是指与redis相关的的socket文件发生了读/写操作。这些是内核cpu做的事情,应用需要监听哪些socket发生了变化,从而完成自己的工作。这个时候就需要I/O多路复用机制来保证效率问题。redis使用了Reactor模式开发了自己的网络时间处理器。称为:文件时间处理器。

I/O多路复用(同一个线程/进程同时处理多个连接 *认真读这句话* ):

实现方式1:
当有I/O事件发生时,循环逐个处理各个连接,每个连接对应一个socket。其中,当应用读取某个socket的文件数据不ready的时候,整个应用阻塞,等待该文件句柄ready。无法往下处理。

实现方式2:select方法
跟上相比,在读取文件句柄前,先查看它的状态。如果ready了,就进行处理。具体方式:用一个fd_set结构体来告诉内核同时监控多个文件句柄。当其中有文件句柄的状态发生指定变化(例如某句柄由不可用变成可用)或超时,则调用返回。之后,应用可以使用FD_ISSET来逐个查看,确定那个文件句柄发生了变化。这样的问题就是受限于文件句柄数量的上限。同时,因为只有一个字段记录关注和发生事件,所以每次调用之前,要重新初始化fd_set结构体。

实现方式3:poll方法
跟上相比,没有本质区别。主要解决了两个问题:
1 通过一个pollfd数组,向内核传递需要关注的事件,以消除文件句柄上限。原因是因为它是通过链表来存储的。
2 使用不同字段分别标注“关注事件和发生事件”,来避免重复初始化。

方式4:epoll方式
event poll。epoll实际上是事件驱动(每个事件上都关联了对应的fd),epoll会把那个流发生了什么样的I/O事件通知我们,此时我们对这些流的操作都是有意义的(复杂度降低到了O(1)).

新理解

https://www.jianshu.com/p/eaa8d3ac623c

你可能感兴趣的:(redis-I/O多路复用的理解(最新I/O理解在最后))