Asynchronous 异步或同步中的阻塞是什么?

Asynchronous 异步或同步中的阻塞是什么?,asynchronous,operating-system,synchronization,blocking,Asynchronous,Operating System,Synchronization,Blocking,我在学习操作系统时考虑异步/同步/阻塞/非阻塞。我读了很多文章,但这些文章只关注非阻塞或异步如何处理简单图片。但是我想知道在更大的范围内阻塞到底是什么,包括CPU、内存、操作系统、I/O设备等等 所以,这张照片是我的猜测 我认为阻塞意味着我的应用程序代码从1到5都不会被CPU处理。我说得对吗? 我对阻塞的理解是正确的?您的应用程序将在同步请求时停止(无论它正在做什么),并等待请求完成 赞成:在你的应用程序的下一行,你可以相信这个同步请求已经完成了它所做的一切 相反:你的应用程序只是坐着等待。它

我在学习操作系统时考虑异步/同步/阻塞/非阻塞。我读了很多文章,但这些文章只关注非阻塞或异步如何处理简单图片。但是我想知道在更大的范围内阻塞到底是什么,包括CPU、内存、操作系统、I/O设备等等

所以,这张照片是我的猜测

我认为阻塞意味着我的应用程序代码从1到5都不会被CPU处理。我说得对吗?
我对阻塞的理解是正确的?

您的应用程序将在同步请求时停止(无论它正在做什么),并等待请求完成

赞成:在你的应用程序的下一行,你可以相信这个同步请求已经完成了它所做的一切

相反:你的应用程序只是坐着等待。它被阻止了

你的应用程序将不会在异步请求时停止(无论它在做什么)

赞成:应用程序将继续工作。它未被阻止


相反:如果你需要知道请求何时完成以及结果是什么,你需要特别注意获得结果(使用回调、事件或承诺或技术框架中使用的任何技术)

你的应用程序将在同步请求时停止(无论它在做什么)然后等待请求完成

赞成:在你的应用程序的下一行,你可以相信这个同步请求已经完成了它所做的一切

相反:你的应用程序只是坐着等待。它被阻止了

你的应用程序将不会在异步请求时停止(无论它在做什么)

赞成:应用程序将继续工作。它未被阻止


相反:如果您需要知道请求何时完成以及结果是什么,那么您需要特别注意获得结果(使用回调、事件或承诺或技术框架中使用的任何技术)

答案并不简单,您可能需要查看javascript。因为您使用的是async,wait它并不意味着您的应用程序被阻塞,而是用于避免编写复杂的或承诺链。当您使用async和Wait时,javascript将根据需要将这些执行添加到事件循环中,以避免可能需要在下一次执行之前完成一次执行的执行

但同时,它将执行其他相互无关的执行,并等待一个执行完成(可能在HTTP响应到来时呈现网页)

因此,在大局中,您的应用程序将只使用一个CPU线程。所有其他非阻塞魔法都是由于事件循环的实现而产生的,它使应用程序无阻塞,但不是异步的(不管javascript进程是什么,它始终是一个同步进程)


如果您需要在nodejs或javascript上执行真正的异步执行。子流程和web工作人员可能会帮助您实现这一点

答案并不简单,您可能需要看看javascript。因为您使用的是async,wait它并不意味着您的应用程序被阻塞,而是用于避免编写复杂的或承诺链。当您使用async和Wait时,javascript将根据需要将这些执行添加到事件循环中,以避免可能需要在下一次执行之前完成一次执行的执行

但同时,它将执行其他相互无关的执行,并等待一个执行完成(可能在HTTP响应到来时呈现网页)

因此,在大局中,您的应用程序将只使用一个CPU线程。所有其他非阻塞魔法都是由于事件循环的实现而产生的,它使应用程序无阻塞,但不是异步的(不管javascript进程是什么,它始终是一个同步进程)


如果您需要在nodejs或javascript上执行真正的异步执行。子流程和web工作人员可能会帮助您实现这一点

了解这一点的最佳方法是查看具有同步和异步I/O系统服务的操作系统。Windoze和(最好的例子)VM就是这样的操作系统

在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相同的函数)进行下一次读取


使用此方法,一个程序可以处理数百个(系统参数允许的任意数量)网络连接。

了解这一点的最佳方法是查看具有同步和异步I/O系统服务的操作系统。Windoze和(最好的例子)VM就是这样的操作系统

在VMS操作系统中,SYS$QIO和SYS$QIOW执行I/O操作。这两个系统服务具有相同的参数。其中一个参数(选项A)