NoteDeep

同步与异步

同步与异步的理解

同步与异步的重点在消息通知的方式上,也就是调用结果通知的方式。 同步:当一个同步调用发出去后,调用者要一直等待调用结果的通知后,才能进行后续的执行。 异步:当一个异步调用发出去后,调用者不能立即得到调用结果的返回。 异步调用,要想获得结果,一般有两种方式: 1、主动轮询异步调用的结果; 2、被调用方通过callback来通知调用方调用结果。

阻塞和非阻塞

阻塞与非阻塞的理解

阻塞与非阻塞的重点在于进/线程等待消息时候的行为,也就是在等待消息的时候,当前进/线程是挂起状态,还是非挂起状态。 - 塞调用在发出去后,在消息返回之前,当前进/线程会被挂起,直到有消息返回,当前进/线程才会被激活 - 非阻塞调用在发出去后,不会阻塞当前进/线程,而会立即返回。

epoll()

epoll能更高效的检查大量fd,UNIX中提供了类似功能的kqueue调用。 epoll可以理解为event poll,不同于忙轮询和无差别轮询,当连接有I/O流事件产生的时候,epoll就会去告诉进程哪个连接有I/O流事件产生,然后进程就去处理这个事件。此时我们对这些流的操作都是有意义的。(复杂度降低到了O(k),k为产生I/O事件的流的个数,也有认为O(1)的)

在一个Web服务中,延迟最多的就是等待网络传输。nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。而基本的网络事件,则是放在worker进程中来处理了。在一个请求需要等待的时候,worker可以空闲出来处理其他的请求,少数几个worker进程就能够处理大量的并发。
举例来说:同样的4个进程,如果采用一个进程负责一个request的方式;那么,同时进来4个request之后,每个进程就负责其中一个,直至会话关闭。期间,如果有第5个request进来了。就无法及时反应了,因为4个进程都没干完活呢,因此,一般有个调度进程,每当新进来了一个request,就新开个进程来处理。
nginx不这样,每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方。比如向后端服务器转发request,并等待请求返回。那么,这个处理的worker不会这么傻等着,他会在发送完请求后,注册一个事件:“如果upstream返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有request 进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。

评论列表

    同步与异步阻塞和非阻塞