Redis IO多路复用之select、poll和epoll

Redis 性能好除了它是基于内存的数据库外,还因为Redis 是基于IO多路复用机制。以下总结一下曾经遇到过的一个面试题:你了解IO多路复用机制吗?实现IO多路复用机制的方式有哪些?有什么区别?

是的,我了解Redis的IO多路复用机制。Redis使用IO多路复用来实现高效的异步非阻塞IO操作,提高系统的并发性能。Redis 的 IO 多路复用程序的所有功能都是通过包装常见的 select、poll、evport 和 kqueue 这些 IO 多路复用函数库来实现的。

共同点:select、poll和epoll都是用于实现 I/O 多路复用的方式,可以在同一时间内监听多个文件描述符的就绪状态。

不同点

(1)select 是一种比较老的方式,本质其实就是维护了一个文件描述符(fd)数组,以此为基础,实现IO多路复用的功能。这个fd数组有长度限制,在32位系统中,最大值为1024个,而在64位系统中,最大值为2048个。当select方法被调用,首先需要将fd_set从用户空间拷贝到内核空间,然后进行后续的处理

  • 需用户态和内核态的切换频繁复制,性能差;

  • 单个线程fd数量有限,在32位系统中,最大值为1024个,而在64位系统中,最大值为2048个;

  • 基于轮询来实现,效率低;

(2)poll本质上和select没有区别,依然需要进行

你可能感兴趣的:(Java面试题,redis,java,数据库)