linux Unix核心概述

2021-07-15 20:27:48 字數 2540 閱讀 2307

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模型都提供了從使用者態到核心態的轉換的特殊指令,反之亦然。乙個程式執行時,大部分時間都處於使用者態,只有需要核心所提供的服務時才切換到核心態。當核心滿足了程式的請求後,它讓...