什么是异步或同步阻止?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是异步或同步阻止?相关的知识,希望对你有一定的参考价值。

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

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

enter image description here

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

答案

答案并不简单,你可能要看看javascript event loop。因为您正在使用异步,等待它并不意味着您的应用程序被阻止,它们用于避免编写复杂的callback hell或promise链。当您使用异步并等待时,javascript会根据需要将这些执行添加到事件循环中,以避免执行可能需要在下一个执行之前完成一次执行。

但与此同时它将执行其他执行,这些执行彼此无关并等待一个完成(可能在HTTP响应进入时呈现网页)。

所以从大图来看,你的应用只会使用一个CPU线程。所有其他非阻塞魔法都是由于事件循环的实现而发生的,这会使您的应用程序无阻塞,但不是异步(无论javascript进程始终是一个同步进程)。

如果你需要在nodejs或javascript上进行真正的异步执行。子进程和Web工作者可以帮助您实现这一目标。

另一答案

了解这一点的最佳方法是查看具有同步和异步I / O系统服务的操作系统。 Windows的底层和(最好的例子)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相同的函数)来进行下一次读取。

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

另一答案

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

专业版:在您应用的下一行,您可以信赖此同步请求已执行的任何操作

CONTRA:您的应用程序只是坐着等待。它被封锁了。

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

专业:应用程序将继续工作。它没有被阻止

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

以上是关于什么是异步或同步阻止?的主要内容,如果未能解决你的问题,请参考以下文章

PURE Javascript 是同步的还是异步的?

循环阻止异步请求被发送。为什么以及如何解决?

如何知道是啥阻止了 NodeJS 关闭

AJAX中的同步加载与异步加载

tf.train.MonitoredTrainingSession 中的 tf.train.CheckpointSaverHook 是不是会在检查点或异步完成时阻止训练?

页面优化——js异步载入