我一直在阅读(和工作)大量的multi-threaded applications和IO,我发现asynchronous这个术语已经成为许多模糊想法的一部分。我想知道我是否正确地理解了它。在我看来,“异步性”有两个主要分支。
这些似乎是两个完全独立的概念,没有任何相似之处可以将它们联系在一起,但它们都被同一个“异步计算”词汇表所引用。
我对这一切的理解正确吗?
发布于 2015-11-05 07:39:27
异步基本上意味着不阻塞,即不必等待操作完成。
线程只是实现这一目标的一种方法。有很多方法可以做到这一点,从硬件层面,所以层,软件层面。
比我更有经验的人可以给出与线程无关的异步性示例。
发布于 2015-11-05 09:00:37
这可以归结为多个CPU之间高效的并行处理,比如主CPU和NIC CPU。想法是让多个处理器并行运行..。
异步编程并不完全是关于多核CPU和并行性的:考虑一下单个核心CPU,只有一个线程创建并发送电子邮件消息。以同步的方式,它将花费几微秒来创建消息,并花费更多的时间通过网络发送消息,然后才创建下一条消息。但是在异步程序中,当前一条消息通过网络发送时,线程可以创建一个新消息。这类程序的一个实现可以是使用.NET异步/等待特性,其中您可以只有一个线程。但是,即使是阻塞IO程序也可以被认为是异步的:如果主线程创建消息并在缓冲区中排队,则另一个线程从哪个线程中提取消息并以阻塞IO的方式发送它们。从主线程的角度来看,它是完全异步的。
.NET异步/等待只是使用已经异步读取/writing文件的OS,通过网络发送/receive数据,它们都是异步的-操作系统不会阻止它们(驱动程序本身是异步的)。
发布于 2015-11-05 14:17:07
异步是一个通用的术语,它没有被广泛接受的含义。不同的领域对它有不同的含义。
例如,异步IO意味着不是阻止IO调用,而是发生其他事情。其他的东西可以是完全不同的东西,但它通常涉及某种类型的调用完成通知。细节可能有所不同。例如,可能会将通知内置到调用本身中--就像MS完全端口(如果内存可用的话)一样。或者,在你打电话之前,可以先确认一下,这样电话就不会阻塞--这就是poll()和朋友们所做的。
异步也可能意味着简单的并行执行。例如,人们可能会说‘数据库是异步更新’,这意味着有一个专门的线程来处理数据库连接,并且该线程不会减缓主处理线程的速度。
https://stackoverflow.com/questions/33538892
复制相似问题