2015-11-05 136 views
0

我一直在大量阅读(和工作)multi-threaded applicationsIO,而且我发现术语asynchronous已成为某种含糊不清的想法的一部分。我想知道我是否理解正确。我看到的方式是“异步性”有两个主要分支。异步计算究竟是什么?

  1. 异步I/O。如网络读/写。这真正归结为多CPU之间高效的并行处理,如主CPU和NIC CPU。这个想法是让多个处理器并行运行,交换数据,不会阻塞等待另一个完成并返回它的工作结果。
  2. 通过最小化线程的使用来最小化上下文切换惩罚。这似乎是.NET框架关注的异步/等待功能。不要产生/关闭/阻塞线程,而是将并行作业分解为任务,并使用软件任务调度程序使线程池保持尽可能的繁忙状态,而不要求助于产生新线程。

这些看起来像是两个完全分离的概念,没有可能将它们绑定在一起的相似性,但都被同一个“异步计算”词汇引用。

我能正确理解这一切吗?

回答

1

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

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

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

0

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

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

.NET异步/等待只是使用已经是异步的OS api - 读/写文件,通过网络发送/接收数据,它们都是异步的 - 操作系统不会阻止它们(驱动程序本身是异步的)。

+0

”它会花费几秒钟的时间来创建消息,并且有更多的时间通过网络发送,然后创建下一条消息。“... 但是它真正等待的是NIC处理器发送一些表示网络进程完成的返回信号。与文件I/O相同,它等待磁盘控制器报告操作已完成。 因此,在低层次上,它仍然是关于多个处理器高效地协同工作。 –

+0

这只是一个语义问题 - 你如何描述.NET中Task_Delay(int)的异步操作?在低层只是来自柜台的信号,我想你不会认为它是“多个处理器一起工作”:) –

+0

这将解释我的第二个异步定义。 Task.Delay(int)和Thread.Sleep(int)之间的唯一区别是Delay()不会阻塞线程。该线程返回到池以安排不同的任务。总体目标是最小化运行的线程数量,从而最大限度地减少线程开销。如私人堆栈大小和上下文切换惩罚。这种高效的多处理器计算是非常不同的事情,这就是为什么它困扰我,他们被归入相同的“异步”保护伞下。 –

0

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

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

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