宅男在线永久免费观看网直播,亚洲欧洲日产国码无码久久99,野花社区在线观看视频,亚洲人交乣女bbw,一本一本久久a久久精品综合不卡

全部
常見問題
產(chǎn)品動態(tài)
精選推薦

什么是并發(fā)(非常詳細(xì))

管理 管理 編輯 刪除

按最簡單、最基本的程度理解,并發(fā)(concurrency)是兩個或多個同時獨立進行的活動。并發(fā)現(xiàn)象遍布日常生活,我們可以邊走路邊說話,左右手同時做出不一樣的動作,諸如此類。

計算機系統(tǒng)中的并發(fā)

若我們談及計算機系統(tǒng)中的并發(fā),則是指同一個系統(tǒng)中,多個獨立活動同時進行,而非依次進行。

多年來,多任務(wù)操作系統(tǒng)可以憑借任務(wù)切換,讓同一臺計算機同時運行多個應(yīng)用軟件,這早已稀松平常,而高端服務(wù)器配備了多處理器,實現(xiàn)了“真并發(fā)”(genuine concurrency)。

大勢所趨,主流計算機現(xiàn)已能夠真真正正地并行處理多任務(wù),而不再只是制造并發(fā)的表象。

很久之前,大多計算機都僅有一個處理器,處理器內(nèi)只有單一處理單元或單個內(nèi)核,許多臺式計算機至今依舊如此。這種計算機在同一時刻實質(zhì)上只能處理一個任務(wù),不過,每秒內(nèi),它可以在各個任務(wù)之間多次切換,先處理某任務(wù)的一小部分,接著切換任務(wù),同樣只處理一小部分,然后對其他任務(wù)如法炮制。

看起來所有任務(wù)都正在同時執(zhí)行,因此其被稱為任務(wù)切換。至此,我們談及的并發(fā)都基于這種模式。由于任務(wù)飛速切換,我們難以分辨處理器到底在哪一刻暫停某個任務(wù)而切換到另一個。任務(wù)切換對使用者和應(yīng)用軟件自身都制造出并發(fā)的表象。

由于是表象,因此對比真正的并發(fā)環(huán)境,當(dāng)應(yīng)用程序在進行任務(wù)切換的單一處理器環(huán)境下運行時,其行為可能稍微不同。具體而言,如果就內(nèi)存模型做出不當(dāng)假設(shè),本來會導(dǎo)致某些問題,但這些問題在上述環(huán)境中卻有可能不會出現(xiàn)。

多年來,配備了多處理器的計算機一直被用作服務(wù)器,它要承擔(dān)高性能的計算任務(wù);現(xiàn)今,基于一芯多核處理器(簡稱多核處理器)的計算機日漸普及,多核處理器也用在臺式計算機上。

無論是裝配多個處理器,還是單個多核處理器,或是多個多核處理器,這些計算機都能真正并行運作多個任務(wù),我們稱之為硬件并發(fā)(hardware concurrency)。

圖 1 所示為理想化的情景:

d9612202307181732401938.png

圖 1 兩種并發(fā)方式:雙核機上的并發(fā)執(zhí)行與單核機上的任務(wù)切換
計算機有兩個任務(wù)要處理,將它們進行十等分。在雙核機(具有兩個處理核)上,兩個任務(wù)在各自的核上分別執(zhí)行。另一臺單核機則切換任務(wù),交替執(zhí)行任務(wù)小段,但任務(wù)小段之間略有間隔。

圖 1 中,單核機的任務(wù)小段被灰色小條隔開,它們比雙核機的分隔條粗大。為了交替執(zhí)行,每當(dāng)系統(tǒng)從某一個任務(wù)切換到另一個時,就必須完成一次上下文切換(context switch),于是耗費了時間。若要完成一次上下文切換,則操作系統(tǒng)需保存當(dāng)前任務(wù)的 CPU 狀態(tài)和指令指針,判定需要切換到哪個任務(wù),并為之重新加載 CPU 狀態(tài)。接著,CPU 有可能需要將新任務(wù)的指令和數(shù)據(jù)從內(nèi)存加載到緩存,這或許會妨礙 CPU,令其無法執(zhí)行任何指令,加劇延遲。

盡管多處理器或多核系統(tǒng)明顯更適合硬件并發(fā),不過有些處理器也能在單核上執(zhí)行多線程。真正需要注意的關(guān)鍵因素是硬件支持的線程數(shù)(hardware threads),也就是硬件自身真正支持同時運行的獨立任務(wù)的數(shù)量。

