Unix 核心概述

2021-05-24 12:05:36 字數 4179 閱讀 8465

核心本身並不是乙個程序,而是程序的管理者。程序/核心模式假定:請求核心服務的程序使用所謂系統調(system call)的特殊程式設計機制。每個系統呼叫都設定了乙個組識別程序請求的引數,然後執行與硬體相關的cpu指令完成從使用者態到核心態的轉換。 

unix系統還包括幾個所謂核心執行緒(kernel thread)的特權程序(被賦予特殊許可權的程序),它們具有以下特點:

為了讓核心管理程序,每個程序由乙個程序描述符(process descriptor)表示,這個描述符包含有關程序當前狀態的資訊。

所有的unix核心都是可重入的(reentrant),這意味著若干個程序可以同時在核心狀態下執行。

提供可重入的一種方式是編寫函式,以便這些函式只能修改區域性變數,而不能改變全資料結構,這樣的函式叫可重入函式。

(核心控制路徑(kernel control path)表示核心處理系統呼叫、異常或中斷所執行的指令序列。)

每個程序執行在它的私有位址空間。在使用者態下執行的程序涉及到私有棧、資料區和**區。當在核心態進行時,程序訪問核心的資料區和**區,但使用另外的私有棧。

儘管看起來看每個程序訪問乙個私有位址空間,但有時程序之間也共享部分位址空間。在一些情況下,這種共享由程序顯式的提出另外一些情況下,由核心自動完成共享以節約記憶體。

實現可重入核心需要利用同步機制:如果核心控制路徑對某個核心資料結構進行操作時被掛起,那麼,其他的核心控制路徑就不應當再對該資料結構進行操作,除非它已被重新設定成一致性(consistent)狀態。否則,兩個控制路徑的互動作用將破壞所儲存的資訊。

臨界區(critical region)是這樣的一段**:進入這段**的程序必須完成,之後另乙個程序才能進入。

在尋找徹底、簡單奪解決同步問題的方案中,大多數傳統的unix核心都是非常搶占有式的:當程序的核心態執行時,它不能被任意掛起,也不能被另乙個程序代替。

如果核心支援搶占,那麼在應用同步機制時,確保進入臨界區前禁止搶占,退出臨界區時啟用搶占。(不知道windows的臨界區有沒有這功能)

非搶占能力在多處理器系統上是低效的,因為執行在不同cpu上的兩個核心控制路徑本可以併發地訪問相同的資料結構。(不明白,為什麼能併發還會低效。)

單處理器系統上的另一種同步機制是:在進入乙個臨界區之前禁止所有硬體中斷,離開時再重新啟用中斷。

在多處理器系統中禁 止本地cpu上的中斷是不夠的,所以必須使用其他的同步技術。

廣泛使用的一種機制是訊號量(semaphore),它在單處理器系統和多處理器系統上都有效。訊號量僅僅是與乙個資料結構相關的計數器。

在多處理器系統中,訊號量並不總是解決同步問題的最佳方案。系統不允許在不同cpu上執行的核心控制路徑同時訪問某些核心資料結構,如果修改資料結構所需的時間比較短,那麼,訊號量可能是很低效的。核心必須把程序插入到訊號量鍊錶中,然後掛起它。因為這兩種操作比較費時,完成這些操作時,其他的核心控制路徑可能已經釋放了訊號量。

在這些情況下,多處理器作業系統使用了自旋鎖(spin lock)。自旋鎖與訊號量非常相似,但沒有程序表;當乙個程序發現鎖被另乙個程序銷著時,它就不停地「旋轉」,執行乙個緊湊的迴圈指令直到鎖開啟。

自旋鎖在單處理器環境下是無效的。當核心控制路徑試圖訪問乙個上鎖的資料結構時,它開始無休止的迴圈。

與其他控制路徑同步的程序或核心控制路徑很容易進入死鎖( deadlock)狀態。程序之間複雜的迴圈等的情況也可能發生。

1.、unix訊號(signal)提供了把系統事件報告給程序的一種機制。每種事件都有自己的訊號編號,通常用乙個符號常量來表示,例如:sigterm。有兩種系統事件:

2、程序可以以兩種方式對接收到的訊號量做出反應:

如果程序不指定選擇何種方式,核心就根據訊號的編號執行乙個預設操作。五種可能的預設操作是:

3、sigkill和sigstop訊號不能直接由程序處理,也不能由程序忽略。

4、訊息佇列允許程序利用msgsnd()及msgget()系統呼叫交換訊息。

5、共享記憶體為程序之間交換和共享資料提供了最快的方式。其大小按需設定。

描述每個程序的資料結構都包含有兩個指標,乙個直接指向它的父程序,另乙個直接指向它的子程序。

_exit()系統呼叫終止乙個程序。核心對這個系統呼叫的處理是通過釋放民擁有的資源並向父程序傳送sigchild訊號(預設操作忽略)來實現的。

父程序如何查詢其子程序是否終止了呢?wait4()系統呼叫允許程序等待,直到其中的乙個子程序結束;它返回已終止子程序的程序識別符號(process id,pid);

核心在執行這個系統呼叫時,檢查子程序是否已經終止。引入僵死程序的特殊姿態是為了表示終止的程序:父程序執行完wait4()系統呼叫之前,程序就一直停留在那種狀態。系統呼叫處理程式從程序描述符欄位中獲取有關資源使用的一些資料;一旦得到資料,就可以釋放程序描述符。

很多核心也實現了 waitpid()系統呼叫,它允許程序等待乙個特殊的子程序。

