多线程可以使用计算机多核那,【多线程逻辑面试题】面试问题:异步操作的优缺… - 看准网...
我曾經提到異步操作能提高系統的吞吐能力,正確使用異步操作來校正濫用異步的錯誤做法,那異步究竟有何優點值得我們使用?而又有什么缺點需要我們使用的時候小心呢?誠如老趙所說, 異步并不一定能提高系統性能,甚至因為線程的創建,消亡,和切換會增加系統開銷,但異步除了提高性能,還可以增強系統的健壯性。在過去,windows程序總是單線程的,在這樣的系統中,如果出現了異常,系統就會 因此而崩潰,甚至連我們的操作系統也是單線程的,所以每次出現異常,我們的計算機用戶都要不厭其煩強制關機,然后重啟才能解決問題。加入多線程之后,當一個線程上的任務發生異常的時候,其他線程有能力不受影響,從此防止整個應用程序的崩潰。此外如果用戶是在一個UI中操作某項耗時的操作,如果不使用異步,那UI線程就會被阻塞,導致界面無法響應,用戶就會很無助,增加了異步,讓復雜的任務在另外的線程中完成,就會有比較好的用戶體驗。而且異步并不是說對性能提高沒有作用,CLR線程的創建,銷毀,和線程上下文切換的確會有很大的開銷,比如每創建一個線程,都必須申請
1MB的地址空間用于線程的用戶模式,申請12KB左右的德地址空間用于線程的內核模式, 而且還要求進程調用每個dll中的一個 固定的函數來通知所有的dll系統創建了一個新的線程,同樣在銷毀的時候,也要做類似的通知,上面這一切似乎都說明了異步操作對于性能的壞處,但事實并非完全如此,我們知道當前的處理器基本上都是雙核,或者支持hyper-thread,一個線程的執行總會占用
1 個cpu邏輯核,如果我們的計算機是 4核,8核,而我們不采用異步,那其實多核就沒什么太大優勢,因為總是 1個核在工作,而另外的核卻在休息,效率肯定低下,而此時用多線程,就可以充分使用計算機的處理器資源。同時對于一些有IO限制的操作而言,如讀取磁盤文件,網絡數據相關操作時,整個過程并不是完全靠運算,而是要通過磁盤驅動器或者網絡驅動器來協助完成,比如讀取磁盤中的一個文件,當應用程序的讀取線程發出讀請求的時候,該請求會被磁盤驅動器所排隊處理,假如它是個很長的操作,那么該操作會在磁盤驅動器上排隊或者執行很長時間,而這段時間讀線程就處于阻塞的狀態,這樣就浪費了線程資源,正確的做法應該是線程將讀請求發送到磁盤驅動器后馬上返回,繼續處理其他任務,而當磁盤驅器操作完成的時候,由磁盤驅動器來通知或者由一個線程來輪詢執行狀態。這樣就防止線程資源被浪費,從而提高系統性能。總結一下上面的說法,
優點:
1) 在 I/O受限等情況下,異步能提
2) 異步能增強系統健壯性
3) 異步能改善用戶體驗
同時也有缺點,如下
1) 濫用異步,會影響性能
2) 增加編程難度
總結對比各種異步操作的實現方式
實現異步,主要包含以下幾種方法
1) ?使用專用線程,方法為:
System.Threading.ThreadStart ts = new System.Threading.ThreadStart(void(object state)?target);
System.Threading.Thread th = new System.Threading.Thread(ts);
ts.Start();
調用 Start()方法之前,并沒有實質性得創建線程資源,而是 Start()后才進行創建,此種方式的好
處在于能設置線程是前臺線程還是后臺線程,并且能控制線程的掛起和消亡
2) ?使用線程池中的線程
線程是一種比較寶貴的資源,所以使用的時候就要加倍珍惜,線程池中線程在使用完成之后并不
是馬上銷毀, 而是回到池中等待下一次的使用, 這樣就可以較少線程創建的消耗。 使用方法如下:
ThreadPool.QueueUserWorkItem(WaitCallback callback)
需要注意的是此種方法使用的均為后臺線程
3) ?使用異步編程模型
這種方法是 MS推薦的使用方法,該模型普遍格式為:
BeginXXX(…IAsyCallBack callback,object asyState);
EndXXX(IAsyState ar);
這種模型的好處上面已經有所闡述
4) 使用 BackgroundWorker
.Net2.0 下提供了 BackgroundWorker,使用它可以輕易的完成異步操作,并且它還有一些功能
上的加強,比如取消操作、
總結
以上是生活随笔為你收集整理的多线程可以使用计算机多核那,【多线程逻辑面试题】面试问题:异步操作的优缺… - 看准网...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html5新知识点,Html5基本知识点
- 下一篇: 计算机与科学应用题,计算机应用题