什么是异步计算?

时间:2015-11-05 07:33:13

标签: multithreading asynchronous

我一直在阅读(和工作)大量multi-threaded applicationsIO,并且我发现asynchronous这个词已成为多种含糊不清的想法。我想知道我是否理解正确。我认为它的方式是有两个主要分支" asynchronicity"。

  1. 异步I / O.如网络读/写。这真正归结为多个CPU之间的高效并行处理,例如主CPU和NIC CPU。我们的想法是让多个处理器并行运行,交换数据,而不会阻止另一个处理器完成并返回它的工作结果。
  2. 通过最小化线程使用来最小化上下文切换惩罚。这似乎是.NET框架所关注的async / await功能。而不是产生/关闭/阻塞线程,将并行作业分解为任务,并使用软件任务调度程序使线程池尽可能繁忙,而不依赖于生成新线程。
  3. 这些似乎是两个完全独立的概念,没有相似之处可以将它们联系在一起,但它们都被相同的"异步计算"词汇。

    我能正确理解所有这些吗?

3 个答案:

答案 0 :(得分:1)

异步基本上意味着不阻塞,即不必等待操作完成。

线程只是实现这一目标的一种方式。从硬件级别,SO级别,软件级别来看,有很多方法可以做到这一点。

比我更有经验的人可以提供与线程无关的异步性示例。

答案 1 :(得分:0)

  

这真正归结为多个CPU之间的高效并行处理,例如主CPU和NIC CPU。我们的想法是让多个处理器并行运行......

异步编程并不是关于多核CPU和并行性的:考虑单核CPU,只有一个线程创建电子邮件并发送它们。以同步方式,它将花费几微秒来创建消息,并且花费更多时间通过网络发送消息,然后只创建下一条消息。但是在异步程序中,线程可以创建新消息,而前一个消息通过网络发送。这种程序的一个实现可以是使用.NET async / await功能,您可以只使用一个线程。但即使是阻塞IO程序也可以被认为是异步的:如果主线程创建消息并将它们排队到缓冲区中,另一个线程将其从中拉出并以阻塞IO方式发送它们。从主线程的角度来看 - 它完全是异步的。

.NET async / await只使用已经异步的操作系统api - 读取/写入文件,通过网络发送/接收数据,无论如何它们都是异步的 - 操作系统不阻塞它们(驱动程序本身是异步)。

答案 2 :(得分:0)

异步是一个通用术语,没有广泛接受的含义。不同的域名具有不同的含义。

例如,异步IO意味着不会阻止IO调用,而是发生其他。其他东西可能是真正不同的东西,但它通常涉及呼叫完成的某种通知。细节可能不同。例如,通知可能内置于调用本身 - 例如在MS Completeion Ports中(如果内存服务)。或者,在您拨打电话之前可以进行验证,以便呼叫无法阻止 - 这就是poll()和朋友所做的事情。

异步也可能意味着简单的并行执行。例如,有人可能会说'数据库是异步更新的',这意味着有一个处理数据库连接的专用线程,该线程不会减慢主处理线程的速度。

相关问题