redis_io多路复用

Redis利用epoll实现io多路复用,将连接信息和事件放入队列,一次放到文件事件派发器,事件派发器将事件分发给事件处理器。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

io多路复用机制:监视多个描述符fd,一旦某个描述符就绪,可以通知程序进行响应的读写操作。这种机制需要select,poll,epoll。多个连接公用一个阻塞对象,应用程序只需要在一个阻塞对象上等待,不需要全部的阻塞连接。当某条连接有新的数据可以处理的时候,操作系统通知应用程序。

Redis采用基于Reator的方式实现的文件事件处理器。
Redis基于Reactor模型开发了网络事件处理器,这个处理器被称为文件事件处理器,由4部分构成
1.多个套接字socket
2.io复用程序epoll
3.文件事件分派器
4.事件处理器
因为文件事件分派器为单线程的,所以Redis为单线程模型。

在这里插入图片描述

redis为网络IO,多个客户端连接(连接为socket,channel),复用一个或多个线程
一个服务器 进程可以同时处理多个套接字连接。套接字就是客户端的意思

在这里插入图片描述

同步/异步/阻塞/非阻塞

同步和异步重点在被调用者,服务提供者,重点在于获得调用结果的消息通知方法上

阻塞和非阻塞在于调用者,服务请求者,重点在于等消息的行为,是否可以干别的事情

BIO

阻塞IO
来一个给一个线程

方案:
1.利用线程池,不过客户端多的话不好
2.改为NIO

NIO

非阻塞IO

NIO类似CAS
BIO类似Synchronized

如果客户端多的话,那么要循环全部的socket,去系统调用
大部分的socket无数据,不得不去遍历
nio底层还是调用的是用户态和内核态的切换read读取方式,成本大

IO multiplexing

IO多路复用

由于NIO的缺点:
1.量大的时候需要遍历所有的socket,会阻塞,消耗大
2.底层是用户态和内核态切换的read读取方式,成本大

io多路复用将上面的缺点放入到内核进行处理

1.内核态不会阻塞
2.完成遍历后直接返回给用户态,不涉及用户态和内核态的切换

只有有可读状态的socket,才进行内核态和用户态切换的read操作

在这里插入图片描述
可以提高吞吐量

select

1.bitmap最大为1024,所以最多有1024个客户端

2.&rset不可以重复使用,每次socket有数据就相应的位会被置位

3.文件描述符数组拷贝到内核态,但是内核态可优化为异步事件通知,仍然有开销,select函数的调用需要传入fd数组,需要拷贝一份到内核,高并发情况下还是消耗巨大。可以优化为不复制

4.select函数没有通知用户态哪一个socket有数据,还是需要全部遍历

poll

1.解决了select的量的问题

2.&rset可以重复使用

epoll

3步调用

epoll_create

epoll_ctl

epoll_wait:解决第三个问题.不拷贝

可以解决后面的两个问题

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43141726/article/details/120615450