程序員都熟悉但不一定說得清的操作系統(tǒng)基本概念
任何計(jì)算機(jī)系統(tǒng)都包含一個(gè)名為操作系統(tǒng)的基本程序集合。在這個(gè)集合里,最重要的程序稱為內(nèi)核(kernel)。當(dāng)操作系統(tǒng)啟動(dòng)時(shí),內(nèi)核被裝入到RAM中,內(nèi)核中包含了系統(tǒng)運(yùn)行所必不可少的很多核心過程(procedure)。其他程序是一些不太重要的使用程序,盡管這些程序?yàn)橛脩籼峁┝伺c計(jì)算機(jī)進(jìn)行廣泛交流的經(jīng)驗(yàn)(以及用戶買計(jì)算機(jī)要做的所有工作),但系統(tǒng)根本的樣子和能力還是由內(nèi)核決定。內(nèi)核也為系統(tǒng)中所有事情提供了主要功能,并決定高層軟件的很多特性。因此,我們將經(jīng)常使用術(shù)語“操作系統(tǒng)”作為“內(nèi)核”的同義詞。
RAM(Random Access Memory)是一種計(jì)算機(jī)內(nèi)存,它允許數(shù)據(jù)被隨機(jī)地讀取和寫入。與只讀存儲(chǔ)器(ROM)不同,RAM只能臨時(shí)存儲(chǔ)數(shù)據(jù),當(dāng)電源關(guān)閉時(shí),存儲(chǔ)在RAM中的數(shù)據(jù)會(huì)丟失。
RAM通常由多個(gè)存儲(chǔ)單元組成,每個(gè)單元可以存儲(chǔ)一個(gè)二進(jìn)制數(shù)字(0或1)。這些存儲(chǔ)單元被組織成一個(gè)矩陣,方便數(shù)據(jù)的隨機(jī)訪問?,F(xiàn)代計(jì)算機(jī)通常包含幾個(gè)GB的RAM,以便快速處理大量數(shù)據(jù)。
根據(jù)工作原理,RAM可以分為兩類:靜態(tài)RAM(SRAM)和動(dòng)態(tài)RAM(DRAM)。SRAM的每個(gè)存儲(chǔ)單元都需要六個(gè)晶體管,因此它的集成度較低,功耗也較高。相比之下,DRAM的每個(gè)存儲(chǔ)單元只需要一個(gè)晶體管和一個(gè)小電容,因此它的集成度更高,功耗更低。
除了SRAM和DRAM,還有一種基于Flash技術(shù)的非易失性RAM(NVRAM),它可以在斷電后保持?jǐn)?shù)據(jù)。NVRAM通常用于存儲(chǔ)固件、啟動(dòng)加載器等重要數(shù)據(jù)。
總之,RAM是計(jì)算機(jī)中非常重要的組成部分,它提供了快速的數(shù)據(jù)存儲(chǔ)和訪問能力,使得計(jì)算機(jī)能夠高效地處理各種任務(wù)。
操作系統(tǒng)必須完成兩個(gè)主要目標(biāo):
-
與硬件部分交互,為包含在硬件平臺(tái)上的所有低層可編程部件提供服務(wù)。
-
為運(yùn)行在計(jì)算機(jī)系統(tǒng)上的應(yīng)用程序(即所謂用戶程序)提供執(zhí)行環(huán)境。
一些操作系統(tǒng)允許所有的用戶程序都與硬件部分進(jìn)行交互(典型的例子是MS-DOS)。與此相反,類Unix操作系統(tǒng)把與計(jì)算機(jī)物理組織相關(guān)的所有低層細(xì)節(jié)都對(duì)用戶運(yùn)行的程序隱藏起來。當(dāng)程序想使用硬件資源時(shí),必須向操作系統(tǒng)發(fā)出一個(gè)請(qǐng)求。內(nèi)核對(duì)這個(gè)請(qǐng)求進(jìn)行評(píng)估,如果允許使用這個(gè)資源,那么,內(nèi)核代表應(yīng)用程序與相關(guān)的硬件部分進(jìn)行交互。
為了實(shí)施這種機(jī)制,現(xiàn)代操作系統(tǒng)依靠特殊的硬件特性來禁止用戶程序直接與低層硬件部分進(jìn)行交互,或者禁止直接訪問任意的物理地址。特別是,硬件為CPU引入了至少有兩種不同的執(zhí)行模式:用戶程序的非特權(quán)模式和內(nèi)核的特權(quán)模式。Unix把它們分別稱為用戶態(tài)(User Mode)和內(nèi)核態(tài)(Kernel Mode)。
下面這些基本概念,推動(dòng)了Unix、Linux和其他操作系統(tǒng)的設(shè)計(jì)。你也許熟悉這些概念,但為了說明這些概念對(duì)Linux內(nèi)核的必要性,下面試圖對(duì)其做更深一步的介紹。
多用戶系統(tǒng)
多用戶系統(tǒng)(multiuser system)就是一臺(tái)能并發(fā)和獨(dú)立地執(zhí)行分別屬于兩個(gè)或多個(gè)用戶的若干應(yīng)用程序的計(jì)算機(jī)?!安l(fā)”(concurrently)意味著幾個(gè)應(yīng)用程序能同時(shí)處于活動(dòng)狀態(tài)并競爭各種資源,如CPU、內(nèi)存、硬盤等等?!蔼?dú)立”(independently)意味著每個(gè)應(yīng)用程序能執(zhí)行自己的任務(wù),而無需考慮其他用戶的應(yīng)用程序在干些什么。當(dāng)然,從一個(gè)應(yīng)用程序切換到另一個(gè)會(huì)使每個(gè)應(yīng)用程序的速度有所減慢,從而影響用戶看到的響應(yīng)時(shí)間?,F(xiàn)代操作系統(tǒng)內(nèi)核提供的許多復(fù)雜特性減少了強(qiáng)加在每個(gè)程序上的延遲時(shí)間,給用戶提供了盡可能快的響應(yīng)時(shí)間。
多用戶操作系統(tǒng)必須包含以下幾個(gè)特點(diǎn):
-
核實(shí)用戶身份的認(rèn)證機(jī)制。
-
防止有錯(cuò)誤的用戶程序妨礙其他應(yīng)用程序在系統(tǒng)中運(yùn)行的保護(hù)機(jī)制。
-
防止有惡意的用戶程序干涉或窺視其他用戶的活動(dòng)的保護(hù)機(jī)制。
-
限制分配給每個(gè)用戶的資源數(shù)的記賬機(jī)制。
為了確保能實(shí)現(xiàn)這些安全保護(hù)機(jī)制,操作系統(tǒng)必須利用與CPU特權(quán)模式相關(guān)的硬件保護(hù)機(jī)制,否則,用戶程序?qū)⒛苤苯釉L問系統(tǒng)電路并克服強(qiáng)加于它的這些限制。Unix是實(shí)施系統(tǒng)資源硬件保護(hù)的多用戶系統(tǒng)。
用戶和組
在多用戶系統(tǒng)中,每個(gè)用戶在機(jī)器上都有私有空間,典型地,他擁有一定數(shù)量的磁盤空間來存儲(chǔ)文件、接收私人郵件信息等等。操作系統(tǒng)必須保證用戶空間的私有部分僅僅對(duì)其擁有者是可見的。特別是必須能保證,沒有用戶能夠開發(fā)一個(gè)用于侵犯其他用戶私有空間的系統(tǒng)應(yīng)用程序。
所有的用戶由一個(gè)唯一的數(shù)字來標(biāo)識(shí),這個(gè)數(shù)字叫用戶標(biāo)識(shí)符(User ID, UID)。通常一個(gè)計(jì)算機(jī)系統(tǒng)只能由有限的人使用。當(dāng)其中的某個(gè)用戶開始一個(gè)工作會(huì)話時(shí),操作系統(tǒng)要求輸入一個(gè)登錄名和口令,如果用戶輸入的信息無效,則系統(tǒng)拒絕訪問。因?yàn)榭诹钍遣还_的,所以用戶的保密性得到了保證。
為了和其他用戶有選擇地共享資料,每個(gè)用戶是一個(gè)或多個(gè)用戶組的一名成員,組由唯一的用戶組標(biāo)識(shí)符(user group ID)標(biāo)識(shí)。每個(gè)文件也恰好與一個(gè)組相對(duì)應(yīng)。例如,可以設(shè)置這樣的訪問權(quán)限,擁有文件的用戶具有對(duì)文件的讀寫權(quán)限,同組用戶僅有只讀權(quán)限,而系統(tǒng)中的其他用戶沒有對(duì)文件的任何訪問權(quán)限。
任何類Unix操作系統(tǒng)都有一個(gè)特殊的用戶,叫做root,即超級(jí)用戶(superuser)。系統(tǒng)管理員必須以root的身份登錄,以便處理用戶賬號(hào),完成諸如系統(tǒng)備份、程序升級(jí)等維護(hù)任務(wù)。root用戶幾乎無所不能,因?yàn)椴僮飨到y(tǒng)對(duì)他不使用通常的保護(hù)機(jī)制。尤其是,root用戶能訪問系統(tǒng)中的每一個(gè)文件,能干涉每一個(gè)正在執(zhí)行的用戶程序的活動(dòng)。
進(jìn)程
所有的操作系統(tǒng)都使用一種基本的抽象:進(jìn)程(Process)。一個(gè)進(jìn)程可以定義為:“程序執(zhí)行時(shí)的一個(gè)實(shí)例”,或者一個(gè)運(yùn)行程序的“執(zhí)行上下文”。在傳統(tǒng)的操作系統(tǒng)中,一個(gè)進(jìn)程的地址空間(address space)中執(zhí)行一個(gè)單獨(dú)的指令序列。地址空間是允許進(jìn)程引用的內(nèi)存地址集合?,F(xiàn)代操作系統(tǒng)允許具有多個(gè)執(zhí)行流的進(jìn)程,也就是說,在相同的地址空間可執(zhí)行多個(gè)指令序列。
多用戶系統(tǒng)必須實(shí)施一種執(zhí)行環(huán)境,在這種環(huán)境里,幾個(gè)進(jìn)程能并發(fā)活動(dòng),并能競爭系統(tǒng)資源(主要是CPU)。允許進(jìn)程并發(fā)活動(dòng)的系統(tǒng)稱為多道程序系統(tǒng)(multiprogramming)或多處理系統(tǒng)(multiprocessing)。區(qū)分程序和進(jìn)程是非常重要的:幾個(gè)進(jìn)程能并發(fā)地執(zhí)行同一個(gè)程序,而同一個(gè)進(jìn)程能順序地執(zhí)行幾個(gè)程序。
在單處理器系統(tǒng)上,只有一個(gè)進(jìn)程能占用CPU,因此,在某一時(shí)刻只能有一個(gè)執(zhí)行流。一般來說,CPU的個(gè)數(shù)總是有限的,因而只有少數(shù)幾個(gè)進(jìn)程能同時(shí)執(zhí)行。操作系統(tǒng)中叫做調(diào)度程序(scheduler)的部分決定哪個(gè)進(jìn)程能執(zhí)行。一些操作系統(tǒng)只運(yùn)行有非搶占式(nonpreemptable)進(jìn)程,這就意味著,只有當(dāng)進(jìn)程資源放棄CPU時(shí),調(diào)度程序才被調(diào)用。但是,多用戶系統(tǒng)中的進(jìn)程必須是搶占式的(preemptable),操作系統(tǒng)記錄下每個(gè)進(jìn)程占有的CPU時(shí)間,并周期性地激活調(diào)度程序。
Unix是具有搶占式進(jìn)程的多處理操作系統(tǒng)。即使沒有用戶登錄,沒有程序運(yùn)行,也還是有幾個(gè)系統(tǒng)進(jìn)程在監(jiān)視外圍設(shè)備。尤其是,有幾個(gè)進(jìn)程在監(jiān)聽系統(tǒng)終端等待用戶登錄。當(dāng)用戶輸入一個(gè)登錄名,監(jiān)聽進(jìn)程就運(yùn)行一個(gè)程序來驗(yàn)證用戶的口令。如果用戶身份得到證實(shí),那么監(jiān)聽進(jìn)程就創(chuàng)建另一個(gè)進(jìn)程來執(zhí)行shell,此時(shí)在shell下可以輸入命令。當(dāng)一個(gè)圖形化界面被激活時(shí),有一個(gè)進(jìn)程就運(yùn)行窗口管理器,界面上的每個(gè)窗口通常都由一個(gè)單獨(dú)的進(jìn)程來執(zhí)行。如果用戶創(chuàng)建了一個(gè)圖形化shell,那么一個(gè)進(jìn)程運(yùn)行圖形化窗口,而第二個(gè)進(jìn)程運(yùn)行用戶可以輸入命令的shell,對(duì)每一個(gè)用戶命令,shell進(jìn)程都創(chuàng)建執(zhí)行響應(yīng)程序的另一個(gè)進(jìn)程。
類Unix操作系統(tǒng)采用進(jìn)程/內(nèi)核模式。每個(gè)進(jìn)程都自以為它是系統(tǒng)中唯一的進(jìn)程,可以獨(dú)占操作系統(tǒng)所提供的服務(wù)。只是進(jìn)程發(fā)出系統(tǒng)調(diào)用,硬件就會(huì)把特權(quán)模式由用戶態(tài)變成內(nèi)核態(tài),然后進(jìn)程以非常有限的目的開始一個(gè)內(nèi)核過程的執(zhí)行。這樣,操作系統(tǒng)在進(jìn)程的執(zhí)行上下文中起作用,以滿足進(jìn)程的請(qǐng)求。一旦這個(gè)請(qǐng)求完全得到滿足,內(nèi)核過程將迫使硬件返回到用戶態(tài),然后進(jìn)程從系統(tǒng)調(diào)用的下一條指令繼續(xù)執(zhí)行。
內(nèi)核體系結(jié)構(gòu)
如前所述,大部分Unix內(nèi)核是單塊結(jié)構(gòu):每一個(gè)內(nèi)核層都被繼承到整個(gè)內(nèi)核程序中,并代表當(dāng)前進(jìn)程在內(nèi)核態(tài)下運(yùn)行。相反,微內(nèi)核(microkernel)操作系統(tǒng)只需要內(nèi)核有一個(gè)很小的函數(shù)集,通常包括幾個(gè)同步原語、一個(gè)簡單的調(diào)度程序和進(jìn)程間通信機(jī)制。運(yùn)行在微內(nèi)核之上的幾個(gè)系統(tǒng)進(jìn)程實(shí)現(xiàn)從前操作系統(tǒng)級(jí)實(shí)現(xiàn)的功能,如內(nèi)存分配程序、設(shè)備驅(qū)動(dòng)程序、系統(tǒng)調(diào)用處理程序等等。
盡管關(guān)于操作系統(tǒng)的學(xué)術(shù)研究都是面向微內(nèi)核的,但這樣的操作系統(tǒng)一般比單塊內(nèi)核的效率低,因?yàn)椴僮飨到y(tǒng)不同層次之間顯式的消息傳遞要花費(fèi)一定的代價(jià)。不過,微內(nèi)核操作系統(tǒng)比單塊內(nèi)核有一定的理論優(yōu)勢。微內(nèi)核操作系統(tǒng)迫使系統(tǒng)程序員采用模塊化的方法,因?yàn)槿魏尾僮飨到y(tǒng)層都是一個(gè)相對(duì)獨(dú)立的程序,這種程序必須通過定義明確而清晰的軟件接口與其他層交互。此外,已有的微內(nèi)核操作系統(tǒng)可以很容易地移植到其他的體系結(jié)構(gòu)上,因?yàn)樗信c硬件相關(guān)的部分都被封裝進(jìn)微內(nèi)核代碼中。最后,微內(nèi)核操作系統(tǒng)比單塊內(nèi)核更加充分地利用了RAM,因?yàn)闀呵也恍枰獔?zhí)行的系統(tǒng)進(jìn)程可以被調(diào)出或撤銷。
為了達(dá)到微內(nèi)核理論上的很多優(yōu)點(diǎn)而又不影響性能,Linux內(nèi)核提供了模塊(module)。模塊是一個(gè)目標(biāo)文件,其代碼可以在運(yùn)行時(shí)鏈接到內(nèi)核或從內(nèi)核解除鏈接。這種目標(biāo)代碼通常由一組函數(shù)組成,用來實(shí)現(xiàn)文件系統(tǒng)、驅(qū)動(dòng)程序或其他內(nèi)核上層功能。與微內(nèi)核操作系統(tǒng)的外層不同,模塊不是作為一個(gè)特殊的進(jìn)程執(zhí)行的。相反,與任何其他靜態(tài)鏈接的內(nèi)核函數(shù)一樣,它代表當(dāng)前進(jìn)程在內(nèi)核態(tài)下執(zhí)行。
使用模塊的主要優(yōu)點(diǎn)包括:
-
模塊化方法
因?yàn)槿魏文K都可以在運(yùn)行時(shí)被鏈接或解除鏈接,因此,系統(tǒng)程序員必須提出良定義的軟件接口以訪問由模塊處理的數(shù)據(jù)結(jié)構(gòu)。這使得開發(fā)新模塊變得容易。 -
平臺(tái)無關(guān)性
即使模塊依賴于某些特殊的硬件特點(diǎn),但它不依賴于某個(gè)固定的硬件平臺(tái)。例如,符合SCSI標(biāo)準(zhǔn)的磁盤驅(qū)動(dòng)程序模塊,在IBM兼容PC與HP的Alpha機(jī)上都能很好地工作。 -
節(jié)省內(nèi)存使用
當(dāng)需要模塊功能時(shí),把它鏈接到正在運(yùn)行的內(nèi)核中,否則,將該模塊解除鏈接。這種機(jī)制對(duì)于小型嵌入式系統(tǒng)是非常有用的。 -
無性能損失
模塊的目標(biāo)代碼一旦被鏈接到內(nèi)核,其作用與靜態(tài)鏈接的內(nèi)核的目標(biāo)代碼完全等價(jià)。因此,當(dāng)模塊的函數(shù)被調(diào)用時(shí),無需顯式地進(jìn)行消息傳遞。
參考文檔:
[1] 《深入理解Linux內(nèi)核第三版》
??歡迎 點(diǎn)贊?? 收藏? 評(píng)論?? 關(guān)注? 如有錯(cuò)誤敬請(qǐng)指正!文章來源:http://www.zghlxwxcb.cn/news/detail-784545.html
? 學(xué)Python,點(diǎn)擊下方名片關(guān)注我。?文章來源地址http://www.zghlxwxcb.cn/news/detail-784545.html
到了這里,關(guān)于程序員都熟悉但不一定說得清的操作系統(tǒng)基本概念的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!