init監控所有子程序的執行,並縣城按常規發布wait4()系統呼叫,其***就是除掉所有僵死程序。

現代unix作業系統引入了程序組(process group)的概念,以表示一種「作業(job)」的抽象。例如:為了執行命令列:

$ ls | sort | more

shell支援程序組,例如bash,為三個相應的程序ls、sort 及more建立了乙個新的組。shell以這種方式作用於這三個程序,就好像它們是乙個單獨的實體(更準確地說是作業)。每個程序描述符包括乙個包含程序組id的字段。每一程序組可以有乙個領頭程序(即其pid與這個程序組的id相同的程序)。新建立的程序最初被插入到其父程序的程序組中。

現代unix核心也引入了登入會話(login session)。通常情況下,登入會話就是shell程序為使用者建立的第一條命令。

記憶體管理是迄今為止unix核心中最複雜的活動。

所有新近的unix系統都提供了一種有用的抽象,叫虛擬記憶體(virtual memory)。虛擬記憶體作為一種邏輯層,處理應用程式的記憶體請求與硬體記憶體管理單元(memory managerment unit,mmu)之間。虛擬記憶體有很多用途和優點:

虛擬記憶體子系統的主要成分是虛擬位址空間(virtual address space)的概念。程序所用的一組記憶體位址不同於物理記憶體位址。當程序使用乙個虛擬位址時,核心和mmu協同定位其在記憶體中的實際物理位置。現在的cpu包含了能自動把虛擬位址轉換成實體地址的硬體電路。

所有unix作業系統都毫無疑義地分為兩部分,其中若干兆位元組專門用於存放核心映像(也就是核心**和核心靜態資料結構)。ram的其餘部分通常由虛擬記憶體系統來處理,並縣城用在以下三種可能的方面:

當可用記憶體達到臨界閾值時,可以呼叫頁框**(page-frame-reclaiming)演算法釋放其他記憶體。

虛擬記憶體系統必須解決的乙個主要問題是記憶體碎片。理想情況下,只有當空閒頁框數太少時,記憶體請求才失敗。然而,通常求記憶體使用物理上連續的記憶體區域,因此,即使有足夠的可用記憶體,但它不能作為乙個連續的大塊使用時,記憶體的請求也會失敗。

核心記憶體分配器(knerl memory allocator,kma)是乙個子系統,它試圖滿足系統中所有部分對記憶體的請求。乙個好的kma應該具有下列特點:

基於各種不同的演算法技術,已經提出了幾種kma,包括:

所有現代unix作業系統都採用了所謂請求調頁(demand paging)的記憶體分配策略。有了請求調頁,程序可以在它的頁還沒有在記憶體時就開始執行。當程序訪問乙個不存在的頁時,mmu產生乙個異常;異常處理程式找到受影響的記憶體區,分配乙個空間的頁,並用適當的資料把它初始化。

物理記憶體的一大優勢就是用作磁碟和其他塊裝置的快取記憶體。在最早的unix系統中就已經實現的乙個策略是:盡可能地推遲寫磁碟的時間。因此從磁碟讀入記憶體的資料即使任何程序都不再使用它們,它們也繼續留在ram中。

當乙個程序請求訪問磁碟時,核心首先檢查程序請求的資料是否在快取中,如果在(把這種情況叫做快取命中),核心就可以為程序請求提供服務而不用訪問磁碟。

sync()系統呼叫把所有「髒」的緩衝區(即緩衝區的內容與對應磁碟塊的內容不一樣)寫入磁碟來強制磁碟同步。為了避免資料丟失,所有的作業系統都會注意周期性地把髒緩衝寫回磁碟。

核心通過裝置驅動程式(device driver)與i/o裝置互動。裝置驅動程式包含在核心中,由控制乙個或多個裝置資料結構和函式組成。通過特定的介面,每個驅動程式與核心中的其餘部分(甚至與其他驅動程式)相互作用這種方式具有以下優點:

可以把特定裝置的**封裝在特定的模組中。

廠商可以在不了解核心源**而只知道接品規範的情況下,就能增加新的裝置。

核心以統一的方式對待所有的裝置,並縣城通過相同的介面訪問這些裝置。

可以把裝置驅動程式寫成模組,並動態地把它們裝進核心而不需要重新啟動系統。不再需要時,也可以動態地卸下模組,以減少儲存在ramk的核心映像的大小。

UNIX核心概述 程序 核心模式

cpu既可以執行在使用者態下,也可以執行在核心態。當乙個程式在使用者態執行時,它不能直接訪問核心資料結構或核心的程式。每種cpu模型都提供了從使用者態到核心態的轉換的特殊指令,反之亦然。乙個程式執行時,大部分時間都處於使用者態,只有需要核心所提供的服務時才切換到核心態。當核心滿足了程式的請求後,它讓...

uniX核心概述 可重入核心

所有的unix核心都是可重入的,這意味著若干個程序可以同時在核心態下執行。在單處理器系統上只有乙個進 正執行,但是有許多程序可能在等待cpu或某乙個i o操作完成時在核心態下被阻塞。例如,當核心代表某一程序發出乙個讀磁碟的請求後,就讓磁碟控制器處理這個請求,並恢復執行其他程序。當裝置滿足了讀請求時,...

UNIX 系統概述

系統在password檔案中尋找登入名,通常為檔案 etc passwd。每個使用者由7部分組成 登入名 加密密碼 使用者id 使用者組id 注釋字段 home資料夾 shell程式 所有現代的系統都將加密密碼移到了另外乙個檔案中。乙個shell是乙個命令列直譯器,它讀取使用者輸入並執行命令。使用者...