一、同步、异步、阻塞与非阻塞概念
同步、异步:针对客户端。
同步:客户端请求后等待返回。应用程序执行一个系统调用,在系统调用没有完成,应用程序会一直阻塞。、
异步:客户端请求发出后,不用等待返回结果,执行下一步动作,当系统调用返回时,通过状态、通知来通知调用者,或通过回调函数处理这个调用。
阻塞、非阻塞:针对服务器。
阻塞调用:是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。
非阻塞调用:指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
二、组合而成的概念
1》同步阻塞
用户空间的应用程序执行一个系统调用,这会导致应用程序阻塞。这意味着应用程序会一直阻塞,直到系统调用完成为止(数据传输完成或发生错误)。调用应用程序处于一种不再消费
CPU 而只是简单等待响应的状态,因此从处理的角度来看,这是非常有效的。
2》同步非阻塞
非阻塞的实现是
I/O 命令可能并不会立即满足,需要应用程序调用许多次来等待操作完成。这可能效率不高,因为在很多情况下,当内核执行这个命令时,应用程序必须要进行忙碌等待,直到数据可用为止,或者试图执行其他工作。
3》异步非阻塞
在一个进程中为了执行多个 I/O 请求而对计算操作和 I/O 处理进行重叠处理的能力利用了处理速度与 I/O 速度之间的差异。当一个或多个 I/O 请求挂起时,CPU 可以执行其他任务;或者更为常见的是,在发起其他 I/O 的同时对已经完成的 I/O 进行操作。
4》异步阻塞
另外一个阻塞解决方案是带有阻塞通知的非阻塞 I/O。在这种模型中,配置的是非阻塞 I/O,然后使用阻塞 select
系统调用来确定一个
I/O 描述符何时有操作。使 select
调用非常有趣的是它可以用来为多个描述符提供通知,而不仅仅为一个描述符提供通知。对于每个提示符来说,我们可以请求这个描述符可以写数据、有读数据可用以及是否发生错误的通知。