轉(zhuǎn)載自http://blog.csdn.net/woliuyunyicai/article/details/45165869
1挫剑、并發(fā)和并行的區(qū)別
可由上圖形象指出兩者的區(qū)別:
1)定義:
并發(fā):在操作系統(tǒng)中或悲,是指一個(gè)時(shí)間段中有幾個(gè)程序都處于已啟動(dòng)運(yùn)行到運(yùn)行完畢之間,且這幾個(gè)程序都是在同一個(gè)處理機(jī)上運(yùn)行怪与,但任一個(gè)時(shí)刻點(diǎn)上只有一個(gè)程序在處理機(jī)上運(yùn)行夺刑。
并行:在操作系統(tǒng)中,一組程序按獨(dú)立異步的速度執(zhí)行,無(wú)論從微觀還是宏觀遍愿,程序都是一起執(zhí)行的存淫。
來(lái)個(gè)比喻:并發(fā)和并行的區(qū)別就是一個(gè)人同時(shí)吃三個(gè)饅頭和三個(gè)人同時(shí)吃三個(gè)饅頭;
在單CPU系統(tǒng)中沼填,系統(tǒng)調(diào)度在某一時(shí)刻只能讓一個(gè)線程運(yùn)行纫雁,雖然這種調(diào)試機(jī)制有多種形式(大多數(shù)是時(shí)間片輪巡為主),但無(wú)論如何倾哺,要通過(guò)不斷切換需要運(yùn)行的線程讓其運(yùn)行的方式就叫并發(fā)(concurrent)轧邪。而在多CPU系統(tǒng)中,可以讓兩個(gè)以上的線程同時(shí)運(yùn)行羞海,這種可以同時(shí)讓兩個(gè)以上線程同時(shí)運(yùn)行的方式叫做并行(parallel)忌愚。
2)并發(fā)通常指提高運(yùn)行在單處理器上的程序的性能;
并發(fā)是有狀態(tài)的却邓,“具有可論證的確定性硕糊,但是實(shí)際上具有不可確定性”;
"并發(fā)"在微觀上不是同時(shí)執(zhí)行的腊徙,只是把時(shí)間分成若干段简十,使多個(gè)進(jìn)程快速交替的執(zhí)行,從宏觀外來(lái)看撬腾,好像是這些進(jìn)程都在執(zhí)行螟蝙。
使用多個(gè)線程可以幫助我們?cè)趩蝹€(gè)處理系統(tǒng)中實(shí)現(xiàn)更高的吞吐量,如果一個(gè)程序是單線程的民傻,這個(gè)處理器在等待一個(gè)同步I/O操作完成的時(shí)候胰默,他仍然是空閑的。在多線程系統(tǒng)中漓踢,當(dāng)一個(gè)線程等待I/O的同時(shí)牵署,其他的線程也可以執(zhí)行。
二喧半、異步與多線程
1)基本概念
1. 并發(fā):在操作系統(tǒng)中奴迅,是指一個(gè)時(shí)間段中有幾個(gè)程序都處于已啟動(dòng)運(yùn)行到運(yùn)行完畢之間,且這幾個(gè)程序都是在同一個(gè)處理機(jī)上運(yùn)行挺据。其中兩種并發(fā)關(guān)系分別是同步和互斥
2. 互斥:進(jìn)程間相互排斥的使用臨界資源的現(xiàn)象取具,就叫互斥。
? ? 3. 同步:進(jìn)程之間的關(guān)系不是相互排斥臨界資源的關(guān)系吴菠,而是相互依賴的關(guān)系者填。進(jìn)一步的說(shuō)明:就是前一個(gè)進(jìn)程的輸出作為后一個(gè)進(jìn)程的輸入,當(dāng)?shù)谝粋€(gè)進(jìn)程沒(méi)有輸出時(shí)第二個(gè)進(jìn)程必須等待做葵。具有同步關(guān)系的一組并發(fā)進(jìn)程相互發(fā)送的信息稱為消息或事件占哟。
其中并發(fā)又有偽并發(fā)和真并發(fā),偽并發(fā)是指單核處理器的并發(fā),真并發(fā)是指多核處理器的并發(fā)榨乎。
? ? 4. 并行:在單處理器中多道程序設(shè)計(jì)系統(tǒng)中怎燥,進(jìn)程被交替執(zhí)行,表現(xiàn)出一種并發(fā)的外部特種蜜暑;在多處理器系統(tǒng)中铐姚,進(jìn)程不僅可以交替執(zhí)行,而且可以重疊執(zhí)行肛捍。在多處理器上的程序才可實(shí)現(xiàn)并行處理隐绵。從而可知,并行是針對(duì)多處理器而言的拙毫。并行是同時(shí)發(fā)生的多個(gè)并發(fā)事件依许,具有并發(fā)的含義,但并發(fā)不一定并行缀蹄,也亦是說(shuō)并發(fā)事件之間不一定要同一時(shí)刻發(fā)生峭跳。
? ? 5. 多線程:多線程是程序設(shè)計(jì)的邏輯層概念,它是進(jìn)程中并發(fā)運(yùn)行的一段代碼缺前。多線程可以實(shí)現(xiàn)線程間的切換執(zhí)行蛀醉。
? ? 6. 異步:異步和同步是相對(duì)的,同步就是順序執(zhí)行衅码,執(zhí)行完一個(gè)再執(zhí)行下一個(gè)拯刁,需要等待、協(xié)調(diào)運(yùn)行肆良。異步就是彼此獨(dú)立,在等待某事件的過(guò)程中繼續(xù)做自己的事筛璧,不需要等待這一事件完成后再工作逸绎。線程就是實(shí)現(xiàn)異步的一個(gè)方式惹恃。異步是讓調(diào)用方法的主線程不需要同步等待另一線程的完成,從而可以讓主線程干其它的事情棺牧。
異步和多線程并不是一個(gè)同等關(guān)系,異步是最終目的,多線程只是我們實(shí)現(xiàn)異步的一種手段巫糙。異步是當(dāng)一個(gè)調(diào)用請(qǐng)求發(fā)送給被調(diào)用者,而調(diào)用者不用等待其結(jié)果的返回而可以做其它的事情。實(shí)現(xiàn)異步可以采用多線程技術(shù)或則交給另外的進(jìn)程來(lái)處理颊乘。
? ??異步和同步的區(qū)別参淹,??在io等待的時(shí)候,同步不會(huì)切走乏悄,浪費(fèi)了時(shí)間浙值。
? ??多線程的好處,比較容易的實(shí)現(xiàn)了 異步切換的思想檩小, 因?yàn)楫惒降某绦蚝茈y寫的开呐。多線程本身程還是以同步完成,但是應(yīng)該說(shuō)比效率是比不上異步的。 而且多線很容易寫筐付, 相對(duì)效率也高卵惦。
2)深層次理解
多線程和異步操作的異同
多線程和異步操作兩者都可以達(dá)到避免調(diào)用線程阻塞的目的,從而提高軟件的可響應(yīng)性瓦戚。甚至有些時(shí)候我們就認(rèn)為多線程和異步操作是等同的概念沮尿。但是,多線程和異步操作還是有一些區(qū)別的较解。而這些區(qū)別造成了使用多線程和異步操作的時(shí)機(jī)的區(qū)別畜疾。
異步操作的本質(zhì)
所有的程序最終都會(huì)由計(jì)算機(jī)硬件來(lái)執(zhí)行,所以為了更好的理解異步操作的本質(zhì)印衔,我們有必要了解一下它的硬件基礎(chǔ)庸疾。 熟悉電腦硬件的朋友肯定對(duì)DMA這個(gè)詞不陌生,硬盤当编、光驅(qū)的技術(shù)規(guī)格中都有明確DMA的模式指標(biāo)届慈,其實(shí)網(wǎng)卡、聲卡忿偷、顯卡也是有DMA功能的金顿。DMA就是直接內(nèi)存訪問(wèn)的意思,也就是說(shuō)鲤桥,擁有DMA功能的硬件在和內(nèi)存進(jìn)行數(shù)據(jù)交換的時(shí)候可以不消耗CPU資源揍拆。只要CPU在發(fā)起數(shù)據(jù)傳輸時(shí)發(fā)送一個(gè)指令,硬件就開始自己和內(nèi)存交換數(shù)據(jù)茶凳,在傳輸完成之后硬件會(huì)觸發(fā)一個(gè)中斷來(lái)通知操作完成嫂拴。這些無(wú)須消耗CPU時(shí)間的I/O操作正是異步操作的硬件基礎(chǔ)。所以即使在DOS這樣的單進(jìn)程(而且無(wú)線程概念)系統(tǒng)中也同樣可以發(fā)起異步的DMA操作贮喧。
線程的本質(zhì)
線程不是一個(gè)計(jì)算機(jī)硬件的功能筒狠,而是
操作系統(tǒng)提供的一種邏輯功能,線程本質(zhì)上是進(jìn)程中一段并發(fā)運(yùn)行的代碼箱沦,所以線程需要操作系統(tǒng)投入CPU資源來(lái)運(yùn)行和調(diào)度辩恼。
異步操作的優(yōu)缺點(diǎn)
因?yàn)楫惒讲僮鳠o(wú)須額外的線程負(fù)擔(dān)疮跑,并且使用回調(diào)的方式進(jìn)行處理融蹂,在設(shè)計(jì)良好的情況下,處理函數(shù)可以不必使用共享變量(即使無(wú)法完全不用肚逸,最起碼可以減少共享變量的數(shù)量)寒跳,減少了死鎖的可能聘萨。當(dāng)然異步操作也并非完美無(wú)暇。編寫異步操作的復(fù)雜程度較高童太,程序主要使用回調(diào)方式進(jìn)行處理米辐,與普通人的思維方式有些初入碾牌,而且難以調(diào)試。
多線程的優(yōu)缺點(diǎn)
多線程的優(yōu)點(diǎn)很明顯儡循,線程中的處理程序依然是順序執(zhí)行舶吗,符合普通人的思維習(xí)慣,所以編程簡(jiǎn)單择膝。但是多線程的缺點(diǎn)也同樣明顯誓琼,線程的使用(濫用)會(huì)給系統(tǒng)帶來(lái)
上下文切換的額外負(fù)擔(dān)。并且線程間的共享變量可能造成死鎖的出現(xiàn)肴捉。
適用范圍
在了解了線程與異步操作各自的優(yōu)缺點(diǎn)之后腹侣,我們可以來(lái)探討一下線程和異步的合理用途。我認(rèn)為:當(dāng)需要執(zhí)行I/O操作時(shí)齿穗,使用異步操作比使用線程+同步I/O操作更合適傲隶。I/O操作不僅包括了直接的文件、網(wǎng)絡(luò)的讀寫窃页,還包括數(shù)據(jù)庫(kù)操作跺株、Web Service、HttpRequest以及.Net Remoting等跨進(jìn)程的調(diào)用脖卖。
而線程的適用范圍則是那種需要長(zhǎng)時(shí)間CPU運(yùn)算的場(chǎng)合乒省,例如耗時(shí)較長(zhǎng)的圖形處理和算法執(zhí)行。但是往往由于使用線程編程的簡(jiǎn)單和符合習(xí)慣畦木,所以很多朋友往往會(huì)使用線程來(lái)執(zhí)行耗時(shí)較長(zhǎng)的I/O操作袖扛。這樣在只有少數(shù)幾個(gè)并發(fā)操作的時(shí)候還無(wú)傷大雅,如果需要處理大量的并發(fā)操作時(shí)就不合適了十籍。