Redis中的I/O 多路复用(I/O Multiplexing)

I/O 指的是网络I/O。

多路指的是多个TCP 连接(Socket 或Channel)。

复用指的是复用一个或多个线程。

它的基本原理就是不再由应用程序自己监视连接,而是由内核替应用程序监视文件描述符。

客户端在操作的时候,会产生具有不同事件类型的socket。在服务端,I/O 多路复用程序(I/O Multiplexing Module)会把消息放入队列中,然后通过文件事件分派器(File event Dispatcher),转发到不同的事件处理器中。

多路复用有很多的实现,以select 为例,当用户进程调用了多路复用器,进程会被阻塞。内核会监视多路复用器负责的所有socket,当任何一个socket 的数据准备好了,多路复用器就会返回。这时候用户进程再调用read 操作,把数据从内核缓冲区拷贝到用户空间。

所以,I/O 多路复用的特点是通过一种机制一个进程能同时等待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入读就绪(readable)状态,select()函数就可以返回。

Redis 的多路复用, 提供了select, epoll, evport, kqueue 几种选择,在编译的时候来选择一种。源码ae.c

#ifdef HAVE_EVPORT
#include "ae_evport.c"
#else
#ifdef HAVE_EPOLL
#include "ae_epoll.c"
#else
#ifdef HAVE_KQUEUE
#include "ae_kqueue.c"
#else
#include "ae_select.c"
#endif
#endif
#endif

evport 是Solaris 系统内核提供支持的;

epoll 是LINUX 系统内核提供支持的;

kqueue 是Mac 系统提供支持的;

select 是POSIX 提供的,一般的操作系统都有支撑(保底方案);

源码ae_epoll.c、ae_select.c、ae_kqueue.c、ae_evport.c

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值