即便是真正支持硬件并發(fā)的系統(tǒng),任務(wù)的數(shù)量往往容易超過硬件本身可以并行處理的數(shù)量,因而在這種情形下任務(wù)切換依然有用。譬如,常見的臺式計算機能夠同時運行數(shù)百個任務(wù),在后臺進行各種操作,表面上卻處于空閑狀態(tài)。正是由于任務(wù)切換,后臺任務(wù)才得以運作,才容許我們運行許多應(yīng)用軟件,如文字處理軟件、編譯器、編輯軟件,以及瀏覽器等。

cc5c9202307181733118725.png

圖 2 展示了雙核機上 4 個任務(wù)的相互切換,這同樣是理想化的情形,各個任務(wù)都被均勻切分。實踐中,許多問題會導(dǎo)致任務(wù)切分不均勻或調(diào)度不規(guī)則。

并發(fā)的方式

設(shè)想兩位開發(fā)者要共同開發(fā)一個軟件項目。假設(shè)他們處于兩間獨立的辦公室,而且各有一份參考手冊,則他們可以靜心工作,不會彼此干擾。但這令交流頗費周章:他們無法一轉(zhuǎn)身就與對方交談,遂不得不借助電話或郵件,或是需起身離座走到對方辦公室。另外,使用兩間辦公室有額外開支,還需購買多份參考手冊。

現(xiàn)在,如果安排兩位開發(fā)者共處一室,他們就能暢談軟件項目的設(shè)計,也便于在紙上或壁板上作圖,從而有助于交流設(shè)計的創(chuàng)意和理念。這樣,僅有一間辦公室要管理,并且各種資源通常只需一份就足夠了。但缺點是,他們恐怕難以集中精神,共享資源也可能出現(xiàn)問題。

這兩種安排開發(fā)者的辦法示意了并發(fā)的兩種基本方式:

  • 一位開發(fā)者代表一個線程,一間辦公室代表一個進程。第一種方式采用多個進程,各進程都只含單一線程,情況類似于每位開發(fā)者都有自己的辦公室;
  • 第二種方式只運行單一進程,內(nèi)含多個線程,正如兩位開發(fā)者同處一間辦公室。
    我們可以隨意組合這兩種方式,掌控多個進程,其中有些進程包含多線程,有些進程只包含單一線程,但基本原理相同。接著,我們來簡略看看應(yīng)用軟件中的這兩種并發(fā)方式。

多進程并發(fā)

在應(yīng)用軟件內(nèi)部,一種并發(fā)方式是,將一個應(yīng)用軟件拆分成多個獨立進程同時運行,它們都只含單一線程,非常類似于同時運行瀏覽器和文字處理軟件。這些獨立進程可以通過所有常規(guī)的進程間通信途徑相互傳遞信息(信號、套接字、文件、管道等),如圖 3 所示。

53ae3202307181733493493.png

這種進程間通信普遍存在短處:或設(shè)置復(fù)雜,或速度慢,甚至二者兼有,因為操作系統(tǒng)往往要在進程之間提供大量防護措施,以免某進程意外改動另一個進程的數(shù)據(jù);還有一個短處是運行多個進程的固定開銷大,進程的啟動花費時間,操作系統(tǒng)必須調(diào)配內(nèi)部資源來管控進程,等等。

進程間通信并非一無是處:通常,操作系統(tǒng)在進程間提供額外保護和高級通信機制。這就意味著,比起線程,采用進程更容易編寫出安全的并發(fā)代碼。某些編程環(huán)境以進程作為基本構(gòu)建單元,其并發(fā)效果確實一流,譬如為 Erlang 編程語言準(zhǔn)備的環(huán)境。

運用獨立的進程實現(xiàn)并發(fā),還有一個額外優(yōu)勢——通過網(wǎng)絡(luò)連接,獨立的進程能夠在不同的計算機上運行。這樣做雖然增加了通信開銷,可是只要系統(tǒng)設(shè)計精良,此法足以低廉而有效地增強并發(fā)力度,改進性能。

多線程并發(fā)

另一種并發(fā)方式是在單一進程內(nèi)運行多線程。線程非常像輕量級進程,每個線程都獨立運行,并能各自執(zhí)行不同的指令序列。

不過,同一進程內(nèi)的所有線程都共用相同的地址空間,且所有線程都能直接訪問大部分?jǐn)?shù)據(jù)。全局變量依然全局可見,指向?qū)ο蠡驍?shù)據(jù)的指針和引用能在線程間傳遞。

盡管進程間共享內(nèi)存通??尚?,但這種做法設(shè)置復(fù)雜,往往難以駕馭,原因是同一數(shù)據(jù)的地址在不同進程中不一定相同。圖 4 展示了單一進程內(nèi)的兩個線程借共享內(nèi)存通信。

086a220230718173412835.png

