并發(fā)編程

拋磚引玉睬隶,同大家一起交流汗洒;可能會(huì)從兩個(gè)大方向上來(lái)開(kāi)始:一是來(lái)看看為什么并發(fā)編程難,包括涉及的一些基礎(chǔ)硬件和操作系統(tǒng)相關(guān)的一點(diǎn)知識(shí)晚缩;二是一起來(lái)分析一下常同的并發(fā)模型,我們?cè)趺赐ㄒ粋€(gè)簡(jiǎn)單高效的并發(fā)模型來(lái)寫出簡(jiǎn)單的并發(fā)實(shí)現(xiàn)(如線程與鎖/actor/csp/)媳危;

并發(fā)與并行

并發(fā):是邏輯上發(fā)生的同時(shí)荞彼;如一個(gè)處理器同時(shí)處理多個(gè)任務(wù),CPU時(shí)間片發(fā)生切換

并行:是物理上發(fā)生的同時(shí)待笑;是多核處理器同時(shí)處理多個(gè)任務(wù)鸣皂;

系統(tǒng)硬件體系架構(gòu)

這里做一個(gè)假設(shè),如果CPU1在對(duì)一個(gè)變量執(zhí)行一個(gè)CAS的操作,而該變量的緩存行是在CPU7的高速緩存里面签夭,那么可能的執(zhí)行順序可能是:

CPU1檢查本地高速緩存齐邦,沒(méi)有找到緩存行椎侠;

請(qǐng)求轉(zhuǎn)發(fā)到CPU0與CPU1的互聯(lián)模塊第租,檢查CPU0的本地高速緩存,沒(méi)有找到緩存行我纪;

請(qǐng)求轉(zhuǎn)發(fā)到系統(tǒng)互聯(lián)模塊慎宾,檢查其它三個(gè)芯片,得知緩存行被CPU6與CPU7所在的芯片持有浅悉;

請(qǐng)求被轉(zhuǎn)發(fā)到CPU6和CPU7的互聯(lián)模塊趟据,檢查這兩個(gè)CPU的高速緩存,在CPU7的高速緩存中找到緩存行术健;

CPU6將緩存行發(fā)送給所屬的互聯(lián)模塊汹碱,并刷新自己高速緩存中的緩存行;

CPU6和CPU7的互聯(lián)模塊將緩存行發(fā)送給系統(tǒng)互聯(lián)模塊荞估;

系統(tǒng)互聯(lián)模塊將緩存行發(fā)送給CPU0和CPU1的互聯(lián)模塊咳促;

CPU0和CPU1的互聯(lián)模塊將緩存行發(fā)送給CPU1的高速緩存;

CPU1對(duì)高速緩存中的變量執(zhí)行CAS操作勘伺;

這是一個(gè)簡(jiǎn)化并忽略了某些復(fù)雜的事件序列跪腹,因?yàn)?

其它CPU可能試圖在相同的緩存行上執(zhí)行并發(fā)的CAS操作;

緩存行可能被只讀復(fù)制到其它的CPU高速緩存中飞醉,這種情況下有必要刷新它們的緩存冲茸;

當(dāng)請(qǐng)求到達(dá)時(shí),CPU7可能已經(jīng)在緩存上操作缅帘,這種情況下CPU7必須你保留這個(gè)請(qǐng)求轴术,直到請(qǐng)求完成、

CPU7可能已經(jīng)從緩存中排出它的緩存行钦无,這樣當(dāng)請(qǐng)求到達(dá)時(shí)逗栽,緩存行已經(jīng)寫入內(nèi)存中了;

在緩存行中可能發(fā)生一個(gè)可糾正的錯(cuò)誤铃诬,因此需要在使用數(shù)據(jù)前糾正它祭陷;

...

CPU的緩存一致性極其復(fù)雜,所以高效率(榨干最后一滴CPU資源趣席,每瓦特性能)且可靠的并行編程總是太不容易!

除了CPU高速緩存還有許多其它因素兵志,如內(nèi)存引用、原子操作宣肚、內(nèi)存屏障想罕、I/O操作等等。

內(nèi)存引用

微處理器從內(nèi)存里讀一個(gè)值的時(shí)間,微處理器可以用這段時(shí)間執(zhí)行成成百甚至上行知指令按价,雖然一直在極大的減少內(nèi)存訪問(wèn)的延遲惭适,但是仍只有高度可以預(yù)測(cè)的數(shù)據(jù)訪問(wèn)模式才能讓緩存發(fā)揮最大效果;

原子操作

CPU會(huì)通過(guò)一條『流水線』來(lái)控制CPU內(nèi)部的指令流(現(xiàn)在微處理器都可以支持多條流水線并行)楼镐,這種架構(gòu)使得CPU流水線的可以一次執(zhí)行多個(gè)操作癞志,而原子操作正與這種特性有沖突;比如一種常見(jiàn)的技巧是標(biāo)出所有包含原子操作所需數(shù)據(jù)的流水線框产,保證CPU在操作時(shí)凄杯,這些流水線都屬于正在執(zhí)行原子操作的CPU;如果我們按CPU一個(gè)時(shí)鐘周期執(zhí)行一條指指令(約為0.6ns)秉宿,一個(gè)最好情況下的CAS操作也需要40個(gè)時(shí)鐘周期戒突;

內(nèi)存屏障

這個(gè)比較好理解,一般有Load Barrier 和 Store Barrier即讀屏障和寫屏障描睦,如JAVA中的volatile關(guān)鍵字

寄存器在執(zhí)行前膊存,為了提高性能,會(huì)對(duì)指令重排忱叭,而內(nèi)存屏障會(huì)禁止指令重排隔崎;

