? 多線程面試-什么是多線程上下文切換?
多線程會(huì)共同使用一組計(jì)算機(jī)上的CPU ,而線程數(shù)大于給線程分配的 CPU 數(shù)量時(shí),為了讓各個(gè)線程都有執(zhí)行的機(jī)會(huì),就需要輪轉(zhuǎn)使用CPU。
不同的線程切換使用 CPU, 發(fā)生的切換數(shù)據(jù)等, 就是上下文切換
- 在上下文切換過程中, CPU 會(huì)停止處理當(dāng)前運(yùn)行的程序, 并保存當(dāng)前程序運(yùn)行的具體位置, 以便之后繼續(xù)運(yùn)行. 從這個(gè)角度來看, 上下文切換有點(diǎn)像我們同時(shí)閱讀幾本書, 在來回切換書本的同時(shí)我們需要記住每本書當(dāng)前讀到的頁碼. 在程序中, 上下文切換過程中的 “頁碼” 信息是保存在進(jìn)程控制塊(PCB)中的。PCB 還經(jīng)常被稱作 “切換幀”(switchframe)。“頁碼”信息會(huì)一直保存到CPU的內(nèi)存中,直到他們被再次使用。
- 上下文切換是存儲(chǔ)和恢復(fù)CPU狀態(tài)的過程,它使得線程執(zhí)行能夠從中斷點(diǎn)恢復(fù)執(zhí)行。上下文切換是多任務(wù)操作系統(tǒng)和多線程環(huán)境的基本特征。
?? Java中用到的線程調(diào)度算法是什么?
假設(shè)計(jì)算機(jī)只有一個(gè)CPU,則在任意時(shí)刻只能執(zhí)行一個(gè)條機(jī)器指令,每個(gè)線程只有獲得CPU的使用權(quán)才能執(zhí)行指令。
- 所謂多線程的并發(fā)運(yùn)行,其實(shí)是指從宏觀上看,各個(gè)線程輪流獲得CPU的使用權(quán),分別執(zhí)行各自的任務(wù)。
- 在運(yùn)行池中,會(huì)有多個(gè)處于就緒狀態(tài)的線程在等待CPU,Java虛擬機(jī)的一項(xiàng)任務(wù)就是負(fù)責(zé)線程的調(diào)度,線程調(diào)度是指按照特定機(jī)制為多個(gè)線程分配CPU的使用權(quán)。
有兩種調(diào)度模型:分時(shí)調(diào)度模型和搶占式調(diào)度模型。
-
分時(shí)調(diào)度模型是指讓所有的線程輪流獲得CPU的使用權(quán),并且平均分配每個(gè)線程占用的CPU的時(shí)間片這個(gè)也比較好理解。
-
Java虛擬機(jī)采用搶占式調(diào)度模型,是指優(yōu)先讓可運(yùn)行池中優(yōu)先級(jí)高的線程占有CPU,如果可運(yùn)行池中的線程優(yōu)先級(jí)相同,那么就隨機(jī)選擇一個(gè)線程,是其占用CPU。處于運(yùn)行狀態(tài)的線程會(huì)一直運(yùn)行,直至它不得不放棄CPU。
如非特別需要,盡量不要用,防止線程接饑餓。
?? 什么是線程饑餓 ?
饑餓,一個(gè)或者多個(gè)線程因?yàn)榉N種原因無法獲得所需要的資源,導(dǎo)致一直無法執(zhí)行的狀態(tài) 。
Java 中導(dǎo)致饑餓的原因:文章來源:http://www.zghlxwxcb.cn/news/detail-634727.html
- 高優(yōu)先級(jí)線程吞噬所有的低優(yōu)先級(jí)線程的 CPU 時(shí)間。
- 線程被永久堵塞在一個(gè)等待進(jìn)入同步塊的狀態(tài),因?yàn)槠渌€程總是能在它之前持續(xù)地對(duì)該同步塊進(jìn)行訪問。
- 線程在等待一個(gè)本身也處于永久等待完成的對(duì)象(比如調(diào)用這個(gè)對(duì)象的 wait 方法),因?yàn)槠渌€程總是被持續(xù)地獲得喚醒。
你對(duì)線程優(yōu)先級(jí)的理解是什么?
每一個(gè)線程都是有優(yōu)先級(jí)的,一般來說,高優(yōu)先級(jí)的線程在運(yùn)行時(shí)會(huì)具有優(yōu)先權(quán),但這依賴于線程調(diào)度的實(shí)現(xiàn),這個(gè)實(shí)現(xiàn)是和操作系統(tǒng)相關(guān)的(OS dependent)。文章來源地址http://www.zghlxwxcb.cn/news/detail-634727.html
- 我們可以定義線程的優(yōu)先級(jí),但是這并不能保證高優(yōu)先級(jí)的線程會(huì)在低優(yōu)先級(jí)的線程前執(zhí)行。線程優(yōu)先級(jí)是一個(gè) int 變量(從1-10),1 代表最低優(yōu)先級(jí),10 代表最高優(yōu)先級(jí)。
- Java 的線程優(yōu)先級(jí)調(diào)度會(huì)委托給操作系統(tǒng)去處理,所以與具體的操作系統(tǒng)優(yōu)先級(jí)有關(guān),如非特別需要,一般無需設(shè)置線程優(yōu)先級(jí)。
到了這里,關(guān)于? 多線程面試-什么是多線程上下文切換?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!