Redis单线程模型

yql

网络编程模型

  1. 阻塞IO
  2. 非阻塞IO

IO复用到底用的啥?

  • 以前多个客户端都需要一个线程去调用recvfrom阻塞等待内核数据返回,那么多个客户端就需要多个线程,现在每个客户端都用一个线程使用select去统一管理,所以复用了这个线程

  • IO多路复用主要的是复用的是系统调用。从原先非阻塞情况下,多个client需要各自多次发送recvfrom系统调用去询问内核数据是否准备就绪,转变成了现在通过一次系统调用select/poll由内核主动通知用户哪些client数据已就绪,大大减少了无效的系统调用次数

Select 和 Poll的区别:

优点:

  • 充分利用了一次系统调用select/poll就可以实现管理多个client的事件(read、write、accept)等。大大降低了之前非阻塞IO频繁的系统调用。核心思路是将主动询问转变为等待内核的通知,提升了性能。

缺点:

  • 每次select/poll都需要将注册管理的多个client从用户态拷贝到内核态。在管理百万连接时,由拷贝带来的资源开销较大,影响性能

epoll 内核实现

Thread-based 的架构模型

服务端为每个客户端连接分配一个线程去处理客户端请求

适用场景:并发量不大的场景

Single-Reactor单线程模型

一个epoll对象称为一个Reactor

Single-Reactor线程池模型

Multi-Reactor多线程模型

main Reactor负责客户端的接受与连接,再按照一定的负载均衡策略,交给subReactor去处理

Comments