上下文切換

進(jìn)程間上下文切換

鎖的競(jìng)爭(zhēng)太激烈會(huì)導(dǎo)致鎖升級(jí)為重量級(jí)鎖筷屡,未搶到鎖的線(xiàn)程會(huì)進(jìn)入monitor捷兰,而monitor依賴(lài)于底層操作系統(tǒng)的mutex lock,獲取鎖時(shí)會(huì)發(fā)生用戶(hù)態(tài)和內(nèi)核態(tài)之間的切換,所以會(huì)發(fā)生進(jìn)程間的上下文切換冗美。

線(xiàn)程間上下文切換

線(xiàn)程間上下文切換就是一個(gè)工作的線(xiàn)程被另外一個(gè)線(xiàn)程暫停昼钻,另外一個(gè)線(xiàn)程占用了處理器開(kāi)始執(zhí)行任務(wù)的過(guò)程掸屡。系統(tǒng)和 Java 程序自發(fā)性以及非自發(fā)性的調(diào)用操作,就會(huì)導(dǎo)致上下文切換然评,從而帶來(lái)系統(tǒng)開(kāi)銷(xiāo)仅财。線(xiàn)程越多,系統(tǒng)的運(yùn)行速度不一定越快碗淌。那么我們平時(shí)在并發(fā)量比較大的情況下盏求,什么時(shí)候用單線(xiàn)程,什么時(shí)候用多線(xiàn)程呢亿眠?一般在單個(gè)邏輯比較簡(jiǎn)單碎罚,而且速度相對(duì)來(lái)非常快的情況下纳像,我們可以使用單線(xiàn)程荆烈。例如Redis,從內(nèi)存中快速讀取值爹耗,不用考慮 I/O 瓶頸帶來(lái)的阻塞問(wèn)題耙考。而在邏輯相對(duì)來(lái)說(shuō)很復(fù)雜的場(chǎng)景,等待時(shí)間相對(duì)較長(zhǎng)又或者是需要大量計(jì)算的場(chǎng)景潭兽,我建議使用多線(xiàn)程來(lái)提高系統(tǒng)的整體性能倦始。例如,NIO 時(shí)期的文件讀寫(xiě)操作山卦、圖像處理以及大數(shù)據(jù)分析等鞋邑。

上下文

上下文都包括哪些內(nèi)容呢?具體來(lái)說(shuō)账蓉,它包括了寄存器的存儲(chǔ)內(nèi)容以及程序計(jì)數(shù)器存儲(chǔ)的指令內(nèi)容枚碗。CPU 寄存器負(fù)責(zé)存儲(chǔ)已經(jīng)、正在和將要執(zhí)行的任務(wù)铸本,程序計(jì)數(shù)器負(fù)責(zé)存儲(chǔ) CPU 正在執(zhí)行的指令位置以及即將執(zhí)行的下一條指令的位置

原因


結(jié)合圖示可知肮雨,線(xiàn)程主要有“新建”(NEW)、“就緒”(RUNNABLE)箱玷、“運(yùn)行”(RUNNING)怨规、“阻塞”(BLOCKED)陌宿、“死亡”(DEAD)五種狀態(tài)。到了 Java 層面它們都被映射為了 NEW波丰、RUNABLE壳坪、BLOCKED、WAITING掰烟、TIMED_WAITING爽蝴、TERMINADTED 等 6 種狀態(tài)。

  1. 在這個(gè)運(yùn)行過(guò)程中纫骑,線(xiàn)程由 RUNNABLE 轉(zhuǎn)為非 RUNNABLE 的過(guò)程就是線(xiàn)程上下文切換蝎亚。
  2. 一個(gè)線(xiàn)程的狀態(tài)由 RUNNING 轉(zhuǎn)為 BLOCKED ,再由 BLOCKED 轉(zhuǎn)為 RUNNABLE 先馆,然后再被調(diào)度器選中執(zhí)行颖对,這就是一個(gè)上下文切換的過(guò)程。
  3. 當(dāng)一個(gè)線(xiàn)程從 RUNNING 狀態(tài)轉(zhuǎn)為 BLOCKED 狀態(tài)時(shí)磨隘,我們稱(chēng)為一個(gè)線(xiàn)程的暫停,線(xiàn)程暫停被切出之后顾患,操作系統(tǒng)會(huì)保存相應(yīng)的上下文番捂,以便這個(gè)線(xiàn)程稍后再次進(jìn)入 RUNNABLE 狀態(tài)時(shí)能夠在之前執(zhí)行進(jìn)度的基礎(chǔ)上繼續(xù)執(zhí)行。
  4. 當(dāng)一個(gè)線(xiàn)程從 BLOCKED 狀態(tài)進(jìn)入到 RUNNABLE 狀態(tài)時(shí)江解,我們稱(chēng)為一個(gè)線(xiàn)程的喚醒设预,此時(shí)線(xiàn)程將獲取上次保存的上下文繼續(xù)完成執(zhí)行
  5. 通過(guò)線(xiàn)程的運(yùn)行狀態(tài)以及狀態(tài)間的相互切換犁河,我們可以了解到鳖枕,多線(xiàn)程的上下文切換實(shí)際上就是由多線(xiàn)程兩個(gè)運(yùn)行狀態(tài)的互相切換導(dǎo)致的。那么在線(xiàn)程運(yùn)行時(shí)桨螺,線(xiàn)程狀態(tài)由 RUNNING 轉(zhuǎn)為 BLOCKED 或者由 BLOCKED 轉(zhuǎn)為 RUNNABLE宾符,這又是什么誘發(fā)的呢?
    在 Linux 系統(tǒng)下灭翔,可以使用 Linux 內(nèi)核提供的 vmstat 命令魏烫,來(lái)監(jiān)視 Java 程序運(yùn)行過(guò)程中系統(tǒng)的上下文切換頻率,cs 如下圖所示:

