[Nginx] 事件模型
Nginx事件模型
异步非阻塞
Nginx采取异步非阻塞的方式处理请求。
处理请求流程:收到请求,建立连接,接收数据,发送数据。
如果采用阻塞调用,会陷入内核等待,在单进程的nginx下这样cpu就会空闲,没法充分使用。
采用非阻塞调用,会在事件没有准备好时,返回EAGAIN来通知,此时线程还可以做其他事情,然后再回来查看事件是否准备完成。这种情况下的消耗也比较大。
异步非阻塞调用是一种机制,可以同时监控多个事件,调用他们是阻塞的,但是可以设置超时时间,在超时时间内,如果有事件处理好了,就返回。以epoll为例,当事件没有准备好时,放到epoll中,事件准备好了,就去处理它,只有当所有的事件都没准备好时,才会在epoll里面等待。这样就可以处理大量未完成的并发事件。
线程只有一个,所以同时能处理的请求只有一个,只是在请求间不断地切换而已,切换也是因为事件未准备好而主动让出,没有任何代价。