为什么mysql没有io多路复用_Redis的IO多路复用

本文探讨了Linux的IO复用函数epoll,并详细解释了epoll_create、epoll_ctl和epoll_wait的工作原理。此外,文章阐述了Redis如何利用epoll实现IO多路复用,描述了连接信息和事件处理流程,强调了其在效率上的优势。
摘要由CSDN通过智能技术生成

一、linux的IO复用函数

4517d81b1f55d65f59c2467ca02c4336.png

同一个线程内,多个描述符的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,是需要监听的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多路复用

887c4e9222b47908a6a7795d8965875d.png

redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放到文件事件分派器,事件分派器将事件分发给事件处理器。

事件处理器对不同的事件,进行处理。

main –> aeMain –> while { aeProcessEvents –> aeApiPoll –> epoll_wait }

237b0e84d727874474d09f16e9a38469.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值