圖 4 單一進程內(nèi)的兩個線程借共享內(nèi)存通信
我們可以啟用多個單線程的進程并在進程間通信,也可以在單一進程內(nèi)發(fā)動多個線程而在線程間通信,后者的額外開銷更低。因此,即使共享內(nèi)存帶來隱患,主流語言大都青睞以多線程的方式實現(xiàn)并發(fā)功能。

提到多線程代碼,還常常用到一個詞——并行。接下來,我們來厘清并發(fā)與并行的區(qū)別。

并發(fā)與并行

就多線程代碼而言,并發(fā)與并行(parallel)的含義很大程度上相互重疊。確實,在多數(shù)人看來,它們就是相同的。

并發(fā)和并行的差別甚小,主要是著眼點和使用意圖不同。兩個術(shù)語都是指使用可調(diào)配的硬件資源同時運行多個任務(wù),但并行更強調(diào)性能。當(dāng)人們談及并行時,主要關(guān)心的是利用可調(diào)配的硬件資源提升大規(guī)模數(shù)據(jù)處理的性能;當(dāng)談及并發(fā)時,主要關(guān)心的是分離關(guān)注點或響應(yīng)能力。

為分離關(guān)注點而并發(fā)

一直以來,編寫軟件時,分離關(guān)注點(separation of concerns)幾乎總是不錯的構(gòu)思:歸類相關(guān)代碼,隔離無關(guān)代碼,使程序更易于理解和測試,因此所含缺陷很可能更少。

并發(fā)技術(shù)可以用于隔離不同領(lǐng)域的操作,即便這些不同領(lǐng)域的操作需同時進行;若不直接使用并發(fā)技術(shù),我們將不得不編寫框架做任務(wù)切換,或者不得不在某個操作步驟中,頻繁調(diào)用無關(guān)領(lǐng)域的代碼。

考慮一個帶有用戶界面的應(yīng)用軟件,需要由 CPU 密集處理,如臺式計算機上的 DVD 播放軟件。本質(zhì)上,這個應(yīng)用軟件肩負(fù)兩大職責(zé):既要從碟片讀取數(shù)據(jù),解碼聲音影像,并將其及時傳送給圖形硬件和音效硬件,讓 DVD 順暢放映,又要接收用戶的操作輸入,譬如用戶按“暫?!?、“返回選項單”、“退出”等鍵。假若采取單一線程,則該應(yīng)用軟件在播放過程中,不得不定時檢查用戶輸入,結(jié)果會混雜播放 DVD 的代碼與用戶界面的代碼。

改用多線程就可以分離上述兩個關(guān)注點,一個線程只負(fù)責(zé)用戶界面管理,另一個線程只負(fù)責(zé)播放 DVD,用戶界面的代碼和播放 DVD 的代碼遂可避免緊密糾纏。兩個線程之間還會保留必要的交互,例如按“暫停”鍵,不過這些交互僅僅與需要立即處理的事件直接關(guān)聯(lián)。

如果用戶發(fā)送了操作請求,而播放 DVD 線程正忙,無法馬上處理,那么在請求被傳送到該線程的同時,代碼通常能令用戶界面線程立刻做出響應(yīng),即便只是顯示光標(biāo)或提示“請稍候”。這種方法使得應(yīng)用軟件看起來響應(yīng)及時。類似地,某些必須在后臺持續(xù)工作的任務(wù),則常常交由獨立線程負(fù)責(zé)運行,例如,讓桌面搜索應(yīng)用軟件監(jiān)控文件系統(tǒng)變動。此法基本能大幅簡化各線程的內(nèi)部邏輯,原因是線程間交互得以限定于代碼中可明確辨識的切入點,而無須將不同任務(wù)的邏輯交錯散置。

這樣,線程的實際數(shù)量便與 CPU 既有的內(nèi)核數(shù)量無關(guān),因為用線程分離關(guān)注點的依據(jù)是設(shè)計理念,不以增加運算吞吐量為目的。

為性能而并行:任務(wù)并行和數(shù)據(jù)并行

多處理器系統(tǒng)已存在數(shù)十年,不過一直以來它們大都只見于巨型計算機、大型計算機和大型服務(wù)器系統(tǒng)。但是,芯片廠家日益傾向設(shè)計多核芯片,在單一芯片上集成 2 個、4 個、16 個或更多處理器,從而使其性能優(yōu)于單核芯片。于是,多核臺式計算機日漸流行,甚至多核嵌入式設(shè)備亦然。

不斷增強的算力并非得益于單個任務(wù)的加速運行,而是來自多任務(wù)并行運作。從前,處理器更新?lián)Q代,程序自然而然隨之加速,程序員可以“坐享其成,不勞而獲”。但現(xiàn)在,正如 Herb Sutter 指出的“免費午餐沒有了!”,軟件若要利用增強的這部分算力,就必須設(shè)計成并發(fā)運行任務(wù)。所以程序員必須警覺,特別是那些躊躇不前、忽視并發(fā)技術(shù)的同業(yè),有必要注意熟練掌握并發(fā)技術(shù),儲備技能。