如果是監(jiān)視某個(gè)應(yīng)用的上下文切換肝箱,就可以使用 pidstat 命令監(jiān)控指定進(jìn)程的 Context Switch 上下文切換

至于系統(tǒng)開(kāi)銷(xiāo)具體發(fā)生在切換過(guò)程中的哪些具體環(huán)節(jié)哄褒,總結(jié)如下:

  1. 操作系統(tǒng)保存和恢復(fù)上下文;
  2. 調(diào)度器進(jìn)行線(xiàn)程調(diào)度煌张;
  3. 處理器高速緩存重新加載呐赡;
  4. 上下文切換也可能導(dǎo)致整個(gè)高速緩存區(qū)被沖刷,從而帶來(lái)時(shí)間開(kāi)銷(xiāo)骏融。
最后編輯于
?著作權(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)離奇詭異包个,居然都是意外死亡刷允,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門(mén)碧囊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)树灶,“玉大人,你說(shuō)我怎么就攤上這事糯而√焱ǎ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵熄驼,是天一觀的道長(zhǎng)像寒。 經(jīng)常有香客問(wèn)我,道長(zhǎng)瓜贾,這世上最難降的妖魔是什么诺祸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮祭芦,結(jié)果婚禮上筷笨,老公的妹妹穿的比我還像新娘。我一直安慰自己龟劲,他們只是感情好胃夏,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著昌跌,像睡著了一般仰禀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蚕愤,一...
    開(kāi)封第一講書(shū)人閱讀 52,821評(píng)論 1 314
  • 那天悼瘾,我揣著相機(jī)與錄音,去河邊找鬼审胸。 笑死亥宿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的砂沛。 我是一名探鬼主播烫扼,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼碍庵!你這毒婦竟也來(lái)了映企?” 一聲冷哼從身側(cè)響起悟狱,我...
    開(kāi)封第一講書(shū)人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎堰氓,沒(méi)想到半個(gè)月后挤渐,有當(dāng)?shù)厝嗽跇?shù)林里發(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
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望亩冬。 院中可真熱鬧,春花似錦硼身、人聲如沸硅急。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)营袜。三九已至,卻和暖如春丑罪,著一層夾襖步出監(jiān)牢的瞬間荚板,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工吩屹, 沒(méi)想到剛下飛機(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)容

  • 雙十一前的一個(gè)多月嘲驾,所有的電商相關(guān)的系統(tǒng)都在進(jìn)行壓測(cè)淌哟,不斷的優(yōu)化系統(tǒng),我們的電商ERP系統(tǒng)也進(jìn)行了一個(gè)多月的壓測(cè)和...
    鶴子青云上閱讀 695評(píng)論 0 0
  • 線(xiàn)程狀態(tài) NEW:通過(guò)Thread類(lèi)創(chuàng)建了一個(gè)線(xiàn)程辽故,在調(diào)用start()方法之前的狀態(tài)徒仓。RUNNABLE:運(yùn)行狀態(tài)...
    alexwu59閱讀 1,691評(píng)論 0 2
  • 讀過(guò)倪朋飛的《Linux性能優(yōu)化實(shí)戰(zhàn)》經(jīng)常說(shuō)的 CPU 上下文切換是什么意思?[https://time.geek...
    冬天里的懶喵閱讀 143評(píng)論 0 0
  • 在并發(fā)程序中,并不是啟動(dòng)更多的線(xiàn)程就能讓程序最大限度地并發(fā)執(zhí)行誊垢。線(xiàn)程數(shù)量設(shè)置太 小掉弛,會(huì)導(dǎo)致程序不能充分地利用系統(tǒng)資...
    柳岸花開(kāi)閱讀 320評(píng)論 0 0
  • 查看CPU上下文切換的命令 了解了CPU上下文切會(huì)導(dǎo)致系統(tǒng)負(fù)載升高,下面我們介紹下用linux命令查看系統(tǒng)CPU上...
    崔天浩閱讀 825評(píng)論 0 1