使用者態和核心態的區別

布瑋發表於2018-08-30

使用者態和核心態的區別


你是世界的一杆稱,一頭重一頭輕。 –RuiDer

                      --大侄子的紀念日2018-8-27   

before

本篇文章是我在學習Java的synchornized鎖底層原理時碰到的一個知識點,瞭解過synchornized底層原理的都會知道重量級鎖中執行緒的阻塞和喚醒操作,這兩種操作涉及到系統的呼叫,執行緒從使用者態和核心態的切換,其開銷非常大。

使用者態和核心態的區別(轉載)

    核心態與使用者態是作業系統的兩種執行級別,當程式執行在3級特權級上時,
就可以稱之為執行在使用者態,因為這是最低特權級,是普通的使用者程式運
行的特權級,大部分使用者直接面對的程式都是執行在使用者態;反之,當程
序執行在0級特權級上時,就可以稱之為執行在核心態。執行在使用者態下
的程式不能直接訪問作業系統核心資料結構和程式。當我們在系統中執行
一個程式時,大部分時間是執行在使用者態下的,在其需要作業系統幫助完
成某些它沒有權力和能力完成的工作時就會切換到核心態。 
這兩種狀態的主要差別是: 處於使用者態執行時,程式所能訪問的記憶體空間
和物件受到限制,其所處於佔有的處理機是可被搶佔的 ; 而處於核心態
執行中的程式,則能訪問所有的記憶體空間和物件,且所佔有的處理機是不
允許被搶佔的。 
通常來說,以下三種情況會導致使用者態到核心態的切換:

1)系統呼叫

這是使用者態程式主動要求切換到核心態的一種方式,使用者態程式通過系統
呼叫申請使用作業系統提供的服務程式完成工作,比如前例中fork()實
際上就是執行了一個建立新程式的系統呼叫。而系統呼叫的機制其核心還
是使用了作業系統為使用者特別開放的一箇中斷來實現,例如
Linux的int 80h中斷。

2)異常

當CPU在執行執行在使用者態下的程式時,發生了某些事先不可知的異常,這時
會觸發由當前執行程式切換到處理此異常的核心相關程式中,也就轉到了核心
態,比如缺頁異常。

3)外圍裝置的中斷

當外圍裝置完成使用者請求的操作後,會向CPU發出相應的中斷訊號,
這時CPU會暫停執行下一條即將要執行的指令轉而去執行與中斷信
號對應的處理程式,如果先前執行的指令是使用者態下的程式,那麼
這個轉換的過程自然也就發生了由使用者態到核心態的切換。比如硬
盤讀寫操作完成,系統會切換到硬碟讀寫的中斷處理程式中執行後
續操作等。

這3種方式是系統在執行時由使用者態轉到核心態的最主要方式,其中
系統呼叫可以認為是使用者程式主動發起的,異常和外圍裝置中斷則
是被動的。

相關文章