我一直在大量阅读(和工作)multi-threaded applications
和IO
,而且我发现术语asynchronous
已成为某种含糊不清的想法的一部分。我想知道我是否理解正确。我看到的方式是“异步性”有两个主要分支。异步计算究竟是什么?
- 异步I/O。如网络读/写。这真正归结为多CPU之间高效的并行处理,如主CPU和NIC CPU。这个想法是让多个处理器并行运行,交换数据,不会阻塞等待另一个完成并返回它的工作结果。
- 通过最小化线程的使用来最小化上下文切换惩罚。这似乎是.NET框架关注的异步/等待功能。不要产生/关闭/阻塞线程,而是将并行作业分解为任务,并使用软件任务调度程序使线程池保持尽可能的繁忙状态,而不要求助于产生新线程。
这些看起来像是两个完全分离的概念,没有可能将它们绑定在一起的相似性,但都被同一个“异步计算”词汇引用。
我能正确理解这一切吗?
”它会花费几秒钟的时间来创建消息,并且有更多的时间通过网络发送,然后创建下一条消息。“... 但是它真正等待的是NIC处理器发送一些表示网络进程完成的返回信号。与文件I/O相同,它等待磁盘控制器报告操作已完成。 因此,在低层次上,它仍然是关于多个处理器高效地协同工作。 –
这只是一个语义问题 - 你如何描述.NET中Task_Delay(int)的异步操作?在低层只是来自柜台的信号,我想你不会认为它是“多个处理器一起工作”:) –
这将解释我的第二个异步定义。 Task.Delay(int)和Thread.Sleep(int)之间的唯一区别是Delay()不会阻塞线程。该线程返回到池以安排不同的任务。总体目标是最小化运行的线程数量,从而最大限度地减少线程开销。如私人堆栈大小和上下文切换惩罚。这种高效的多处理器计算是非常不同的事情,这就是为什么它困扰我,他们被归入相同的“异步”保护伞下。 –