了解redis必须要了解的epoll
作为单线程的redis,为什么这么快,主要原因还是对epoll函数的利用。所以,有必要先了解什么是epoll。
为什么redis官网也只提供linux版本的,没有提供windows版本?就是因为只有部分linux系统中有epoll函数。windows版本都是各论坛大神自己改的redis,官网不提供,因为没有了epoll就失去了“快”这个特性!
了解epoll那么就要了解BIO、NIO、(AIO)。
BIO/ Block IO/ 阻塞IO
在socket编程中,服务端需要先新建socket对象,依次调用bind、listen、accept,最后调用recv接收数据。recv是个阻塞方法,当程序运行到recv时,它会一直等待,直到接收到数据才往下执行。
服务端伪代码
//创建socket
int s = socket(AF_INET, SOCK_STREAM, 0);
//绑定
bind(s, ...)
//监听
listen(s, ...)
//接受客户端连接
int c = accept(s, ...)
//接收客户端数据
recv(c, ...);
//将数据打印出来
printf(...)
问题在于recv时,进程会阻塞。
以操作系统视角来看,该socket进程,会被内核从运行队列中,移动到等待队列中,此时等待队列中的进程不消耗cpu性能。当接收到了recv数据时,操作系统再将该socket进程从等待队列中移动到运行队列中,即唤醒了该进程。
此时出现问题:
1.每一个进程都只有一个socket,一个进程只能处理一个socket,若有其他socket连接&