Redis中的I/O 多路复用(I/O Multiplexing)
I/O 指的是網(wǎng)絡(luò)I/O。
多路指的是多個(gè)TCP 連接(Socket 或Channel)。
復(fù)用指的是復(fù)用一個(gè)或多個(gè)線程。
它的基本原理就是不再由應(yīng)用程序自己監(jiān)視連接,而是由內(nèi)核替應(yīng)用程序監(jiān)視文件描述符。
客戶端在操作的時(shí)候,會(huì)產(chǎn)生具有不同事件類型的socket。在服務(wù)端,I/O 多路復(fù)用程序(I/O Multiplexing Module)會(huì)把消息放入隊(duì)列中,然后通過(guò)文件事件分派器(File event Dispatcher),轉(zhuǎn)發(fā)到不同的事件處理器中。
多路復(fù)用有很多的實(shí)現(xiàn),以select 為例,當(dāng)用戶進(jìn)程調(diào)用了多路復(fù)用器,進(jìn)程會(huì)被阻塞。內(nèi)核會(huì)監(jiān)視多路復(fù)用器負(fù)責(zé)的所有socket,當(dāng)任何一個(gè)socket 的數(shù)據(jù)準(zhǔn)備好了,多路復(fù)用器就會(huì)返回。這時(shí)候用戶進(jìn)程再調(diào)用read 操作,把數(shù)據(jù)從內(nèi)核緩沖區(qū)拷貝到用戶空間。
所以,I/O 多路復(fù)用的特點(diǎn)是通過(guò)一種機(jī)制一個(gè)進(jìn)程能同時(shí)等待多個(gè)文件描述符,而這些文件描述符(套接字描述符)其中的任意一個(gè)進(jìn)入讀就緒(readable)狀態(tài),select()函數(shù)就可以返回。
Redis 的多路復(fù)用, 提供了select, epoll, evport, kqueue 幾種選擇,在編譯的時(shí)候來(lái)選擇一種。源碼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 #endifevport 是Solaris 系統(tǒng)內(nèi)核提供支持的;
epoll 是LINUX 系統(tǒng)內(nèi)核提供支持的;
kqueue 是Mac 系統(tǒng)提供支持的;
select 是POSIX 提供的,一般的操作系統(tǒng)都有支撐(保底方案);
源碼ae_epoll.c、ae_select.c、ae_kqueue.c、ae_evport.c
?
總結(jié)
以上是生活随笔為你收集整理的Redis中的I/O 多路复用(I/O Multiplexing)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 传统I/O 数据拷贝
- 下一篇: Redis中的过期策略