多線程編程之上下文切換、活性故障以及調(diào)度策略的理解

上下文切換

? 上下文切換在某種程度上可以被看作多個(gè)線程共享同一個(gè)處理器的產(chǎn)物尚粘。

? 概念: 對(duì)于單核CPU來說(對(duì)于多核CPU蝗蛙,此處就理解為一個(gè)核)蝇庭,CPU在一個(gè)時(shí)刻只能運(yùn)行一個(gè)線程,當(dāng)在運(yùn)行一個(gè)線程的過程中轉(zhuǎn)去運(yùn)行另外一個(gè)線程捡硅,這個(gè)叫做線程上下文切換(對(duì)于進(jìn)程也是類似)

? 即使是單核CPU也支持多線程執(zhí)行代碼哮内,CPU通過給每個(gè)線程分配CPU時(shí)間片來實(shí)現(xiàn)這個(gè)機(jī)制。時(shí)間片是CPU分配給各個(gè)線程的時(shí)間壮韭,因?yàn)闀r(shí)間片非常短北发,所以CPU通過不停地切換線程執(zhí)行,讓我們感覺多個(gè)線程時(shí)同時(shí)執(zhí)行的喷屋,時(shí)間片一般是幾十毫秒(ms)琳拨。

? CPU通過時(shí)間片分配算法來循環(huán)執(zhí)行任務(wù),當(dāng)前任務(wù)執(zhí)行一個(gè)時(shí)間片后會(huì)切換到下一個(gè)任務(wù)屯曹。但是狱庇,在切換前會(huì)保存上一個(gè)任務(wù)的狀態(tài),以便下次切換回這個(gè)任務(wù)時(shí)是牢,可以再次加載這個(gè)任務(wù)的狀態(tài)僵井,從任務(wù)保存到再加載的過程就是一次上下文切換

自發(fā)性上下文切換:

線程在執(zhí)行以下任一一個(gè)方法時(shí):

  1. Thread.sleep()
  2. Object.wait()/wait(long)
  3. Thread.yield
  4. Thread.join
  5. lockSupport.park()
  6. 發(fā)起IO操作或等待其他線程持有的鎖驳棱。

非自發(fā)性:

是指線程由于線程調(diào)度器的原因被迫退出焰盗,時(shí)間片用完或者被一個(gè)優(yōu)先級(jí)更高的線程運(yùn)行叭喜。

如何減少上下文切換

? 既然上下文切換會(huì)導(dǎo)致額外的開銷,因此減少上下文切換次數(shù)便可以提高多線程程序的運(yùn)行效率挚躯。減少上下文切換的方法有無鎖并發(fā)編程乳规、CAS算法形葬、使用最少線程和使用協(xié)程。

  • 無鎖并發(fā)編程暮的。多線程競(jìng)爭(zhēng)時(shí)笙以,會(huì)引起上下文切換,所以多線程處理數(shù)據(jù)時(shí)冻辩,可以用一些辦法來避免使用鎖猖腕,如將數(shù)據(jù)的ID按照Hash取模分段拆祈,不同的線程處理不同段的數(shù)據(jù)
  • CAS算法。Java的Atomic包使用CAS算法來更新數(shù)據(jù)倘感,而不需要加鎖
  • 使用最少線程放坏。避免創(chuàng)建不需要的線程,比如任務(wù)很少老玛,但是創(chuàng)建了很多線程來處理淤年,這樣會(huì)造成大量線程都處于等待狀態(tài)
  • 協(xié)程。在單線程里實(shí)現(xiàn)多任務(wù)的調(diào)度蜡豹,并在單線程里維持多個(gè)任務(wù)間的切換.

線程的活性故障

? 線程是為任務(wù)而生的麸粮。因此,理想情況下我們希望線程一直處于 RUNNABLE狀態(tài)镜廉。 顯然弄诲,事實(shí)并非如此:導(dǎo)致-一個(gè)線程可能處于非RUNNABLE狀態(tài)的因素除了資源(主要 是處理器資源有限而導(dǎo)致的上下文切換)限制之外,還有程序自身的錯(cuò)誤和缺陷桨吊。這些由于資源稀缺性或者程序自身的問題和缺陷導(dǎo)致線程一直處于非 RUNNABLE狀態(tài)威根,或者線程 雖然處于RUNNABLE狀態(tài)但是其要執(zhí)行的任務(wù)卻一直 無法進(jìn)展的現(xiàn)象就被稱為線程活性 故障(Liveness Failure )。

常見的活性故障包括以下幾種视乐。

