梳理下我自已对Reactor与及IO多路复用的select\poll\epoll的理解

Reactor是一种设计思想的落地,其中IO多路复用的具体落地:select\poll\epoll。都是基于Reactor的延伸。它的核心是Reactor与资源处理器。Reactor负责监听与事件的分发,事件包括连接事件、读事件、写事件。

具体的流程是系统调用监听请求,判断请求是连接、读或写。它是非阻塞同步的,这里的非阻塞同步是指,监听请求这个过程非阻塞,

怎么个非阻塞法?

通过IO多路复用,用select 或poll或epoll。

如果是阻塞IO,假定我分配了一个线程来处理100个请求,IO阻塞在第一个请求入口直到请求过来且跑完才切换。如果是非阻塞IO,IO会让系统调用轮询1-100请求入口,哪个请求连接了就处理那个

非阻塞同步的意思就是通过Reactor的IO多路复用(select或poll或epoll)实现非阻塞监听,然后监听到连接后,将数据从用户态搬运到内核态则是同步,业务处理完将数据从内核移到用户也是同步

而Proactor则可以既是非阻塞监听也可以异步搬运数据,但linux不支持,windlows倒是支持了。

至于select。你可以把它看作一个while循环,循环内看有没连接连上,poll则是基于select的一些优化仍然可以看作是while循环。epoll则是异步回调。

所以总的来说,Reactor先是通过IO多路复用,非阻塞地监听到是否有请求连接过来了,再分发到资源处理器负责处理具体的(连接、读、写)事件。在资源处理器中请求数据由用户态同步到内核或内核同步到用户。

一些网上总结:

Redis是单Reactor单进程的

memcache与netty都是多Reactor与多线程

nginx是多Reactor多进程

你可能感兴趣的:(sql,数据库)