操作系統(tǒng)中的系統(tǒng)抽象
抽象通常被認(rèn)為是計(jì)算思維的基本原則,抽象思維能力被認(rèn)為是工程們最重要的能力之一。2021年圖靈獎(jiǎng)慶祝了由阿爾弗雷德·阿霍和杰夫·烏爾曼設(shè)計(jì)的編程語(yǔ)言和編譯器抽象,展示了向更高級(jí)抽象的方向邁出了一步。
那么,什么抽象呢?對(duì)操作系統(tǒng)而言, 抽象又是怎樣的呢?
什么是抽象?
在哲學(xué)里,“抽象”是一種將觀念抽離原本客體的思想過(guò)程, 是指認(rèn)知某類個(gè)體內(nèi)的普遍性質(zhì)之概念形成及形成其性質(zhì)概念之準(zhǔn)則的過(guò)程。
具體一些,抽象是指以縮減一個(gè)概念或是一個(gè)現(xiàn)象的資訊含量來(lái)將其泛化的過(guò)程,主要是為了只保存與某一特定目的有關(guān)的資訊。例如,將一個(gè)皮制的藍(lán)球抽象化成一個(gè)幾何意義上的球,只保留一般球的屬性和行為等信息。相似地,也可以將快樂(lè)抽象化成一種情緒,以減少其在情緒中所含的資訊量。
抽象的過(guò)程普遍存在于所有人類社會(huì)的思維過(guò)程當(dāng)中,也是所有人類語(yǔ)言的一部分,也就是說(shuō),抽象的過(guò)程是普便的文化通則之一。
計(jì)算機(jī)科學(xué)中的抽象
在計(jì)算機(jī)科學(xué)中,抽象是將數(shù)據(jù)與程序,以它的語(yǔ)義來(lái)呈現(xiàn)出它的外觀,但是隱藏起它的實(shí)現(xiàn)細(xì)節(jié)。抽象把一個(gè)問(wèn)題或模型,以不同規(guī)則或方法所得出的不同的解(求解方法和解本身即抽象層),這些不同的解可以組合并還原成問(wèn)題或模型的本身。抽象是用來(lái)減少程序的復(fù)雜度,使得程序員可以專注在處理少數(shù)重要的部分。一個(gè)計(jì)算機(jī)系統(tǒng)可以分割成幾個(gè)抽象層,使得程序員可以分開處理它們。
抽象的意義是可以忽略非求解過(guò)程中必需的解。例如要用計(jì)算機(jī)程序去模擬“人”,在描述了人的動(dòng)作如飲食、思考、移動(dòng)等符合設(shè)計(jì)要求后,其他“人”的細(xì)節(jié)(軀干、器官、細(xì)胞活動(dòng)乃至人際關(guān)系)都可以忽略,以集中設(shè)計(jì)需要的功能,并減低程序的復(fù)雜度。
為了使抽象的成品(例如,算法模型)不會(huì)出現(xiàn)問(wèn)題,要注意抽象時(shí)是否漏掉了重要特征,在機(jī)器學(xué)習(xí)領(lǐng)域,凸顯了特征工程的重要性。
一般地,在程序設(shè)計(jì)中,抽象類別包括下列4類:
- 過(guò)程抽象:能夠引入一些新的操作;
- 資料抽象:能夠引入新的資料對(duì)象類型;
- 反復(fù)運(yùn)算抽象:能夠反復(fù)運(yùn)算遍歷在集合中的元素,而不必顯示如何獲得元素的細(xì)節(jié);
- 類型層次:能夠從多個(gè)單獨(dú)的數(shù)據(jù)類型中抽象成幾組相關(guān)的類型。
操作系統(tǒng)中的基本抽象
對(duì)操作系統(tǒng)而言,也許是最基本的抽象是操作系統(tǒng)中的“進(jìn)程”,意思是正在執(zhí)行中的程序。追本溯源,這個(gè)抽象是為了解決早期操作系統(tǒng)中的可靠性問(wèn)題。
在1960年到1965年之間,操作系統(tǒng)設(shè)計(jì)者承諾要建造強(qiáng)大的計(jì)算系統(tǒng),在大型用戶網(wǎng)絡(luò)中廉價(jià)地分配計(jì)算能力。這些系統(tǒng)旨在整合一系列的新發(fā)明,例如時(shí)間共享、虛擬內(nèi)存、輸入輸出流、共享文件系統(tǒng)、目錄系統(tǒng)和編程支持接口。這些發(fā)明最大限度地實(shí)現(xiàn)了信息共享,最小化了開發(fā)時(shí)間,并將昂貴的CPU和內(nèi)存資源的成本分散到許多用戶中。
大約在1960年,大型程序的主要抽象是模塊和接口。它呼吁將復(fù)雜的系統(tǒng)分解成簡(jiǎn)單的模塊,通過(guò)它們的接口來(lái)交換信息。例如,操作系統(tǒng)將組織一個(gè)用于CPU調(diào)度、內(nèi)存管理、輸入輸出、文件、目錄和編程接口支持的模塊。不幸的是,這種方法并沒有起作用,那么,缺了些什么呢?
即使設(shè)計(jì)者已經(jīng)仔細(xì)地制定了模塊功能和接口,當(dāng)模塊被連接在一起并承受用戶工作負(fù)載時(shí),系統(tǒng)總是會(huì)崩潰,而且調(diào)試工作極其困難。
問(wèn)題是,模塊是一種控制結(jié)構(gòu),用于引導(dǎo)CPU一次完成一個(gè)任務(wù)。然而,操作系統(tǒng)必須為許多的用戶管理許多的計(jì)算,但對(duì)于許多用戶同時(shí)工作的模塊及其界面通過(guò)而言,沒有一種簡(jiǎn)單的方法來(lái)可視化。大型系統(tǒng)不僅僅是擁有更多用戶的小型系統(tǒng),而且在實(shí)現(xiàn)私有內(nèi)存、共享文件和內(nèi)存以及爭(zhēng)奪有限的CPU資源的時(shí)候,多個(gè)用戶還產(chǎn)生了新的動(dòng)態(tài)。這些動(dòng)態(tài)包括競(jìng)賽條件、死鎖、繁忙的等待、在內(nèi)存級(jí)別之間循環(huán)的數(shù)據(jù)、訪問(wèn)文件、用戶通過(guò)創(chuàng)建新的自治服務(wù)來(lái)擴(kuò)展系統(tǒng),以及預(yù)測(cè)吞吐量和響應(yīng)時(shí)間。
這就需要一種新的思維方式,這種新的思維后來(lái)被稱為并發(fā)控制。
1964年,關(guān)于“進(jìn)程”的抽象出現(xiàn)了,開啟了其他問(wèn)題的優(yōu)雅解決方案。一個(gè)進(jìn)程不僅僅是一個(gè)正在執(zhí)行中的程序。它是一個(gè)自治的代理,可以根據(jù)請(qǐng)求為其他進(jìn)程執(zhí)行服務(wù)。進(jìn)程是需要CPU時(shí)間和內(nèi)存空間、與其他進(jìn)程同步、創(chuàng)建和訪問(wèn)文件、搜索目錄、響應(yīng)事件以及與其他進(jìn)程組合以生成動(dòng)態(tài)計(jì)算結(jié)構(gòu)的實(shí)體。
這個(gè)“進(jìn)程”的抽象產(chǎn)生了另一個(gè)重要的抽象——非終止計(jì)算,服務(wù)進(jìn)程被設(shè)計(jì)為無(wú)限循環(huán)。在完成一個(gè)請(qǐng)求后,一個(gè)服務(wù)進(jìn)程將返回到一個(gè)“歸屬位置”,并等待下一個(gè)傳入的請(qǐng)求。隱藏在后臺(tái)的守護(hù)進(jìn)程執(zhí)行了有益的事務(wù)管理功能,如內(nèi)存回收或?qū)⑿薷暮蟮膬?nèi)存內(nèi)容寫回磁盤。設(shè)計(jì)師們學(xué)會(huì)了用持續(xù)運(yùn)行的計(jì)算系統(tǒng)來(lái)思考。
到20世紀(jì)60年代末,大多數(shù)操作系統(tǒng)設(shè)計(jì)者將操作系統(tǒng)視為一個(gè)合作的社會(huì),主要是不終止的進(jìn)程,而不是大量的模塊。今天,筆記本電腦的活動(dòng)監(jiān)視器通常會(huì)顯示了操作系統(tǒng)中運(yùn)行的數(shù)百個(gè)進(jìn)程。
相比之下,直到今天的大多數(shù)編程課程都只教授獨(dú)立的終止程序:那些從輸入開始,從輸出停止的程序。在這種情況下,一個(gè)非終止的程序看起來(lái)就像一個(gè)bug——死循環(huán)。
操作系統(tǒng)中的系統(tǒng)抽象
系統(tǒng)抽象對(duì)于構(gòu)建具有大量進(jìn)程、用戶、設(shè)備和網(wǎng)絡(luò)連接的大型復(fù)雜系統(tǒng)至關(guān)重要。計(jì)算系統(tǒng)的每個(gè)主要領(lǐng)域有自己特有的抽象概念。例如,Internet有用于主機(jī)尋址的IP協(xié)議、用于克服噪聲傳輸?shù)腡CP協(xié)議、基于DNS的域命名、url、網(wǎng)頁(yè)、標(biāo)記語(yǔ)言等等。Internet具有通用的無(wú)限名稱空間、指向存儲(chǔ)文件的不可存儲(chǔ)的指針、數(shù)據(jù)中心、防止數(shù)據(jù)丟失的冗余等等。數(shù)據(jù)庫(kù)系統(tǒng)有記錄、字段、表、投影、連接、查詢、原子事務(wù)、持久存儲(chǔ)、文件對(duì)存儲(chǔ)的持久化表達(dá),等等。
計(jì)算系統(tǒng)復(fù)雜性的一個(gè)主要來(lái)源是大量的數(shù)字對(duì)象,系統(tǒng)抽象通過(guò)兩種方面簡(jiǎn)化了這種復(fù)雜性。首先是聚類,將所有相同類型的對(duì)象合并到一個(gè)類中,并為所有這些對(duì)象設(shè)計(jì)一個(gè)單一的管理器。管理器可以授權(quán)對(duì)這些對(duì)象執(zhí)行的操作過(guò)程提供單個(gè)的接口。其次,類管理器為對(duì)象分配唯一的名稱,并驗(yàn)證授權(quán)的每個(gè)訪問(wèn)。必須保護(hù)包含這些名稱和訪問(wèn)代碼的指針不被更改。
我們可以通過(guò)文件系統(tǒng)的抽象來(lái)描述這一抽象的過(guò)程。
在操作系統(tǒng)中,通過(guò)一種被稱為“函數(shù)”(或系統(tǒng)調(diào)用)的較低級(jí)別抽象,滿足了對(duì)指向?qū)ο蟛豢筛淖兊闹羔樀男枨??!昂瘮?shù)“是一個(gè)由(類型、訪問(wèn)、句柄)字段組成。類型字段指示所指向的對(duì)象類型,訪問(wèn)字段是一個(gè)多位代碼,指定可以對(duì)該對(duì)象執(zhí)行類操作的哪個(gè)子集,句柄字段是對(duì)象的唯一代碼,將其與所有相同類型的對(duì)象區(qū)分開來(lái)。
因?yàn)闆]有任何用戶進(jìn)程可以改變內(nèi)核空間中的任何東西,只要保持函數(shù)內(nèi)核空間,它們就會(huì)受到保護(hù)。當(dāng)它們被傳遞到外部時(shí),它們將被增強(qiáng)為一個(gè)加密校驗(yàn)和,使接收者人能夠驗(yàn)證它們自創(chuàng)建以來(lái)沒有被更改。這一方式成為了實(shí)現(xiàn)面向?qū)ο缶幊陶Z(yǔ)言的原則,也被用于一些云存儲(chǔ)系統(tǒng)以保證文件的隱私。
操作系統(tǒng)中的多層次抽象
一類對(duì)象的系統(tǒng)抽象可以描述為“抽象機(jī)器”,其指令集是在接口上提供的操作,其隱藏的內(nèi)部數(shù)據(jù)結(jié)構(gòu)跟蹤所有對(duì)象,例如文件管理器。
在操作系統(tǒng)和網(wǎng)絡(luò)中,我們可以將抽象的內(nèi)容堆疊成一系列的級(jí)別。每個(gè)級(jí)別都可以由較低級(jí)別定義的抽象組成,但較低級(jí)別定義的抽象不能使用關(guān)于較高級(jí)別抽象的任何信息。
這種分層的第一個(gè)工作例子之一是多重編程系統(tǒng),這個(gè)想法已經(jīng)被擴(kuò)展到現(xiàn)代操作系統(tǒng)中。典型分層級(jí)別如下:
- 中斷和堆棧
- 過(guò)程和信號(hào)器
- 虛擬內(nèi)存
- 消息交換
- 命名空間
- 輸入/輸出流(文件、管道、設(shè)備)
- 目錄
- 虛擬機(jī)
- shell及用戶界面
- 服務(wù)
級(jí)別1-5是微內(nèi)核,它們?cè)趦?nèi)核模式下運(yùn)行,可以訪問(wèn)所有內(nèi)存。級(jí)別6-10是用戶內(nèi)核,它們?cè)谟脩裟J较虏僮?,只能訪問(wèn)調(diào)用它們的進(jìn)程的私有內(nèi)存。每個(gè)級(jí)別都是一個(gè)抽象的機(jī)器,它管理該級(jí)別的對(duì)象類。
級(jí)別10是內(nèi)核之外的用戶服務(wù)的集合,例如圖形用戶界面、應(yīng)用程序庫(kù)(應(yīng)用程序)和性能分析工具等等,每個(gè)用戶服務(wù)都有其自己的系統(tǒng)抽象概念。
對(duì)象和操作可以由較低級(jí)別的對(duì)象和操作組成。實(shí)際上,一個(gè)級(jí)別的抽象機(jī)器嵌套在某個(gè)抽象機(jī)器中,以便于升級(jí)到下一個(gè)級(jí)別。抽象機(jī)器的用戶界面由所有嵌套機(jī)器的接口聯(lián)合組成。這個(gè)嵌套隱藏了較高層的低級(jí)細(xì)節(jié)。
在這一堆棧中,程序員必須進(jìn)行設(shè)計(jì),以便他們只向下調(diào)用,而不能向上調(diào)用。這可以防止循環(huán)等待(死鎖)和自引用代碼的循環(huán),并使系統(tǒng)能夠通過(guò)一次測(cè)試進(jìn)行驗(yàn)證。這樣,通過(guò)操作系統(tǒng)中的多層次抽象解決了任何關(guān)于循環(huán)性的問(wèn)題。
分層的系統(tǒng)抽象導(dǎo)致了廣泛的思考,也有人擔(dān)心它過(guò)于簡(jiǎn)化、過(guò)度約束和失去演進(jìn)的能力,擔(dān)心這些約束會(huì)引入更多的復(fù)雜性。但事實(shí)并非如此。當(dāng)然,分層的系統(tǒng)總是會(huì)導(dǎo)致更小的內(nèi)核,較小的內(nèi)核速度更快,也更容易測(cè)試和驗(yàn)證。多年來(lái),唯一可證明的安全操作系統(tǒng)都是分層結(jié)構(gòu)化的?,F(xiàn)代的Sel4內(nèi)核就是最新的例子,它體積小而緊湊,能夠滿足物聯(lián)網(wǎng)設(shè)備受限的內(nèi)存約束。
小結(jié)
計(jì)算機(jī)的驚人進(jìn)步是通過(guò)人們創(chuàng)造和使用系統(tǒng)抽象而實(shí)現(xiàn)的,操作系統(tǒng)的系統(tǒng)抽象只是用來(lái)組織大型系統(tǒng)的一些系統(tǒng)抽象。遺憾的是,現(xiàn)實(shí)生活中的工程師們很少討論大型程序以及編譯器的抽象,也很少討論系統(tǒng)抽象。如果沒有這些高級(jí)的抽象概念,很多大型系統(tǒng)都可能會(huì)成為無(wú)本之木,無(wú)水之源。
那么,系統(tǒng)抽象是否完全描述了計(jì)算?當(dāng)然不是,計(jì)算是對(duì)自然的以及人工的信息處理過(guò)程的研究,而系統(tǒng)抽象只是用于設(shè)計(jì)和研究大規(guī)模、復(fù)雜信息系統(tǒng)中的眾多工具之一。
然而,或許操作系統(tǒng)研發(fā)領(lǐng)域與我們相隔太遠(yuǎn),那么在我們?nèi)粘5能浖_發(fā)和系統(tǒng)架構(gòu)領(lǐng)域呢?
如何對(duì)我們的業(yè)務(wù)系統(tǒng)進(jìn)行系統(tǒng)抽象呢?
系統(tǒng)抽象是如何影響架構(gòu)決策的呢?
架構(gòu)決策的持續(xù)性與系統(tǒng)抽象又是怎樣的關(guān)系呢?