增強性能的并行方式有兩種,分別是任務(wù)并行和數(shù)據(jù)并行。

第一種,最直觀地,將單一任務(wù)分解成多個部分,各自并行運作,從而節(jié)省總運行耗時。此方式即為任務(wù)并行。盡管聽起來淺白、直接,但這卻有可能涉及相當(dāng)復(fù)雜的處理過程,因為任務(wù)各部分之間也許存在紛繁的依賴。任務(wù)分解可以針對處理過程,調(diào)度某線程運行同一算法的某部分,另一線程則運行其他部分;也可以針對數(shù)據(jù),線程分別對數(shù)據(jù)的不同部分執(zhí)行同樣的操作,這被稱為數(shù)據(jù)并行。

易于采用上述并行方式的算法常常被稱為尷尬并行算法。其含義是,將算法的代碼并行化實在簡單,甚至簡單得會讓我們尷尬,實際上這是好事。我還遇見過用其他術(shù)語描述這類算法,叫“天然并行”(naturally parallel)與“方便并發(fā)”(conveniently concurrent)。尷尬并行算法具備的優(yōu)良特性是可按規(guī)模伸縮——只要硬件支持的線程數(shù)目增加,算法的并行程度就能相應(yīng)提升。這種算法是成語“眾擎易舉”的完美體現(xiàn)。算法中除尷尬并行以外的部分,可以另外劃分成一類,其并行任務(wù)的數(shù)目固定(所以不可按規(guī)模伸縮)。

第二種增強性能的并行方式是利用并行資源解決規(guī)模更大的問題。

例如,只要條件適合,便同時處理 2 個文件,或者 10 個,甚至 20 個,而不是每次 1 個。同時對多組數(shù)據(jù)執(zhí)行一樣的操作,實際上是采用了數(shù)據(jù)并行,其著眼點有別于任務(wù)并行。采用這種方式處理單一數(shù)據(jù)所需的時間依舊不變,而同等時間內(nèi)能處理的數(shù)據(jù)相對更多。這種方式明顯存在局限,雖然并非任何情形都會因此受益,但數(shù)據(jù)吞吐量卻有所增加,進而帶來突破。例如,若能并行處理視頻影像中不同的區(qū)域,就會提升視頻處理的解析度。

請登錄后查看

CRMEB-慕白寒窗雪 最后編輯于2023-07-18 17:34:57

快捷回復(fù)
回復(fù)
回復(fù)
回復(fù)({{post_count}}) {{!is_user ? '我的回復(fù)' :'全部回復(fù)'}}
排序 默認(rèn)正序 回復(fù)倒序 點贊倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level || item.bbs_level }}

作者 管理員 企業(yè)

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推薦': '推薦'}}
{{item.is_suggest == 1? '取消推薦': '推薦'}}
沙發(fā) 板凳 地板 {{item.floor}}#
{{item.user_info.title || '暫無簡介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
打賞
已打賞¥{{item.reward_price}}
{{item.like_count}}
{{item.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回復(fù) {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
打賞
已打賞¥{{itemc.reward_price}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)
查看更多
打賞
已打賞¥{{reward_price}}
2804
{{like_count}}
{{collect_count}}
添加回復(fù) ({{post_count}})

相關(guān)推薦

快速安全登錄

使用微信掃碼登錄
{{item.label}} 加精
{{item.label}} {{item.label}} 板塊推薦 常見問題 產(chǎn)品動態(tài) 精選推薦 首頁頭條 首頁動態(tài) 首頁推薦
取 消 確 定
回復(fù)
回復(fù)
問題:
問題自動獲取的帖子內(nèi)容,不準(zhǔn)確時需要手動修改. [獲取答案]
答案:
提交
bug 需求 取 消 確 定
打賞金額
當(dāng)前余額:¥{{rewardUserInfo.reward_price}}
{{item.price}}元
請輸入 0.1-{{reward_max_price}} 范圍內(nèi)的數(shù)值
打賞成功
¥{{price}}
完成 確認(rèn)打賞

微信登錄/注冊

切換手機號登錄

{{ bind_phone ? '綁定手機' : '手機登錄'}}

{{codeText}}
切換微信登錄/注冊
暫不綁定
CRMEB客服

CRMEB咨詢熱線 咨詢熱線

400-8888-794

微信掃碼咨詢

CRMEB開源商城下載 源碼下載 CRMEB幫助文檔 幫助文檔
返回頂部 返回頂部
CRMEB客服