? 死鎖( Deadlock)洛搀。死鎖好比鷸蚌相爭(zhēng)故事中的情形:鷸啄住蚌的肉,蚌夾住鷸 的嘴佑淀。鷸對(duì)蚌說:“ 你先放開我的嘴我就不啄你的肉∩烊校”而蚌對(duì)鷸說:“ 你先放開 我的肉我就不夾你的嘴∨趼”于是最后誰也不放開誰!死鎖產(chǎn)生的典型場(chǎng)景是一個(gè)線 程X持有資源A的時(shí)候等待另外一個(gè)線程釋放資源B,而另外一個(gè)線程Y在持 有資源B的時(shí)候卻等待線程X釋放資源A。死鎖的外在表現(xiàn)是當(dāng)事線程的生命周 期狀態(tài)永遠(yuǎn)處于非RUNNABLE狀態(tài)而使其任務(wù)一直無法進(jìn)展碉哑。

? ●鎖死(Lockout)挚币。鎖死就好比睡美人的故事中睡美人醒來的前提是她要得到王子 的親吻,但是如果王子無法親吻她(比如王子“掛了”....扣典,那么睡美人將一 直沉睡!

●活鎖(Livelock)〉颜常活鎖好比小貓?jiān)噲D咬自己的尾巴,雖然它總是追著自己的尾巴咬,但卻始終無法咬到薪前∪笈活鎖的外在表現(xiàn)是線程可能處于RUNNABLE狀態(tài), 但是線程所要執(zhí)行的任務(wù)卻絲毫沒有進(jìn)展序六,即線程可能一直在 做無用功。

? ●饑餓(Starvation)例诀。饑餓好比母鳥給雛鳥喂食的情形,健壯的雛鳥總是搶先從母 鳥的嘴中搶到食物拱她,從而導(dǎo)致那此弱小的雛鳥總是挨餓扔罪。饑餓就是線程因無法教prton的可執(zhí)行文件為: Windows安景裝5yem2perfmon.exe秉沼。

調(diào)度策略

? 非公平調(diào)度策略是我們多數(shù)情況下的首選資源調(diào)度策略矿酵。其優(yōu)點(diǎn)是吞吐率較大; 缺點(diǎn)是資源申請(qǐng)者申請(qǐng)資源所需的時(shí)間偏差可能較大,并可能導(dǎo)致饑餓現(xiàn)象全肮。公 平調(diào)度策略適合在資源的持有線程占用資源的時(shí)間相對(duì)長(zhǎng)或資源的平均申請(qǐng)時(shí)間 間隔相對(duì)長(zhǎng)的情況下辜腺,或者對(duì)資源申請(qǐng)所需的時(shí)間偏差有所要求的情況下使用休建。 其優(yōu)點(diǎn)是線程申請(qǐng)資源所需的時(shí)間偏差較小评疗,并且不會(huì)導(dǎo)致饑餓現(xiàn)象;其缺點(diǎn)是吞吐率較小。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末砌些,一起剝皮案震驚了整個(gè)濱河市加匈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌矩动,老刑警劉巖释漆,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異示姿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)栈戳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門子檀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來镊掖,“玉大人褂痰,你說我怎么就攤上這事∷跬幔” “怎么了?”我有些...
    開封第一講書人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵主籍,是天一觀的道長(zhǎng)逛球。 經(jīng)常有香客問我,道長(zhǎng)需忿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任涕烧,我火速辦了婚禮汗洒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘溢谤。我一直安慰自己,他們只是感情好阀参,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開白布瞻坝。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捞挥。 梳的紋絲不亂的頭發(fā)上忧吟,一...
    開封第一講書人閱讀 52,821評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音讹俊,去河邊找鬼。 笑死劣像,一個(gè)胖子當(dāng)著我的面吹牛摧玫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诬像,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼芍躏!你這毒婦竟也來了降狠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤否纬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后临燃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烙心,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年爪瓜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了匙瘪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炬转。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡算灸,死狀恐怖驻啤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情骑冗,我是刑警寧澤,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布巧涧,位于F島的核電站,受9級(jí)特大地震影響谤绳,放射性物質(zhì)發(fā)生泄漏袒哥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一堡称、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧桐臊,春花似錦晓殊、人聲如沸断凶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽砚著。三九已至痴昧,卻和暖如春稽穆,著一層夾襖步出監(jiān)牢的瞬間赶撰,已是汗流浹背柱彻。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工餐胀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人否灾。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓墨技,卻偏偏與公主長(zhǎng)得像惩阶,于是被迫代替她去往敵國(guó)和親扣汪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

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