目錄
多用戶系統(tǒng)
進程
內(nèi)核體系架構(gòu)
文件系統(tǒng)概述
Base
硬鏈接和軟鏈接
Unix文件類型
文件描述符與索引節(jié)點
文件操作的系統(tǒng)調(diào)用
Unix內(nèi)核簡述
進程的實現(xiàn)
可重入內(nèi)核
進程地址空間
同步和臨界區(qū)
信號與進程之間的通信
進程管理
內(nèi)存管理
虛擬內(nèi)存
隨機訪問存儲器的使用
內(nèi)核分配器
進程的虛擬地址空間處理
高速緩存
任何計算機系統(tǒng)都包含一個名為操作系統(tǒng)的基本程序集合!在這個集合里最重要的程序被稱為內(nèi)核。當操作系統(tǒng)啟動的時候內(nèi)核會被裝進RAM當中。
操作系統(tǒng)說來說去就是兩個主要目標:他充當?shù)讓拥奈锢聿考糜玫某橄?,給予上層服務(wù)一個好的平臺
-
與硬件部分進行交互,為包含在硬件平臺上的所有底層可編程部件提供服務(wù)!
-
為運行在計算機系統(tǒng)上層的應(yīng)用程序即所謂的用戶程序提供一個執(zhí)行環(huán)境!
為了保障安全。我們的操作系統(tǒng)引入了一組概念,也就是用戶模式和特權(quán)模式。我們會在之后的博客中有所涉及:簡單的講:一些涉及到底層硬件訪問的操作需要在特權(quán)模式下進行,反之則會在用戶模式下進行!程序的運行有時會在兩者之間進行頻繁的切換,從而更好地完成程序所提供的服務(wù)。
多用戶系統(tǒng)
多用戶系統(tǒng)就是一臺能夠并發(fā)的執(zhí)行和獨立的執(zhí)行分別屬于兩個或者多個用戶的若干應(yīng)用程序的計算機。
并發(fā)意味著幾個應(yīng)用程序同時處于活動狀態(tài)執(zhí)行自己應(yīng)用進程所需要執(zhí)行的任務(wù),而并不需要考慮其它應(yīng)用程序在做什么!
多用戶操作系統(tǒng)必須包含以下幾個特點
-
核實用戶身份的認證機制
-
防止有錯誤的用戶程序妨礙其它應(yīng)用程序在系統(tǒng)中運行的保護機制
-
防止有惡意的用戶程序干涉或者窺視其他用戶的活動的保護機制
-
限制分配給每個用戶的資源數(shù)的記賬機制
于是我們會把用戶進行分為用戶組在多用戶系統(tǒng)中每個用戶在機器上都會有自己的私用空間!典型的它需要一些磁盤空間來存儲文件!以及接受私人郵件信息等!這一些都需要分層的特權(quán)來實現(xiàn)一定的保護機制!
所有的用戶都用一個唯一的數(shù)字來進行標識,也就是用戶標識符!通常一個計算機系統(tǒng)只能夠由有限個人來使用。當其中的某個用戶開始一個工作session的時候,操作系統(tǒng)會要求輸入一個登錄口令。如果用戶輸入無效則會拒絕登錄,從而保障用戶的隱私。
進程
所有的操作系統(tǒng)都有一個基本的抽象:也就是進程!
進程可以定義為一個程序執(zhí)行時的一個實例或者一個運行程序所使用的上下文。在傳統(tǒng)的操作系統(tǒng)中:一個進程在地址空間中執(zhí)行一個獨立的指令序列,地址空間是允許引用的內(nèi)存地址集合。
在多用戶系統(tǒng)中必須實施一種執(zhí)行環(huán)境:在這樣的環(huán)境里,幾個進程可以并發(fā)的活動,并能競爭系統(tǒng)資源。允許進程并發(fā)活動的系統(tǒng)叫多道程序系統(tǒng)或多處理系統(tǒng)。
作為一個單處理器系統(tǒng)上,只有一個進程能夠占用CPU。這也就意味著實際上只有一條執(zhí)行流,那么他們是如何實現(xiàn)一種感官上的并發(fā)呢?
這需要操作系統(tǒng)的進程是搶占式的!也就是說操作系統(tǒng)需要記錄每個進程所占有的CPU時間,并且周期性地激活調(diào)度程序。以保證感官上的并發(fā)!Unix操作系統(tǒng)是一個具有搶占式進程的多處理操作系統(tǒng)。換而言之,Unix操作系統(tǒng)是一個搶占式的多道處理操作系統(tǒng)!
內(nèi)核體系架構(gòu)
大部分Unix內(nèi)核是單塊結(jié)構(gòu)的!也就是說它們屬于宏內(nèi)核操作系統(tǒng)!每一個內(nèi)核層都被集成到整個內(nèi)核程序中,并且代表當前進程是在內(nèi)核態(tài)下運行!相反微內(nèi)核操作系統(tǒng)只需要內(nèi)核有一個很小的函數(shù):即通常包括幾個同步原語,一個簡單的調(diào)度程序,和IPC通信機制。運行在微內(nèi)核上的幾個系統(tǒng)進程實現(xiàn)宏內(nèi)核操作系統(tǒng)實現(xiàn)的功能:如內(nèi)存分配,設(shè)備驅(qū)動,系統(tǒng)調(diào)用處理等。
事實證明微內(nèi)核操作系統(tǒng)的效率比較低,因為它需要花費大量的時間進行進程之間的通信。不過微內(nèi)核操作系統(tǒng)比單核快內(nèi)核有一定的理論優(yōu)勢,因為它強迫系統(tǒng)程序員采用模塊化的方法來構(gòu)建程序。所以Linux充分吸收了微內(nèi)核操作系統(tǒng)的優(yōu)點:提供了一個模塊的機制!模塊是這樣的一個目標文件:它上面的代碼可以在運行時鏈接到內(nèi)核,或者從內(nèi)核中解除鏈接。這種目標代碼通常是由一組函數(shù)組成,從而來實現(xiàn)文件系統(tǒng),驅(qū)動程序,或其他內(nèi)核上層功能。
使用模塊的主要優(yōu)點有:
-
首先它保證了一種模塊化的方法
-
其次它實現(xiàn)了一種平臺無關(guān)性
-
接著它可以節(jié)省內(nèi)存使用,當我們不再需要他的時候可以動態(tài)的進行解除,同樣的在我們需要它的時候可以動態(tài)的進行加載
-
最后他無性能損失!
文件系統(tǒng)概述
Base
我們這樣定義文件:
Unix文件是一個以字節(jié)序列組成的信息載體!
內(nèi)核并不負責(zé)解釋自己文件的內(nèi)容!
文件或目錄名由除/和空字符之外的任意ASCII字符序列組成!大多數(shù)文件系統(tǒng)對文件名的長度都會有所限制。(比如說我們的常見的Ext2是255,你不可以把文件名搞得太長?。?/p>
這個可以查看自己的ulimit值
與樹的根相對應(yīng)的目錄被稱為根目錄,按照慣例它的名字是/
在同一目錄中的文件名并不能相同,而在不同目錄中的文件名則可以相同(因為可以通過連接不同的目錄文件名從而唯一的標識這個文件)
Unix的每個進程都有一個工作目錄(pwd,想你的shell怎么區(qū)分你當前在文件系統(tǒng)海洋的何處!)
當標識文件名時引用符號.
和..
:它們分別標識當前工作目錄,和父目錄。如果當前工作目錄是根目錄,那么這兩個目錄就是完全一致的!
硬鏈接和軟鏈接
包含在文件目錄的文件名就是一個文件的硬鏈接,或者簡稱鏈接。
在同一目錄或不同的目錄中同一個文件可以有好幾個鏈接!因此對應(yīng)幾個文件名。
他有兩方面的限制:首先他不允許用戶給目錄創(chuàng)建硬鏈接,因為這可能會把目錄樹變?yōu)榄h(huán)形圖,從而就不可能通過名字來定位一個文件!
其次只有在同一文件系統(tǒng)中的文件才能創(chuàng)建鏈接!這帶來比較大的限制!因為現(xiàn)在操作系統(tǒng)可能包含了多種文件系統(tǒng)!這些文件系統(tǒng)位于不同的磁盤和根目錄或分區(qū),用戶也許無法知道它們的物理劃分!
為了克服這些限制則引入了軟鏈接,或者是符號鏈接。符號鏈接是短文件這些文件包含了另一個文件的任意路徑名。路徑名可以指向位于任意一個操作系統(tǒng)文件系統(tǒng)的任意文件或目錄,甚至可以指向一個根本不存在的文件!
Unix文件類型
Unix文件類型可以是以下列的一種:
-
普通文件
-
目錄
-
符號鏈接
-
面向塊的設(shè)備文件
-
面向字符的設(shè)備文件
-
管道
-
命名管道
-
套接字
前三種文件類型是所有Unix文件系統(tǒng)的基本類型
文件描述符與索引節(jié)點
Unix對文件的內(nèi)容和描述文件的信息給出了清楚的區(qū)分!除了設(shè)備文件和特殊文件系統(tǒng)外,每個文件都由字符序列組成!文件內(nèi)容不包含任何克控制信息!如文件長度或者文件結(jié)束符。
我們使用索引節(jié)點在內(nèi)核中表示文件,從而代表一大塊文件數(shù)據(jù)進行管理!
文件也有訪問權(quán)限和文件模式:文件的潛在用戶有三種
-
作為文件所有者的
-
用戶同組用戶但是不包括所有者
-
所有剩下的用戶
文件有三種訪問類型:讀,寫與執(zhí)行!
文件操作的系統(tǒng)調(diào)用
有open, read, write, close等,這里我們暫時不加討論?。梢詤⒖糒inux系統(tǒng)編程手冊學(xué)習(xí)?。?/p>
Unix內(nèi)核簡述
我們下面重點來討論Unix內(nèi)核,首先我們要說的是進程/內(nèi)核模式:
如前所述CPU既可以運行在用戶態(tài),也可以運行在內(nèi)核態(tài)。當一個程序在用戶態(tài)下執(zhí)行的時候,它并不能直接訪問內(nèi)核的數(shù)據(jù)結(jié)構(gòu)和程序,然而當應(yīng)用程序在內(nèi)核態(tài)下運行時則不再會有這些限制。當應(yīng)用程序有所請求內(nèi)核服務(wù)時,內(nèi)核才會把這個進程流陷入內(nèi)核態(tài)。當完成任務(wù)時把進程送回用戶態(tài)。進程是動態(tài)的實體,在系統(tǒng)內(nèi)通常只有有限的生存期。創(chuàng)建,撤銷,同步現(xiàn)有進程的任務(wù)都要委托給內(nèi)核中的一組例程來完成!
內(nèi)核本身不是一個進程,而是進程的管理者。除用戶進程之外:Unix系統(tǒng)還包括幾個所謂的內(nèi)核進程的特權(quán)進程。它們具有以下特點:
-
它們以內(nèi)核態(tài)運行在內(nèi)核地址空間
-
他們不與用戶直接交互,因此不需要終端設(shè)備!
-
他們通常在系統(tǒng)啟動時創(chuàng)建然后一直處于活躍狀態(tài)直到系統(tǒng)關(guān)閉
進程的實現(xiàn)
為了讓內(nèi)核管理進程所有的進程都需要用一個進程描述符進行抽象。當內(nèi)核暫停一個進程的時候,就會把幾個相關(guān)處理器寄存器的內(nèi)容保存在進程描述符里,包括:
-
程序計數(shù)器和棧指針寄存器
-
通用寄存器
-
浮點寄存器
-
包括CPU狀態(tài)信息的處理器控制器
-
用來跟蹤進程對RAM訪問的內(nèi)存管理寄存器
當內(nèi)核決定恢復(fù)一個進程的時候,他用進程描述符中合適的字段來裝載CPU寄存器。因為程序計數(shù)器中所存的值指向下一條將要執(zhí)行的指令,所以進程恐怕停止的地方恢復(fù)執(zhí)行!
可重入內(nèi)核
所有的Unix內(nèi)核都是可重入的!
這意味著若干個進程可以同時在內(nèi)核態(tài)下執(zhí)行,當然在單處理器系統(tǒng)上只有一個進程在真正的執(zhí)行!但是有許多進程可能在等待CPU或者某一個IO操作完成時在內(nèi)核臺下被阻塞!
提供可重入的一種方式就是編寫函數(shù),以便這些函數(shù)只能更改局部變量,而不更改全局數(shù)據(jù)結(jié)構(gòu)。這樣的函數(shù)叫做可重入函數(shù)!
如果一個硬件中斷發(fā)生,可重入內(nèi)核可以掛起正在執(zhí)行的進程,即使這個進程處于內(nèi)核態(tài)
在最簡單的情況下CPU從第一條指令到最后一條指令順序的執(zhí)行內(nèi)核控制路徑。也就是表示內(nèi)核處理系統(tǒng)調(diào)用異?;蛑袛嗨鶊?zhí)行的指令序列
然而當下述事情發(fā)生之一,CPU交錯執(zhí)行內(nèi)核控制路徑:
-
運行在用戶態(tài)下的進程調(diào)用了一個系統(tǒng)調(diào)用,而相應(yīng)的內(nèi)核控制路徑。正是這個請求沒有辦法立即得到滿足,然后內(nèi)核控制路徑調(diào)用調(diào)度程序選擇一個新的進程。進行調(diào)度完成后,進程切換。發(fā)生第一個內(nèi)核控制路徑還沒有完成,而CPU又重新執(zhí)行其他的內(nèi)核控制路徑。在這種情況下,兩條控制路徑代表兩個不同的進程。
-
在執(zhí)行當執(zhí)行一個內(nèi)核控制路徑時,CPU檢測到了一個異常:比如說訪問了一個不在RAM中的頁,那么第一個控制路徑將會被掛起,而CPU開始執(zhí)行合適的過程。比如說在這個例子中我們則是給那進程分配一個新頁,并從磁盤中讀取它的內(nèi)容。當這個過程結(jié)束后第一個控制路徑可以恢復(fù)執(zhí)行,在這種情況下兩個控制路徑代表同一個進程在執(zhí)行
-
當CPU在運行一個啟用了中斷的內(nèi)核控制路徑時,一個硬件中斷發(fā)生。一個控制路徑還沒執(zhí)行完,CPU馬上開始執(zhí)行另一個內(nèi)核控制路徑來處理這個中斷。當這個中斷處理程序終止時,第一個內(nèi)核控制路徑恢復(fù)。在這個情況下兩條內(nèi)核控制路徑運行是同一進程的可執(zhí)行上下文。所花費的系統(tǒng)CPU時間都算給了這個進程。然而中斷處理程序無需代表這個進程運行
-
在支持搶占式調(diào)度的內(nèi)核中,CPU正在運行。但是被一個更加高級的進程加入就緒隊列。中斷發(fā)生,調(diào)度開始。第一個內(nèi)核控制路徑并沒有執(zhí)行完。CPU代表高優(yōu)先級進程又開始了另一個內(nèi)核控制路徑,只有把內(nèi)核編譯成支持搶占式調(diào)度后才有可能會出現(xiàn)這種情況?。惴判?,咱們就是這個hhh)
進程地址空間
每個進程運行在它的私有地址空間!在用戶態(tài)下運行的進程涉及到私有棧,數(shù)據(jù)區(qū)和代碼區(qū)。
當在內(nèi)核態(tài)運行時,進程訪問內(nèi)核的數(shù)據(jù)區(qū),代碼區(qū)。但是使用的是另外的私有棧。盡管看起來每個進程都在訪問他們自己的私有棧,但是為了更好的進程間通信,有時進程之間也會共享部分地址空間!
Linux支持映射內(nèi)存(mmap)系統(tǒng)調(diào)用,該系統(tǒng)調(diào)用將允許存放在塊設(shè)備上的文件或信息映射到進程的部分地址空間。這為正常的讀寫傳送數(shù)據(jù)方式提供了另一種選擇
同步和臨界區(qū)
實現(xiàn)可重入的內(nèi)核需要利用同步機制,如果內(nèi)核控制路徑對某個內(nèi)核數(shù)據(jù)結(jié)構(gòu)進行操作被掛起時,那么其他內(nèi)核控制路徑就不應(yīng)該對這個數(shù)據(jù)結(jié)構(gòu)進行操作,否則會破壞一致性狀態(tài)!
如何同步內(nèi)核控制路徑呢最徹底的辦法就是使用非搶占式的內(nèi)核(Weird huh?
),其次就是禁止中斷,再就是使用信號量自旋鎖等內(nèi)核機制來防止競爭條件!
在我們使用防止競爭條件的內(nèi)核上鎖機制時,需要避免死鎖情況!在這里不予詳細討論!
信號與進程之間的通信
Unix信號提供了一種把系統(tǒng)事件報告給進程的一種機制。
有兩種系統(tǒng)事件:
-
異步通告
-
同步錯誤或異常
如果進程并沒有指定如何處理信號時,內(nèi)核會按照信號的編號進行默認操作。有可能有以下五種默認操作:
終止進程
將執(zhí)行上下文和進程地址空間的內(nèi)容寫入一個文件,并且終止進程
忽略信號
掛起進程
如果進程曾被暫停,則恢復(fù)它
進程管理
Unix在進程和它正在執(zhí)行的程序之間做出了清晰的劃分!fork和_exit這兩個系統(tǒng)調(diào)用分別用來創(chuàng)建一個進程和終止,與exec類系統(tǒng)調(diào)用則是裝入一個全新的程序!以及還有僵死進程。如果父進程丟失了跟蹤子進程的情況,那么這個子進程就認為僵尸進程。內(nèi)核會檢查子進程是否終止。引入僵死進程的特殊狀態(tài)是為了表示終止的進程。很多內(nèi)核也實現(xiàn)了waitpid系統(tǒng)調(diào)用,讓父進程可以顯示的等待一個特殊的子進程。對于那些已經(jīng)成為僵尸進程的進程,他們將會被一個以init的特殊系統(tǒng)進程收養(yǎng)進行清除!
內(nèi)存管理
虛擬內(nèi)存
所有新進的Unix系統(tǒng)都提供了一種有用的抽象:叫做虛擬內(nèi)存!
它作為一種邏輯層處于應(yīng)用程序的內(nèi)在請求與硬件內(nèi)存單元管理單元之間。虛擬內(nèi)存有很多用途與優(yōu)點,它可以讓
-
若干進程并發(fā)執(zhí)行
-
應(yīng)用程序所需內(nèi)存大于可用物理內(nèi)存時也可以運行
-
程序集有部分代碼裝入內(nèi)存時進程可以執(zhí)行
-
允許每個進程訪問可用物理內(nèi)存的子集進程
-
可以共享庫數(shù)據(jù)或程序或函數(shù)等一個單獨內(nèi)存映像
-
程序是可定位的!也就是說我們可以把程序放在物理內(nèi)存中的任何地方
-
程序員可以編寫與機器無關(guān)的代碼!因為他們根本不需要關(guān)心物理內(nèi)存的組織結(jié)構(gòu),也就是說他把物理內(nèi)存進行了一層抽象
虛擬內(nèi)存子系統(tǒng)的主要成分是虛擬地址空間進程所用的一組內(nèi)存地址。不同于物理內(nèi)存地址!
隨機訪問存儲器的使用
隨機訪問存儲器的使用分為兩個部分:
一部分被專門用來存放內(nèi)核映像,另一部分則由虛擬內(nèi)存系統(tǒng)來進行處理:
-
用來滿足內(nèi)核對緩沖區(qū)描述服務(wù)及其它動態(tài)內(nèi)核數(shù)據(jù)結(jié)構(gòu)的請求
-
滿足進程對一般性內(nèi)存區(qū)的請求即對文件內(nèi)存映射的請求
-
借助于高速緩存從磁盤或者其他緩沖設(shè)備獲得較好的性能內(nèi)存
內(nèi)核分配器
它是一個子系統(tǒng),試圖滿足系統(tǒng)中所有部分對內(nèi)存的請求!其中一些請求可能來自內(nèi)核其他子系統(tǒng)。他們需要一些內(nèi)核使用的內(nèi)存,還有一些請求則是來自用戶程序的系統(tǒng)調(diào)用,以用來增加用戶程序進程的地址空間!
一個好的內(nèi)核內(nèi)存分配器需要具有以下特點:
它必須快,實際上這是最重要的屬性!因為它為所有的內(nèi)核子系統(tǒng)所調(diào)用
必須把內(nèi)存的浪費減到最少
必須努力減輕內(nèi)存的碎片問題
必須能與其他內(nèi)存管理子系統(tǒng)進行合作,以便借用和釋放頁框
現(xiàn)在已經(jīng)提出了好幾種內(nèi)核內(nèi)存分配器進程!這個可以查詢其他資料!
進程的虛擬地址空間處理
進程的虛擬地址空間包括了進程可以引用的所有虛擬內(nèi)存地址,內(nèi)核通常用一組內(nèi)存區(qū)描述符描述進程!虛擬地址空間內(nèi)核分配給進程的虛擬地址空間主要有以下這幾個部分:
-
組成程序的可執(zhí)行代碼
-
程序的初始化和未初始化的數(shù)據(jù)
-
初始程序棧
-
所需共享庫的可執(zhí)行代碼和數(shù)據(jù)
-
堆文章來源:http://www.zghlxwxcb.cn/news/detail-860779.html
高速緩存
物理內(nèi)存的一大優(yōu)勢就是用來磁盤和其它塊設(shè)備的高速緩存!因為磁盤訪問非常的慢,這與訪問內(nèi)存相比實在太長!因此磁盤通常是影響系統(tǒng)性能的一大瓶頸所在,最早的Unix系統(tǒng)中早就已經(jīng)實現(xiàn)了一個策略就是對推遲寫磁盤的時間,我們將在后續(xù)的實現(xiàn)中看看Linux是如何做到的!文章來源地址http://www.zghlxwxcb.cn/news/detail-860779.html
到了這里,關(guān)于Linux 內(nèi)核深入理解 - 緒論的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!