我在学习OS时正在考虑异步/同步/阻止/非阻止。我读了许多文章,但这些文章只关注非阻塞或异步如何处理简单图片。但是我想知道在总体上,包括CPU,内存,操作系统,I / O设备等的真正阻塞是什么。
所以,这张照片是我的猜测。
我认为阻止意味着CPU从 1到5 不会处理My App的代码。我对吗? 我对阻塞的理解是正确的吗?
答案 0 :(得分:2)
答案并不简单,您可能必须查看javascript event loop。因为您正在使用异步,所以等待并不意味着您的应用程序被阻止,它们被用来避免编写复杂的callback hell或Promise链。当您使用异步并等待时,JavaScript会根据需要将这些执行添加到事件循环中,以避免可能需要在下一个执行之前完成一个执行的执行。
但是与此同时,它将执行其他彼此不相关的执行,并等待一个执行完成(也许在HTTP响应进入时渲染网页)。
因此,从总体上看,您的应用程序将仅使用一个CPU线程。所有其他非阻塞式魔术都由于事件循环的实现而发生,这使您的应用程序成为非阻塞式,但不是异步的(无论什么javascript进程始终是同步进程)。
如果您需要在nodejs或javascript上进行真正的异步执行。子进程和网络工作者可以帮助您实现这一目标。
答案 1 :(得分:1)
了解这一点的最佳方法是查看具有同步和异步I / O系统服务的操作系统。诸如此类的操作系统就是Windoze和(最佳示例)VMS。
在VMS操作系统中,SYS $ QIO和SYS $ QIOW执行I / O操作。这两个系统服务具有相同的参数。这些参数之一(可选)是I / O操作完成时要调用的例程的地址(称为AST),另一个参数(选项)是传递给该例程的参数。
如果您的应用程序调用SYS $ QIO,则该函数将在I / O操作排队后立即返回,并且该应用程序可以继续执行其他处理。应用程序必须依靠回调例程来知道何时完成I / O。
如果您的应用程序调用SYS $ QIOW,则该函数将等待(挂起进程),直到I / O操作完成。
当在SYS $ QIO下可以使用这种非阻塞I / O时,您的应用程序可以设置异步操作循环。假设您的应用程序要处理任意数量的网络连接,这些数据可以随时传入。对于每个连接,您调用SYS $ QIO来读取连接。您的进程不会等待,因此可以对任意数量的连接执行此操作。当数据输入时,将调用AST函数,因此您再次调用SYS $ QIO(与AST具有相同的功能)以进行下一次读取。
使用此方法,单个程序可以处理数百个(系统参数允许的任何数量)网络连接。
答案 2 :(得分:0)
您的应用程序将在同步请求(无论它在做什么)中停止,并等待该请求完成。
PRO:在您应用的下一行中,您可以依靠此同步请求完成所有操作
CONTRA:您的应用程序只需要等待即可。它被阻止。
您的应用将不会在异步请求(无论它在做什么)中停止。
PRO:应用程序将继续运行。它是未阻止
CONTRA:如果您需要知道请求何时完成以及其结果是什么,则需要格外小心才能获得结果(使用回调,事件或诺言或技术框架中使用的任何技术)