2013-02-16 56 views
1

我相信我對使用Thread類和Runnable接口的面向對象的角度的線程有一個合理的理解。在我的一個應用程序中,有一個「下載」按鈕,允許用戶在後臺運行需要大約半小時的任務,同時繼續使用VB.NET應用程序。VB.NET多線程和系統架構

但是,我不明白線程如何映射到計算機的物理體系結構。如果您有一個單線程應用程序,可以在帶有四核處理器的PC上運行,那麼.net程序會使用全部四個處理器?

如果在一個quadcore處理器上有一個多線程應用程序(比如四個線程),那麼每個線程是否在不同的內核上執行?

作爲開發人員,您有任何控制權嗎?

我已經參考了一本書,我在大學讀到了一本名爲Operating System Concepts的書,但是我還沒有找到具體的答案。

+0

「下載按鈕」表示您的程序是I/O綁定的,而不是計算綁定的,只有運行速度與某些服務器可以提供數據的速度一樣快。從任務管理器很容易知道,如果你的程序在一個內核上不能燒100%的週期,那麼添加線程並不會讓它更快。 – 2013-02-17 18:36:22

回答

1

如果您有一個單線程應用程序,可以在帶有四核處理器的PC上運行,那麼.net程序會使用全部四個處理器嗎?

不,它不能,至少不能同時。然而,理論上operating system’s scheduler首先在一個處理器上執行線程,然後再將其移至另一個處理器。這樣的調度程序對於允許同時運行更多的應用程序/線程比存在物理處理器是必需的:線程的執行被切成小塊,一個接一個地被饋送到處理器。每個線程都會獲得一些時間片分配,在此期間CPU可以在使用CPU切換到另一個線程之前進行計算。

作爲開發人員,您有任何控制權嗎?

不直接。你的可以控制是你的線程的優先級,使它更重要的任務調度。

在更一般的筆記,你應該使用線程在您的使用情況 - 至少沒有直接。線程實際上是非常低級的基元。對於您的特定用例,有一個名爲BackgroundWorker的組件,它抽象了許多線程管理的低級細節。

如果在一個quadcore處理器上有一個多線程應用程序(如四個線程),那麼每個線程是否在不同的內核上執行?

不一定;再次,應用程序幾乎無法控制其線程的執行方式;然而操作系統卻非常難以「巧妙地」安排線程。這意味着在實踐中,如果您的應用程序有多個繁忙線程,則它們會盡可能均勻分佈在可用內核中。特別是,如果沒有比核心更多的線程,那麼每個線程都有自己的核心。

+0

謝謝,最後一段+1。這就是我所做的。我經常會遇到線程和異步編程混淆。你能解釋線程和異步處理之間的區別嗎? – w0051977 2013-02-16 18:49:21

+0

你能回答原帖的第三段中的問題嗎?那麼我應該能夠將這個問題標記爲答案。 – w0051977 2013-02-17 16:20:59

+0

@ w0051977哦,我完全錯過了那部分。我的編輯是否回答此問題? – 2013-02-17 16:37:14

0

通常,您不需要擔心映射到物理體系結構,.NET和操作系統將盡最大努力最大限度地提高應用程序的效率。即使以單線程計算機的速度較慢爲代價,也可以使其成爲多線程。但是,您可以限制線程的最大數量(如果您的應用程序理論上可以擴展到無限大),也可以限制爲多個內核,或者加倍。測試每個案例的表現,並決定哪個最適合您。

有時,設置一個核心#會讓你的應用程序的性能更差。例如,如果核心#1當前正在掃描您的電腦中的病毒,並且您的防病毒軟件是單線程的。在上述情況下,假設使用四核PC,則不需要以每核心爲單位運行4線程應用程序。

說了這麼多,如果你真的想運行在特定的核心線程,它是可能的 - 看到這一點:

還檢查了這一點: