一 IO多路复用
1.1 IO多路复用*
1.1.1 IO多路复用
I/O: 网络I/O;
多路:多个客户端端连接(连接就是套接字描述符,即socket或channel),指的是多条TCP连接。
复用:用一个进程来处理多条的连接,使用单进程就能够实现同时处理多个客户端的连接。
Redis利用epoll函数来实现IO多路复用,将连接信息和事件放到队列中,依次放到文件事件分派器,事件分派器将事件分给事件处理器。
在多路复用IO模型中,会有一个内核线程不断地去轮询多个 socket 的状态,只有当真正读写事件发送时,才真正调用实际的IO读写操作。因为在多路复用IO模型中,只需要使用一个线程就可以管理多个socket,系统不需要建立新的进程或者线程,也不必维护这些线程和进程,并且只有真正有读写事件进行时,才会使用IO资源,所以它大大减少来资源占用。
如下图:
1.1.2 IO多路复用流程(了解)
Redis服务采用Reactor的方式实现文件事件处理器。
所谓I/O多路复用机制,就是通过一种机制,可以监视多个描述符,一旦某个描述符就绪,能够通知程序进行相应的读写操作。这种机制的使用需要select、poll、epoll函数来配合。多个连接共同用一个阻塞对象,应用程序只需要在一个阻塞对象上等待,无需要阻塞等待所有连接,当某条连接有新的数据可以处理时,操作系统通知应用程序、线程,从阻塞状态返回,开始进行业务处理。
如下图:
1.2 同步&异步和阻塞&非阻塞
1.2.1 同步&异步
同步:调用者要一直等待调用结果的通知后,才能进行后续的执行;
异步:被调用方先返回应答,让调用者先回去,然后再计算调用结果,计算完成最终结果后再通知并返回给调用方。