作為現(xiàn)代操作系統(tǒng)的代表之一,Linux操作系統(tǒng)非常復(fù)雜,內(nèi)部有多得令人眼花繚亂的各種組件在同步運(yùn)行和相互通信。對于初學(xué)者來說,我認(rèn)為理解操作系統(tǒng)工作原理最好的方法是利用抽象的思維去理解,也就是說,你可以暫時(shí)忽略大部分細(xì)節(jié)。就像坐車一樣,通常你不會去在意車內(nèi)固定發(fā)動機(jī)的裝配螺栓,也不會關(guān)心你走的路是誰修筑的。如果你是一名乘客,可能只會關(guān)心如何打開或關(guān)閉車門、如何系好安全帶以及車要把你帶到哪兒去。如果你是一名司機(jī),就需要了解更多的細(xì)節(jié),比如如何控制油門、剎車和換擋,以及如何處理意外情況。如果你是一名維修工程師或汽車設(shè)計(jì)師,則需要更深入地了解汽車構(gòu)造及其工作原理了。
我們試一下運(yùn)用“抽象思維”來理解開車這件事情,首先我們可以將“一輛汽車在路上行駛”抽象為三個(gè)部分:汽車、道路和駕駛操作。這樣一來,開車這件事情就簡單多了,我們幾乎只需要知道駕駛操作即可。如果道路顛簸,也不會去埋怨汽車本身和自己的駕駛技術(shù),反而我們會問這條路為什么這么爛,而我們是不是一定要走這條路。同樣,在軟件開發(fā)過程中,開發(fā)人員通常不用太關(guān)心他們需要使用的組件的內(nèi)部結(jié)構(gòu),他們只關(guān)心能使用哪些組件,以及這些組件該怎么用。跟汽車零部件一樣,每一個(gè)組件都可能包含著復(fù)雜的技術(shù)細(xì)節(jié),但我們可以暫時(shí)忽略這些細(xì)節(jié),而專注于這些組件在系統(tǒng)中發(fā)揮的功能。實(shí)際上,抽象思維形成的這種“分層思想”無論在計(jì)算機(jī)技術(shù)還是其他社會生產(chǎn)活動中都是適用的。
Linux操作系統(tǒng)的層次
下面我們來看一下,通過抽象可以將系統(tǒng)分解為哪些組件,以及這些組件在用戶和硬件系統(tǒng)之間所處的位置。
簡單來說,Linux操作系統(tǒng)可以大體分為三層,如下圖所示,最底層是硬件系統(tǒng),包括CPU、內(nèi)存、硬盤、網(wǎng)卡等;硬件系統(tǒng)之上是內(nèi)核,這是操作系統(tǒng)的核心,內(nèi)核負(fù)責(zé)管理硬件系統(tǒng),同時(shí)為應(yīng)用程序提供操作接口;用戶進(jìn)程在這里表示計(jì)算機(jī)中運(yùn)行的所有程序,它們運(yùn)行于用戶空間,由內(nèi)核統(tǒng)一管理。
內(nèi)核和用戶進(jìn)程之間最大的區(qū)別在于:內(nèi)核運(yùn)行于內(nèi)核模式(kernel mode,也稱內(nèi)核態(tài)),用戶進(jìn)程運(yùn)行于用戶模式(user mode,也稱用戶態(tài))。在內(nèi)核模式中運(yùn)行的代碼可以不受限制地訪問中央處理器和內(nèi)存,也就是說內(nèi)核可以為所欲為,那這就非常危險(xiǎn)了,因?yàn)閮?nèi)核進(jìn)程可以輕而易舉地使整個(gè)系統(tǒng)崩潰。所以為了提高系統(tǒng)穩(wěn)定性,限制進(jìn)程對中央處理器和內(nèi)存的訪問權(quán)限,提出了用戶模式的概念。
一般我們將只有內(nèi)核可以訪問的空間稱為內(nèi)核空間,而將用戶進(jìn)程能夠訪問的空間稱為用戶空間。通過這種限制,即使某個(gè)用戶進(jìn)程運(yùn)行時(shí)崩潰了,也不會對整個(gè)系統(tǒng)造成嚴(yán)重的影響。
內(nèi)核模式和用戶模式
實(shí)際上,內(nèi)核模式和用戶模式是需要處理器支持的。內(nèi)核程序和用戶程序的本質(zhì)區(qū)別在于:除了可以執(zhí)行大部分通用指令,內(nèi)核程序還可以執(zhí)行特權(quán)指令。說到計(jì)算機(jī)指令,就不得不提到RISC(Reduced Instruction Set Computer,精簡指令集)和CISC(Complex Instruction Set Computer,復(fù)雜指令集),我們知道Intel的x86架構(gòu)芯片采用的是CISC,而ARM架構(gòu)芯片則采用RISC。也就是說,內(nèi)核模式和用戶模式之間的切換以及模式的實(shí)現(xiàn)依托于CPU指令集架構(gòu)。
Intel的x86處理器通過Ring級別來進(jìn)行訪問控制,共分為4個(gè)級別,即Ring0~Ring3。Ring0層擁有的權(quán)限最高,Ring3層擁有的權(quán)限最低。按照Intel原來的設(shè)想,應(yīng)用程序工作在Ring3層,只能訪問Ring3層的空間;操作系統(tǒng)工作在Ring0層,可以訪問所有層的空間;而其他驅(qū)動程序工作與Ring1和Ring2層,每一層只能訪問本層和權(quán)限更低層的數(shù)據(jù)。這種設(shè)計(jì)可以有效保障操作系統(tǒng)的穩(wěn)定性和安全性。但是現(xiàn)代操作系統(tǒng),包括Windows和Linux都沒有采用4層權(quán)限,只使用了Ring0和Ring3層,對應(yīng)于內(nèi)核空間和用戶空間。因此,驅(qū)動一旦加載,就運(yùn)行在Ring0層,擁有與操作系統(tǒng)內(nèi)核一樣的權(quán)限。
和x86架構(gòu)不同,ARM沒有Ring0~Ring3,也不存在Root模式和非Root模式。眾所周知,ARM有7種工作模式,即usr(用戶模式,User)、fiq(快速中斷模式,F(xiàn)IQ)、irq(外部中斷模式,IRQ)、svc(管理模式,Supervisor)、abt(數(shù)據(jù)訪問中止模式,Abort)、und(未定義指令中止模式,Undef)和sys(系統(tǒng)模式,System)。除了用戶模式以外的其他6種處理器模式都稱為特權(quán)模式(Privileged Modes)。在特權(quán)模式下,程序可以訪問所有的系統(tǒng)資源,也可以任意地進(jìn)行處理器模式切換。
除此之外,還有在ARM v6中引入的Security Extensions帶來的Monitor模式,以及在ARM v7中引入的Virtualization Extensions帶來的Hyp模式。對于ARM v8架構(gòu)則更為復(fù)雜一些,它定義了兩種執(zhí)行狀態(tài)(Execution State),分別是AArch32狀態(tài)和 AArch64狀態(tài)。同時(shí)定義了4個(gè)異常等級(Exception Level)來進(jìn)行權(quán)限控制,分別是EL0~EL3。對于AArch32,ARMv8定義了9種PE模式(也就是上面提到的9種工作模式)來確定執(zhí)行權(quán)限,而不使用EL;而對于AArch64,則不支持PE模式。(更多關(guān)于處理器架構(gòu)的信息,請查閱相關(guān)手冊)。
內(nèi)存的作用
除了CPU,內(nèi)存可以說是是硬件系統(tǒng)中最為重要的部分。內(nèi)存中存儲的是0或1這樣的比特?cái)?shù)據(jù),內(nèi)核和進(jìn)程也都是運(yùn)行在內(nèi)存里面的,它們在內(nèi)存中就是一系列的比特?cái)?shù)據(jù)集合,所有外圍設(shè)備的數(shù)據(jù)輸入和輸出都通過內(nèi)存完成。而CPU就像一個(gè)操作員一樣處理內(nèi)存中的數(shù)據(jù),它從內(nèi)存讀取指令和數(shù)據(jù),然后將運(yùn)算結(jié)果寫回內(nèi)存。Linux內(nèi)核幾乎所有的操作都和內(nèi)存有關(guān),例如:將內(nèi)存劃分為很多區(qū)塊,并且一直維護(hù)著這些區(qū)塊的狀態(tài)信息;每一個(gè)進(jìn)程擁有自己的內(nèi)存區(qū)塊,并且由內(nèi)核保證每個(gè)進(jìn)程只使用它自己的內(nèi)存區(qū)塊。
Linux內(nèi)核
Linux內(nèi)核采用的是整體式結(jié)構(gòu)(Monolithic),整個(gè)內(nèi)核是一個(gè)單獨(dú)的、非常大的程序,這樣雖然能夠使系統(tǒng)的各個(gè)部分直接溝通,提高系統(tǒng)相應(yīng)速度,但與嵌入式系統(tǒng)存儲容量小、資源有限的特點(diǎn)不相符合。因此,在嵌入式系統(tǒng)中經(jīng)常采用的是另一種稱為微內(nèi)核(Microkernel)的體系結(jié)構(gòu),即內(nèi)核本身只提供一些最基本的操作系統(tǒng)功能,如任務(wù)調(diào)度、內(nèi)存管理、中斷處理等,而類似于文件系統(tǒng)和網(wǎng)絡(luò)協(xié)議等附加功能則運(yùn)行在用戶空間中,并且可以根據(jù)實(shí)際需要進(jìn)行取舍。這樣可以大大減小內(nèi)核的體積,便于維護(hù)和移植。
對于Linux這樣一個(gè)宏內(nèi)核操作系統(tǒng)來說,一個(gè)完整的Linux內(nèi)核主要由五個(gè)子系統(tǒng)組成:進(jìn)程調(diào)度,內(nèi)存管理,虛擬文件系統(tǒng),網(wǎng)絡(luò)接口,進(jìn)程間通信。
·進(jìn)程調(diào)度(SCHED)控制進(jìn)程對CPU的訪問。當(dāng)需要選擇下一個(gè)進(jìn)程運(yùn)行時(shí),由調(diào)度程序選擇最值得運(yùn)行的進(jìn)程。可運(yùn)行進(jìn)程實(shí)際上是僅等待CPU資源的進(jìn)程,如果某個(gè)進(jìn)程在等待其它資源,則該進(jìn)程是不可運(yùn)行進(jìn)程。Linux使用了比較簡單的基于優(yōu)先級的進(jìn)程調(diào)度算法選擇新的進(jìn)程。
·內(nèi)存管理(MM)允許多個(gè)進(jìn)程安全的共享主內(nèi)存區(qū)域。Linux 的內(nèi)存管理支持虛擬內(nèi)存,即在計(jì)算機(jī)中運(yùn)行的程序,其代碼,數(shù)據(jù),堆棧的總量可以超過實(shí)際內(nèi)存的大小,操作系統(tǒng)只是把當(dāng)前使用的程序塊保留在內(nèi)存中,其余的程序塊則保留在磁盤中。必要時(shí),操作系統(tǒng)負(fù)責(zé)在磁盤和內(nèi)存間交換程序塊。內(nèi)存管理從邏輯上分為硬件無關(guān)部分和硬件有關(guān)部分。硬件無關(guān)部分提供了進(jìn)程的映射和邏輯內(nèi)存的對換;硬件相關(guān)的部分為內(nèi)存管理硬件提供了虛擬接口。
·虛擬文件系統(tǒng)(Virtual File System,VFS)隱藏了各種硬件的具體細(xì)節(jié),為所有的設(shè)備提供了統(tǒng)一的接口,VFS提供了多達(dá)數(shù)十種不同的文件系統(tǒng)。虛擬文件系統(tǒng)可以分為邏輯文件系統(tǒng)和設(shè)備驅(qū)動程序。邏輯文件系統(tǒng)指Linux所支持的文件系統(tǒng),如ext2,fat等,設(shè)備驅(qū)動程序指為每一種硬件控制器所編寫的設(shè)備驅(qū)動程序模塊。
·網(wǎng)絡(luò)接口(NET)提供了對各種網(wǎng)絡(luò)標(biāo)準(zhǔn)的存取和各種網(wǎng)絡(luò)硬件的支持。網(wǎng)絡(luò)接口可分為網(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)驅(qū)動程序。網(wǎng)絡(luò)協(xié)議部分負(fù)責(zé)實(shí)現(xiàn)每一種可能的網(wǎng)絡(luò)傳輸協(xié)議。網(wǎng)絡(luò)設(shè)備驅(qū)動程序負(fù)責(zé)與硬件設(shè)備通訊,每一種可能的硬件設(shè)備都有相應(yīng)的設(shè)備驅(qū)動程序。
·進(jìn)程間通訊(IPC)支持進(jìn)程間各種通信機(jī)制。進(jìn)程間通信主要用于控制不同進(jìn)程之間在用戶空間的同步、數(shù)據(jù)共享和交換。由于不用的用戶進(jìn)程擁有不同的進(jìn)程空間,因此進(jìn)程間的通信要借助于內(nèi)核的中轉(zhuǎn)來實(shí)現(xiàn)。一般情況下,當(dāng)一個(gè)進(jìn)程等待硬件操作完成時(shí),會被掛起;當(dāng)硬件操作完成,進(jìn)程被恢復(fù)執(zhí)行,而協(xié)調(diào)這個(gè)過程的就是進(jìn)程間的通信機(jī)制。
Linux內(nèi)核子系統(tǒng)的結(jié)構(gòu)如下圖所示,處于中心位置的進(jìn)程調(diào)度,所有其它的子系統(tǒng)都依賴它,因?yàn)槊總€(gè)子系統(tǒng)都需要掛起或恢復(fù)進(jìn)程。一般情況下,當(dāng)一個(gè)進(jìn)程等待硬件操作完成時(shí),它被掛起;當(dāng)操作真正完成時(shí),進(jìn)程被恢復(fù)執(zhí)行。例如,當(dāng)一個(gè)進(jìn)程通過網(wǎng)絡(luò)發(fā)送一條消息時(shí),網(wǎng)絡(luò)接口需要掛起發(fā)送進(jìn)程,直到硬件成功成功地完成消息的發(fā)送,當(dāng)消息被成功的發(fā)送出去以后,網(wǎng)絡(luò)接口給進(jìn)程返回一個(gè)代碼,表示操作的成功或失敗。其他子系統(tǒng)以相似的理由依賴于進(jìn)程調(diào)度。
各個(gè)子系統(tǒng)之間的依賴關(guān)系如下:進(jìn)程調(diào)度與內(nèi)存管理之間的關(guān)系:這兩個(gè)子系統(tǒng)互相依賴。在多道程序環(huán)境下,程序要運(yùn)行必須為之創(chuàng)建進(jìn)程,而創(chuàng)建進(jìn)程的第一件事情,就是將程序和數(shù)據(jù)裝入內(nèi)存。
進(jìn)程間通信與內(nèi)存管理的關(guān)系:進(jìn)程間通信子系統(tǒng)要依賴內(nèi)存管理支持共享內(nèi)存通信機(jī)制,這種機(jī)制允許兩個(gè)進(jìn)程除了擁有自己的私有空間,還可以存取共同的內(nèi)存區(qū)域。
虛擬文件系統(tǒng)與網(wǎng)絡(luò)接口之間的關(guān)系:虛擬文件系統(tǒng)利用網(wǎng)絡(luò)接口支持網(wǎng)絡(luò)文件系統(tǒng)(NFS),也利用內(nèi)存管理支持RAMDISK設(shè)備。
內(nèi)存管理與虛擬文件系統(tǒng)之間的關(guān)系:內(nèi)存管理利用虛擬文件系統(tǒng)支持交換,交換進(jìn)程(swapd)定期由調(diào)度程序調(diào)度,這也是內(nèi)存管理依賴于進(jìn)程調(diào)度的唯一原因。當(dāng)一個(gè)進(jìn)程存取的內(nèi)存映射被換出時(shí),內(nèi)存管理向文件系統(tǒng)發(fā)出請求,同時(shí),掛起當(dāng)前正在運(yùn)行的進(jìn)程。
除了這些依賴關(guān)系外,內(nèi)核中的所有子系統(tǒng)還要依賴于一些共同的資源。這些資源包括所有子系統(tǒng)都用到的過程。例如:分配和釋放內(nèi)存空間的過程,打印警告或錯(cuò)誤信息的過程,還有系統(tǒng)的調(diào)試?yán)痰鹊取?/p>
內(nèi)核管理的四個(gè)方面
Linux內(nèi)核負(fù)責(zé)管理以下四個(gè)方面:
·進(jìn)程:內(nèi)核決定哪個(gè)進(jìn)程可以使用CPU。
·內(nèi)存:內(nèi)核管理所有的內(nèi)存,為進(jìn)程分配內(nèi)存,管理進(jìn)程間的共享內(nèi)存以及空閑內(nèi)存。
·設(shè)備驅(qū)動程序:作為硬件系統(tǒng)(如磁盤)和進(jìn)程之間的接口,內(nèi)核負(fù)責(zé)操控硬件設(shè)備。
·系統(tǒng)調(diào)用和支持:進(jìn)程通常使用系統(tǒng)調(diào)用和內(nèi)核進(jìn)行通信。
進(jìn)程管理
進(jìn)程管理設(shè)計(jì)進(jìn)程的啟動、暫停、恢復(fù)和終止。啟動和終止比較直觀,但是要解釋清楚進(jìn)程在執(zhí)行過程中如何使用CPU則相對復(fù)雜一些。
在現(xiàn)代操作系統(tǒng)中,很多進(jìn)程貌似都是同時(shí)運(yùn)行的。例如,你可以同時(shí)在桌面打開Web瀏覽器和電子表格應(yīng)用程序。然而,雖然它們表面上看是同時(shí)運(yùn)行,但實(shí)際上這些應(yīng)用程序背后的進(jìn)程并不完全是同時(shí)運(yùn)行的。
我們設(shè)想一下,在只有一個(gè)CPU的計(jì)算機(jī)系統(tǒng)中,可能會有很多進(jìn)程可以使用CPU,但是在任何一個(gè)特定的時(shí)間段內(nèi)只能有一個(gè)進(jìn)程可以使用CPU。所以實(shí)際上是多個(gè)進(jìn)程輪流使用CPU,每個(gè)進(jìn)程使用一段時(shí)間后就暫停,然后讓另一個(gè)進(jìn)程使用,依次輪流,時(shí)間單位是毫秒級。一個(gè)進(jìn)程讓出CPU使用權(quán)給另一個(gè)進(jìn)程稱為上下文切換(context switch)。
進(jìn)程在其時(shí)間段內(nèi)有足夠的時(shí)間完成主要的計(jì)算工作(實(shí)際上,進(jìn)程通常在單個(gè)時(shí)間段內(nèi)就能完成它的工作)。由于時(shí)間段非常短,短到我們根本察覺不到,所以在我們看來,系統(tǒng)是在同時(shí)運(yùn)行多個(gè)進(jìn)程(我們稱之為多任務(wù)執(zhí)行)。
內(nèi)核負(fù)責(zé)上下文切換。我們來看看下面的場景,以便理解它的工作原理。
(1)CPU為每個(gè)進(jìn)程計(jì)時(shí),到時(shí)即停止進(jìn)程,并切換至內(nèi)核模式,由內(nèi)核接管CPU控制權(quán)。(2)內(nèi)核記錄下當(dāng)前CPU和內(nèi)存的狀態(tài)信息,這些信息在恢復(fù)被停止的進(jìn)程時(shí)需要用到。(3)內(nèi)核執(zhí)行上一個(gè)時(shí)間段內(nèi)的任務(wù)(如從輸入輸出設(shè)備獲得數(shù)據(jù),磁盤讀寫操作等)。(4)內(nèi)核準(zhǔn)備執(zhí)行下一個(gè)進(jìn)程,從準(zhǔn)備就緒的進(jìn)程中選擇一個(gè)執(zhí)行。(5)內(nèi)核為新進(jìn)程準(zhǔn)備CPU和內(nèi)存。(6)內(nèi)核將新進(jìn)程執(zhí)行的時(shí)間段通知CPU。(7)內(nèi)核將CPU切換至用戶模式,將CPU控制權(quán)交給新進(jìn)程。
上下文切換回答了一個(gè)十分重要的問題,即內(nèi)核是在什么時(shí)候運(yùn)行的。答案就是:內(nèi)核是在上下文切換時(shí)的時(shí)間段間隙中運(yùn)行的。
在多CPU系統(tǒng)中,情況要稍微復(fù)雜一些。如果新進(jìn)程將在另一個(gè)CPU上運(yùn)行,內(nèi)核就不需要讓出當(dāng)前CPU的使用權(quán)。不過為了將所有CPU的使用效率最大化,內(nèi)核會使用一些其他的方式來獲取CPU控制權(quán)。
內(nèi)存管理
內(nèi)核在上下文切換過程中管理內(nèi)存,這是一項(xiàng)十分復(fù)雜的工作,因?yàn)閮?nèi)核要保證以下所有條件:
(1)內(nèi)核需要自己的專有內(nèi)存空間,其他的用戶進(jìn)程無法訪問;(2)每個(gè)用戶進(jìn)程有自己的專有內(nèi)存空間;(3)一個(gè)進(jìn)程不能訪問另一個(gè)進(jìn)程的專有內(nèi)存空間;(4)用戶進(jìn)程之間可以共享內(nèi)存;(5)用戶進(jìn)程的某些內(nèi)存空間可以是只讀的;(6)通過使用磁盤交換,系統(tǒng)可以使用比實(shí)際內(nèi)存容量更多的內(nèi)存空間。
新型的CPU提供MMU(Memory Management Unit,內(nèi)存管理單元),MMU使用了一種叫作虛擬內(nèi)存的內(nèi)存訪問機(jī)制,即進(jìn)程不是直接訪問內(nèi)存的實(shí)際物理地址,而是通過內(nèi)核使得進(jìn)程看起來可以使用整個(gè)系統(tǒng)的內(nèi)存。當(dāng)進(jìn)程訪問內(nèi)存的時(shí)候,MMU截獲訪問請求,然后通過內(nèi)存映射表(或稱為內(nèi)存頁面表,page table)將要訪問的內(nèi)存地址轉(zhuǎn)換為實(shí)際的物理地址。內(nèi)核需要初始化、維護(hù)和更新這個(gè)地址映射表。例如,在上下文切換時(shí),內(nèi)核將內(nèi)存映射表從被移出進(jìn)程轉(zhuǎn)給被移入進(jìn)程使用。
設(shè)備驅(qū)動程序和設(shè)備管理
對于設(shè)備來說,內(nèi)核的角色比較簡單。通常設(shè)備只能在內(nèi)核模式中被訪問(例如用戶進(jìn)程請求內(nèi)核關(guān)閉系統(tǒng)電源),因?yàn)樵O(shè)備訪問不當(dāng)有可能會讓系統(tǒng)崩潰。另一個(gè)原因是不同設(shè)備之間沒有一個(gè)統(tǒng)一的編程接口,即使同類設(shè)備也是如此(比如兩個(gè)不同的網(wǎng)卡)。所以設(shè)備驅(qū)動程序傳統(tǒng)意義上來說是內(nèi)核的一部分,它們盡可能為用戶進(jìn)程提供統(tǒng)一的接口,以簡化開發(fā)人員的工作。
系統(tǒng)調(diào)用和系統(tǒng)支持
內(nèi)核還對用戶進(jìn)程提供其他功能。例如,系統(tǒng)調(diào)用(system call或syscall)為進(jìn)程執(zhí)行一些它們不擅長或無法完成的工作。打開、讀取和寫文件這些操作都涉及系統(tǒng)調(diào)用。
fork()和exec()這兩個(gè)系統(tǒng)調(diào)用對于我們了解進(jìn)程如何啟動很重要。
(1)fork():當(dāng)進(jìn)程調(diào)用fork()時(shí),內(nèi)核創(chuàng)建一個(gè)和該進(jìn)程幾乎一模一樣的副本。(2)exec():當(dāng)進(jìn)程調(diào)用exec(program)時(shí),內(nèi)核啟動program來替換當(dāng)前的進(jìn)程。
除了init以外,Linux中的所有用戶進(jìn)程都是通過fork()來啟動的。除了創(chuàng)建現(xiàn)有進(jìn)程的副本以外,大多數(shù)情況下你還可以使用exec()來啟動新的進(jìn)程。一個(gè)簡單的例子是你在命令行運(yùn)行l(wèi)s命令來顯示目錄內(nèi)容。當(dāng)你在終端窗口中輸入ls時(shí),終端窗口中的shell調(diào)用fork()創(chuàng)建一個(gè)shell的副本,然后該副本調(diào)用exec(ls)來運(yùn)行l(wèi)s。
除了傳統(tǒng)的系統(tǒng)調(diào)用,內(nèi)核還為用戶進(jìn)程提供其他很多功能,最為常見的是虛擬設(shè)備。虛擬設(shè)備對于用戶進(jìn)程而言是物理設(shè)備,但其實(shí)它們都是通過軟件實(shí)現(xiàn)的。因此從技術(shù)角度來說,它們并不需要存在于內(nèi)核中,但是實(shí)際上它們很多都存在于內(nèi)核中。例如:內(nèi)核的隨機(jī)數(shù)生成器(/dev/random)這樣的虛擬設(shè)備,如果由用戶進(jìn)程來實(shí)現(xiàn),難度要大很多。
用戶空間
前面提到過,內(nèi)核分配給用戶進(jìn)程的內(nèi)存我們稱之為用戶空間。因?yàn)橐粋€(gè)進(jìn)程簡單來說就是內(nèi)存中的一個(gè)狀態(tài)。(用戶空間也可以指所有用戶進(jìn)程占用的所有內(nèi)存)
Linux中大部分的操作都發(fā)生在用戶空間中。雖然從內(nèi)核的角度來說所有進(jìn)程都是一樣的,但是實(shí)際上它們執(zhí)行的是不同的任務(wù)。相對于系統(tǒng)組件,用戶進(jìn)程位于一個(gè)基礎(chǔ)服務(wù)層中。底層的基礎(chǔ)服務(wù)層中提供了上層應(yīng)用程序所需的工具服務(wù)(也稱為中間件),比如郵件、打印和數(shù)據(jù)庫服務(wù)。頂層組件則可專注于完成用戶交互和復(fù)雜的功能。當(dāng)然,組件之間也是可以相互調(diào)用的。
雖然這里提到底層、頂層、中間層等概念,但實(shí)際上它們在用戶空間里并沒有明顯的界限。其實(shí)很多用戶空間的組件也比較難分類,比如Web服務(wù)器和數(shù)據(jù)庫,你可以把它們歸為上層組件,也可以歸為中間層組件。
另外,從技術(shù)上來說,用戶進(jìn)程還是需要通過使用系統(tǒng)調(diào)用打開設(shè)備的方式來訪問虛擬設(shè)備,所以進(jìn)程總是避免不了要和系統(tǒng)調(diào)用打交道。
-
Linux
+關(guān)注
關(guān)注
87文章
11319瀏覽量
209829
原文標(biāo)題:如何學(xué)習(xí)Linux?一位老司機(jī)總結(jié)每個(gè)Linux開發(fā)者都應(yīng)該知道的一些知識
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論