強(qiáng)制將CPU高速存中的數(shù)據(jù)寫回內(nèi)存,讓緩存中相關(guān)的數(shù)據(jù)失效窑多,這又涉及到內(nèi)存總線 CPU與內(nèi)存的讀寫等等的性能損耗仍稀;

JVM對(duì)內(nèi)存屏障的詳細(xì)內(nèi)容可以參考一下<>,作者是阿里大神方騰飛埂息,也是?并發(fā)編程網(wǎng)?博主技潘,總之很牛逼。

I/O操作

如高速緩存未命中(CPU之間的I/O)千康,如果涉及到網(wǎng)絡(luò)享幽,大容量存儲(chǔ)(磁盤),這類操作對(duì)于性能的影響更是遠(yuǎn)遠(yuǎn)大于上面提到幾種的開(kāi)銷;

所以并行編程變得復(fù)雜拾弃,除了與硬件的交互值桩、還有任務(wù)分割、并行訪問(wèn)控制等豪椿;這些如線程奔坟、鎖、屏障等搭盾,我們?cè)趯?shí)際工作中應(yīng)盡量避免直接控制它們咳秉,因?yàn)樗鼈兌加泄制猓幪幨窍菥煊纾粦c辛隨著為并發(fā)設(shè)計(jì)編程語(yǔ)言的興起(Elang澜建,Scala,Golang等),在釋放多核威力的同時(shí)炕舵,也一定程度降低了并發(fā)程序的難度何之。特別Golang也是Docker這類明星產(chǎn)品的實(shí)現(xiàn)語(yǔ)言。

Golang并發(fā)模式(CSP)并發(fā)內(nèi)核

(注咽筋,該圖引自網(wǎng)絡(luò))

其中M是一個(gè)內(nèi)核線程溶推,P是調(diào)度器,G是一個(gè)協(xié)程晤硕,灰色的G為掛起的協(xié)程悼潭;Go通過(guò)協(xié)程goroutine提供語(yǔ)言層面的調(diào)度器庇忌,實(shí)現(xiàn)高效的M:N(M個(gè)用戶線程對(duì)應(yīng)N個(gè)os內(nèi)核線程)對(duì)應(yīng)關(guān)系舞箍,使用goroutine做為并發(fā)實(shí)體,非常的輕量級(jí)皆疹,理論可以很輕松的創(chuàng)建上十萬(wàn)個(gè)goroutine疏橄。

P作為調(diào)度器,作用類似于CPU的核略就,每個(gè)工作線程都必須綁定一個(gè)有效的P才被允許執(zhí)行捎迫,否則只能休眠等到有空閑的P時(shí)被喚醒;P還要為線程提供執(zhí)行資源表牢,如為對(duì)象分配內(nèi)存 本地任務(wù)隊(duì)更等窄绒;

而實(shí)際的執(zhí)行體是M(OS內(nèi)核線程),和P綁定 不停的獲取執(zhí)行G的并發(fā)任務(wù)崔兴。M通過(guò)修改寄存器彰导,將執(zhí)行棧指向G自帶的棧內(nèi)存;

P/M是執(zhí)行的組合體敲茄,但是兩者數(shù)量并非是一一對(duì)應(yīng)位谋,M由調(diào)度器按需創(chuàng)建,比如當(dāng)M陷于一個(gè)IO操作長(zhǎng)時(shí)間阻塞堰燎,P就會(huì)被監(jiān)控線程搶回去去創(chuàng)建或喚醒一個(gè)M執(zhí)行其它任務(wù)掏父。

如果想深入了解,建議可以看看雨痕寫的 <<源碼解析>> 郁悶的點(diǎn)是有匯編和C的代碼...

從一段簡(jiǎn)單的代碼來(lái)看

主協(xié)程調(diào)用producer秆剪,創(chuàng)建了個(gè)生產(chǎn)者協(xié)程赊淑,并返回了一個(gè)通道,這里也可以理解為一個(gè)服務(wù)仅讽。

主協(xié)程的do_something執(zhí)行業(yè)務(wù)邏輯陶缺。

JAVA的同學(xué)從簡(jiǎn)單理解就當(dāng)chan就是JAVA中的隊(duì)列(用通訊的方式共享內(nèi)存)

先做拋磚引玉,后續(xù)再專門針對(duì)Go 和Actor做一些分享何什,交流组哩。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子伶贰,更是在濱河造成了極大的恐慌蛛砰,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件黍衙,死亡現(xiàn)場(chǎng)離奇詭異泥畅,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)琅翻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門位仁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人方椎,你說(shuō)我怎么就攤上這事聂抢。” “怎么了棠众?”我有些...
    開(kāi)封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵琳疏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我闸拿,道長(zhǎng)空盼,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任新荤,我火速辦了婚禮揽趾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘苛骨。我一直安慰自己篱瞎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布智袭。 她就那樣靜靜地躺著奔缠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吼野。 梳的紋絲不亂的頭發(fā)上校哎,一...
    開(kāi)封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音瞳步,去河邊找鬼闷哆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛单起,可吹牛的內(nèi)容都是我干的抱怔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼嘀倒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼屈留!你這毒婦竟也來(lái)了局冰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤灌危,失蹤者是張志新(化名)和其女友劉穎康二,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勇蝙,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沫勿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了味混。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片产雹。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖翁锡,靈堂內(nèi)的尸體忽然破棺而出蔓挖,到底是詐尸還是另有隱情,我是刑警寧澤盗誊,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布时甚,位于F島的核電站,受9級(jí)特大地震影響哈踱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜梨熙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一开镣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咽扇,春花似錦邪财、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至嘶伟,卻和暖如春怎憋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背九昧。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工绊袋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铸鹰。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓癌别,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蹋笼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子展姐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容