大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 詳解線程上下文切換

詳解線程上下文切換

更新時間:2020-11-20 17:56:49 來源:動力節點 瀏覽2631次

對于單核 CPU,CPU 在一個時刻只能運行一個線程,當在運行一個線程的過程中轉去運行另外一個線程,這個叫做線程上下文切換


由于可能當前線程的任務并沒有執行完畢,所以在切換時需要保存線程的運行狀態,以便下次重新切換回來時能夠繼續切換之前的狀態運行。舉個簡單的例子:比如一個線程A正在讀取一個文件的內容,正讀到文件的一半,此時需要暫停線程A,轉去執行線程B,當再次切換回來執行線程A的時候,我們不希望線程A又從文件的開頭來讀取。


因此需要記錄線程A的運行狀態,那么會記錄哪些數據呢?因為下次恢復時需要知道在這之前當前線程已經執行到哪條指令了,所以需要記錄程序計數器的值,另外比如說線程正在進行某個計算的時候被掛起了,那么下次繼續執行的時候需要知道之前掛起時變量的值時多少,因此需要記錄CPU寄存器的狀態。所以一般來說,線程上下文切換過程中會記錄程序計數器、CPU寄存器狀態等數據。


簡而言之:對于線程的上下文切換實際上就是 存儲和恢復CPU狀態的過程,它使得線程執行能夠從中斷點恢復執行。


既然上下文切換會帶來開銷,給CPU帶來負擔,那么我們該如何減少線程上下文切換呢?


1 .減少線程的數量

由于一個CPU每個時刻只能執行一條線程,而傲嬌的我們又想讓程序并發執行,操作系統只好不斷地進行上下文切換來使我們從感官上覺得程序是并發執的行。因此,我們只要減少線程的數量,就能減少上下文切換的次數。然而如果線程數量已經少于CPU核數,每個CPU執行一條線程,照理來說CPU不需要進行上下文切換了,但事實并非如此。


2 .控制同一把鎖上的線程數量

如果多條線程共用同一把鎖,那么當一條線程獲得鎖后,其他線程就會被阻塞;當該線程釋放鎖后,操作系統會從被阻塞的線程中選一條執行,從而又會出現上下文切換。因此,減少同一把鎖上的線程數量也能減少上下文切換的次數。


3 .采用無鎖并發編程

需要并發執行的任務是無狀態的:HASH分段

所謂無狀態是指并發執行的任務沒有共享變量,他們都獨立執行。對于這種類型的任務可以按照ID進行HASH分段,每段用一條線程去執行。

需要并發執行的任務是有狀態的:CAS算法

如果任務需要修改共享變量,那么必須要控制線程的執行順序,否則會出現安全性問題。你可以給任務加鎖,保證任務的原子性與可見性,但這會引起阻塞,從而發生上下文切換;為了避免上下文切換,你可以使用CAS算法,僅在線程內部需要更新共享變量時使用CAS算法來更新,這種方式不會阻塞線程,并保證更新過程的安全性。


因此,盡管多線程可以使得任務執行的效率得到提升,但由于在線程切換時同樣會帶來一定的開銷代價,并且多個線程會導致系統資源占用的增加,所以在進行多線程編程時要注意這些因素。好了,線程上下文切換就講到這里,想要掌握更多的多線程知識的小伙伴抓緊時間攻克本站的Java多線程教程吧!


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 亚洲国产一区二区三区精品 | 久久久久久久蜜桃 | 国产亚洲精aa在线观看香蕉 | www夜夜操 | 国产成人香蕉 | 欧美日韩在线成人免费视频大全 | 拍拍拍无挡视频免费观看1000 | 色综合色狠狠天天久久婷婷基地 | 久久精品美女久久 | 曰本毛片 | 青青青激情视频在线最新 | 日本大蕉香蕉大视频在线观看 | 国产在视频线精品www666 | 91久久夜色精品国产网站 | 天海翼精品久久中文字幕 | 国产精品资源在线 | 嫩小xxxxx性bbbbb孕妇 | 青草网址| 9热在线精品视频观看 | 中文字幕一区二区日产乱码 | 欧美国产综合在线 | 九九热最新视频 | 成人午夜影院在线观看 | 国产伦理久久精品久久久久 | 国产免费精彩视频 | 国产精品亚洲午夜不卡 | 成人短视频在线观看视频 | 四虎影视永久地址www成人污 | 国产精品国产 | 日本一区中文字幕 | 99九九国产精品免费视频 | 免费黄色在线观看 | 久久se精品动漫一区二区三区 | 999久久久免费精品国产牛牛 | 中文字幕2区 | 午夜久久免影院欧洲 | 999yy成年在线视频免费看 | 亚洲免费在线视频 | 国产在线精品香蕉麻豆 | 首页 动漫 亚洲 欧美 日韩 | 日本不卡视频免费 |