cpu既可以在執行在使用者態下,也可以執行在核心態下。實際上,一些cpu可以有兩種以上的執行狀態。
例如,intel 80*86微處理器有四種不同的執行狀態。但是,所有標準的unix核心都僅僅利用了核心態和使用者態。
當乙個程式在使用者態下執行時,它不能直接訪問核心資料結構或者核心的程式。
然而,當應用程式在核心態下執行時,這些限制不再有效。
每種cpu模型都為從使用者態到核心態的轉換提供了特殊的指令,反之亦然。乙個程式執行時,大部分時間都是在使用者態下,只有需要核心提供的服務時才會切換到核心態。當核心滿足了使用者程式的請求後,它讓程式又回到了使用者態下。
核心本身不是乙個程序,而是程序的管理者。程序/核心模式假定:請求核心服務的程序使用系統呼叫的特殊程式設計機制。每個系統呼叫都設定了一組識別程序請求的引數,然後執行與硬體相關的cpu指令完成從使用者態到核心態的轉換。
為了讓核心管理程序,每個程序由乙個程序描述符表示,這個描述符包含有關程序當前狀態的資訊。
當核心暫停乙個程序的執行時,就把幾個相關處理器暫存器的內容儲存在程序描述符中。這些暫存器包括:
* 程式計數器(pc)和棧指標(sp)暫存器
* 通用暫存器
* 浮點暫存器
* 包含cpu狀態資訊的處理器控制暫存器(處理器狀態字,processor status word)
* 用來跟蹤程序對ram訪問的記憶體管理暫存器
當核心決定恢復執行乙個程序時,它用程序描述符中的合適的字段來裝載cpu暫存器。因為pc中所存的值指向下一條將要執行的指令,所以程序從它停止的地方恢復執行。
當乙個程序不在cpu上執行時,它正在等待某乙個事件。unix核心可以區分很多等待狀態,這些等待狀態通常由程序描述符佇列實現。每個(可能為空)佇列對應一組等待特定事件的程序。
所有的unix核心都是可重入的,這意味著若干個程序可以同時在核心態下執行。當然在單個cpu系統上,只能有乙個程序在執行,但是有許多程序可能在等cpu或者某乙個io操作完成時在核心態下被阻塞。
提供可重入的一種方式是編寫函式,以便這些函式只能修改區域性變數,而不能改變全域性變數資料結構,這樣的函式叫做可重入函式。但是可重入核心不僅僅侷限於這樣的可重入函式(儘管一些實時核心正是如此實現的)。相反,可重入核心可以包含非重入函式,並且利用鎖機制保證一次只有乙個程序執行乙個非重入函式。
如果乙個硬體中斷發生,可重入核心能掛起當前正在執行的程序,即使這個程序處於核心態。這種能力非常重要:能夠提高發出中斷的裝置控制器的吞吐量。一旦裝置已發出乙個中斷,它就一直等待直到cpu應答為止。如果核心能夠快速應答,並且利用控制器在cpu處理中斷時就能執行其他任務。
每個程序執行在它的私有位址空間。
在使用者態下執行的程序涉及到私有棧、資料區和**區。當在核心態執行時,程序訪問核心態的資料區和**區,但使用另外的私有棧。
因為核心是可重入的,因此幾個核心控制路徑(每個都與不同程序相關)可以輪流執行。在這種情況,都引用自己的私有棧。
在一些情況下,可以共享部分位址空間,可以由程序顯示提出,也可以由核心自動完成以節約記憶體。
非搶占式核心–>禁止中斷–>訊號量–>自旋鎖–>避免死鎖
訊號量僅僅是與乙個資料結構相關的計數器。所有核心執行緒在試圖訪問這個資料結構之前,都要檢查這個訊號量。可以把每個訊號量看成乙個物件,其組成如下:
* 乙個整數變數
* 乙個等待程序的鍊錶
* 兩個原子方法:down()和up()
down方法對訊號量減1,如果這個新值小於0,該方法就把正在執行的程序加入到這個訊號量鍊錶,然後阻塞該程序(即呼叫排程程式)。up方法對訊號量加1,如果這個新值大於或者等於0,則啟用這個訊號量鍊錶中的乙個或者多個程序。
自旋鎖,在多cpu系統中,訊號量並不總是解決同步問題的最佳方案。為了檢查訊號量,核心必須把程序插入到訊號量鍊錶中,然後掛其它。因為這兩個操作比較費時,完成這些操作時,其他的核心控制路徑可能已經釋放了訊號量。
在這些情況下,多處理器系統使用了自旋鎖。自旋鎖和訊號量相似,但沒有程序鍊錶;當乙個程序發現鎖被另外乙個程序鎖著時,它就不停地「旋轉」,執行乙個緊湊的迴圈指令直到鎖開啟
自旋鎖在單處理器環境無效的。
** unix訊號(singal)提供了把系統事件報告給程序的一種機制。
每個事件都有乙個訊號編號,通常用乙個符號常量來表示。
posix標準定義了大約20種不同的訊號,其中,有兩種是使用者自定義的,可以當作使用者態下程序通訊和同步的原語機制。一般來說,程序可以以兩種方式對接受到的訊號做出反應:
1.忽略該訊號
2.非同步地執行乙個指定的過程(訊號處理程式)
如果程序不指定選擇何種方式,核心就根據訊號的編號執行乙個預設操作。五種可能的預設操作是:
* 終止程序
* 將執行上下文和程序位址空間的內容寫入乙個檔案(核心轉儲,core dump),並終止程序
* 忽略訊號
* 掛起程序
* 如果程序曾被暫停,則恢復它的執行。
因為posix語義允許程序暫時阻塞訊號,因此核心訊號的處理相當精細。此外,sigkill和sigstop不能直接讓程序處理,也不能由程序忽略。
*程序管理:
待補充。。。。
參考《深入理解linux核心》
Unix 核心概述
核心本身並不是乙個程序,而是程序的管理者。程序 核心模式假定 請求核心服務的程序使用所謂系統調 system call 的特殊程式設計機制。每個系統呼叫都設定了乙個組識別程序請求的引數,然後執行與硬體相關的cpu指令完成從使用者態到核心態的轉換。unix系統還包括幾個所謂核心執行緒 kernel t...
Spark Spark 核心概述
spark core 提供 spark 最基礎的最核心的功能,主要包括 sparkcontext 內建的 dagscheduler 負責建立 job,將 dag 中的 rdd 劃分到不同的 stage,提交 stage 等功能。sparkcontext 內建的 taskscheduler 負責資源的...
UNIX核心概述 程序 核心模式
cpu既可以執行在使用者態下,也可以執行在核心態。當乙個程式在使用者態執行時,它不能直接訪問核心資料結構或核心的程式。每種cpu模型都提供了從使用者態到核心態的轉換的特殊指令,反之亦然。乙個程式執行時,大部分時間都處於使用者態,只有需要核心所提供的服務時才切換到核心態。當核心滿足了程式的請求後,它讓...