2015-11-05 156 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()和朋友所做的。

異步也可能意味着簡單的並行執行。例如,有人可能會說'數據庫異步更新',這意味着有一個專用的線程處理數據庫連接,並且該線程不會減慢主處理線程。 「