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