Redis的IO多路復用
同一個線程內,多個描述符的IO操作,能夠並發交替地順序執行。
epoll只提供三個函數:
int epoll_create(int size); #創建epoll句柄
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
關聯被監聽的事件和epool句柄(可以通過op參數來增加,刪除和修改關聯關系)
第一個參數epfd,為epoll_create()的返回值,
第二個參數op,表示關聯關系:EPOLL_CTL_ADD(增)EPOLL_CTL_MOD(改)EPOLL_CTL_DEL(刪)
第三個參數fd,
第四個參數event,告訴內核需要監聽的具體事件:EPOLLIN(可讀)EPOLLOUT(可寫)EPOLLPRI(緊急可讀)EPOLLERR(錯誤)EPOLLHUP(掛斷)EPOLLET(觸發模式ET或LT)EPOLLONESHOT(只監聽一次)
此處可以設置,事件對應的回調函數。
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
如果沒有epoll_ctl中監聽的事件產生,就會阻塞在這裏,一直等到監聽事件產生,或者等到超時。
如果有epoll_ctl中監聽的事件,就執行具體的事件處理回調函數。
epoll保證了每個fd在整個過程中只會拷貝一次,從內核空間到用戶空間。
二、redis的IO多路復用
redis利用epoll來實現IO多路復用,將連接信息和事件放到隊列中,依次放到文件事件分派器,事件分派器將事件分發給事件處理器。
事件處理器對不同的事件,進行處理。
main –> aeMain –> while { aeProcessEvents –> aeApiPoll –> epoll_wait }
Redis的IO多路復用