在研究Synchronized的鎖升級(jí)機(jī)制時(shí)偏瓤,有一句話說(shuō):
.....所以從上面描述可以得出,監(jiān)視器鎖就是monitor它是互斥的(mutex)。由于它是互斥的砂代,那么它的操作成本就非常的高,包括系統(tǒng)調(diào)用引起的內(nèi)核態(tài)與用戶態(tài)切換率挣、線程阻塞造成的線程切換等刻伊。因此,后來(lái)稱這種鎖為“重量級(jí)鎖”椒功。
這里提到了依據(jù)用戶態(tài)與內(nèi)核態(tài)的切換捶箱,我就了解一下:
有的說(shuō)這是兩種CPU的狀態(tài),也有人說(shuō)是操作系統(tǒng)的運(yùn)行狀態(tài)动漾,有點(diǎn)不大清楚
1丁屎、兩者區(qū)別以及劃分的原因:
用戶態(tài):運(yùn)行用戶自己編寫的程序,用戶可使用的資源受到極大的限制
核心態(tài):運(yùn)行操作系統(tǒng)的程序旱眯,可以調(diào)用一切資源為該服務(wù)運(yùn)行
現(xiàn)在操作系統(tǒng)的運(yùn)行級(jí)別一般可分為R0-R3四種級(jí)別晨川,其中CPU級(jí)別在R0表示核心態(tài),R3表示用戶態(tài)删豺。Linux中一般只使用R0和R3級(jí)別共虑。
特權(quán)指令:只能由操作系統(tǒng)使用的指令,如中斷呀页、清理內(nèi)存妈拌、設(shè)置時(shí)鐘。
非特權(quán)指令:可以被用戶使用的指令蓬蝶。
劃分特權(quán)和非特權(quán)的原因:操作系統(tǒng)中發(fā)一些指令屬于極其危險(xiǎn)的級(jí)別尘分,如清理內(nèi)存、設(shè)置時(shí)鐘等疾党。如果允許用戶隨意調(diào)用音诫,將發(fā)生無(wú)法預(yù)估的災(zāi)難,導(dǎo)致系統(tǒng)奔潰雪位。
2竭钝、何時(shí)進(jìn)行兩者的切換:
- 系統(tǒng)調(diào)用:當(dāng)處于用戶態(tài)的進(jìn)程出于某種需求,需要操作系統(tǒng)提供一些服務(wù)時(shí)雹洗,申請(qǐng)進(jìn)行系統(tǒng)調(diào)用香罐,如父進(jìn)程fork一個(gè)子進(jìn)程。系統(tǒng)調(diào)用的內(nèi)置機(jī)制是一種軟中斷时肿。
- 異常:在執(zhí)行用戶程序時(shí) 發(fā)生無(wú)法控制的錯(cuò)誤時(shí)庇茫,系統(tǒng)會(huì)自動(dòng)切換成核心態(tài),如除零異常螃成。
- 外設(shè)中斷:當(dāng)外設(shè)發(fā)送請(qǐng)求時(shí)旦签,如果cpu處于用戶態(tài)查坪,則會(huì)暫停執(zhí)行下一條指令,轉(zhuǎn)而去執(zhí)行中斷服務(wù)程序宁炫。此時(shí)發(fā)生的就是用戶態(tài)到核心態(tài)的切換偿曙。
以上三種觸發(fā)方式,本質(zhì)上的切換操作是一致的羔巢,沒有任何區(qū)別望忆,都是相當(dāng)于執(zhí)行了一個(gè)中斷相應(yīng)的過(guò)程!竿秆!因?yàn)橄到y(tǒng)調(diào)用實(shí)際上最終也是“中斷機(jī)制”實(shí)現(xiàn)的启摄,而異常和中斷的處理機(jī)制基本上也是一致的!幽钢!
3歉备、判斷操作系統(tǒng)處于何種特權(quán)級(jí)別:
CS寄存器中最低兩位保存當(dāng)前代碼的執(zhí)行級(jí)別。
涉及到“用戶態(tài)切換到內(nèi)核態(tài)”的步驟主要包括:
1. 從當(dāng)前進(jìn)程的描述符中提取內(nèi)核棧的ss0及esp0信息匪燕。
2. 使用ss0和esp0指向的內(nèi)核棧將當(dāng)前進(jìn)程的cs威创、eip、eflags谎懦、ss、esp信息保存起來(lái)溃斋,這個(gè)過(guò)程也完成了有用戶態(tài)到內(nèi)存棧的切換過(guò)程界拦,同時(shí)保存了被暫停執(zhí)行的程序的下一條指令。
3. 將先前有中斷向量檢索得到的中斷程序的cs梗劫、eip信息裝入相應(yīng)的寄存器享甸,開始執(zhí)行中斷處理程序,這是就轉(zhuǎn)到了內(nèi)核態(tài)的程序執(zhí)行了梳侨。
總結(jié):
1. 計(jì)算機(jī)系統(tǒng)中有“操作系統(tǒng)程序”和“普通用戶程序”蛉威。
2. 操作系統(tǒng)程序執(zhí)行就是在“內(nèi)核態(tài)”下執(zhí)行的。
3. 普通用戶程序就是在“用戶態(tài)”下執(zhí)行的走哺。
4. 內(nèi)核態(tài)可以使用所有的硬件資源蚯嫌,用戶態(tài)不能直接使用系統(tǒng)資源,也不能改變CPU的工作狀態(tài)丙躏,只能訪問(wèn)用戶程序自己的存儲(chǔ)空間择示!
5. 為了安全和穩(wěn)定性,操作系統(tǒng)程序是不能隨便訪問(wèn)的晒旅!
6. 引起“用戶態(tài)切換到內(nèi)核態(tài)”的本質(zhì)就是“CPU實(shí)行了一次中斷相應(yīng)”栅盲!