這章的概念在過去不同階段的學習中都有出現過,但經由作者放在一起,描述現代軟體系統的組成,就又更清晰了一些。只不過這章節在敘述上,稍嫌雜亂,我想作者應該是想要前後文呼應,所以同樣的概念才會反覆出現。
我個人主要的「閱讀重點」是在軟體分層這部份,像作者所說的,如果換處理器或作業系統,只需要重新挑選編譯器,就能讓同一份應用程式的程式碼可以在不同平台運行,那就能大大節省開發的時間。
這部份通常被稱為「程式碼移植」工作,以目前的發展來看,要注意的是與特定硬體相關的「加速指令集 (SIMD)」以及與特定作業系統相關的系統指令。
如果希望自己的應用程式或函式庫,能在不同的處理器或作業平台上運行,為降低後續移植的困難度,應採用模型、介面與邏輯控制分離 (Model-View-Controller, MVC) 的開發模式,並在一開始就使用標準函式庫進行開發,同時為特定的指令編寫抽象/轉換介面。
現今嵌入式系統的硬體效能越來越強大,在擁有通用型電腦的特性下,通常都會運行簡化後的作業系統,因此嵌入式系統的開發越來越接近電腦上應用程式的開發流程,使用的工具與軟體元件越來越多,也導致「開發的進入門檻有變高的趨勢」。
我甚至認為以後一個小型的物聯網裝置,就是標準的微型電腦,其效能可能都超過 25 年前的桌上型電腦,一個家庭所具備的算力非常驚人,新的世代一出生就被電腦包圍著,不曉得日本或美國科幻電影的情節會不會提早發生呢?
本章節重點摘要如下:
- 電腦上有兩大類軟體:「作業系統 (Operating System, OS)」 管理一台電腦的硬體,並使它可能運行其他「應用程式 (Applications)」的程式。
- 應用程式是專注於做單一一件工作的程式的標準用詞。
瀏覽器是應用程式的一種代表性例子,但它有與作業系統的相似點。
- 近乎每一種電腦,NB、手機、平板、媒體播放器、智慧型手錶或相機等,都有某種作業系統去管理硬體。
- 早期的電腦並無應用程式和作業系統的區別。作業系統漸漸變得更精巧,與它們控管的硬體演進匹配。
- Windows 是最常見的作業系統。蘋果電腦使用 MacOS 作業系統,許多幕後電腦使用 Linux 作業系統;手機也使用作業系統,如今通常是較小版本的 Unix 或 Linux。
- 一套作業系統控管及分配資源給一台電腦。它管理處理器,安排及協調目前正在使用的程式。
- 一套典型的作業系統將有數百個程式在同時作業,有些程式是使用者開啟的,但多數程式是非專業使用者看不到的系統工作。
作業系統管理主記憶體,它把程式載入記憶體,好讓它們能夠開始執行指令。
- 現在的 Linux 有超過 1,000 萬行程式碼,由成千上萬的人歷經數十年撰寫與修改出來。據推估, Windows 10 可能有大約 5,000萬行程式碼。
一、作業系統如何運作
- 電腦電源開啟時,處理器便開始執行儲存於永久記憶體中的指令,那些指令從一個小的快閃記憶體中讀取指令,這指令要求去磁碟、USB 記憶體或網路連結中讀取更多指令,直到最終載入足夠的指令去做有用的工作。這種啟動程式稱為 bootstrapping,現在稱為 booting (開機)。
- 啟動程序涉及檢查硬體,並載入連接硬體的軟體元件(drivers)。
- 作業系統提供一個建造應用程式的平台; 作業系統做應用程式請求的事,然後把控制權與結果交還給應用程式,這些系統進入點稱為「系統呼叫」,現代的作業系統通常有幾百個系統呼叫。
二、設備驅動程式
- 一個設備驅動程式是作業系統與一種硬體設備(印表機或滑鼠)之間的「橋樑程式」。
- 驅動程式介面讓作業系統以一種統一的方式存取設備。作業系統是對一個抽象或理想化的設備做出要求,此設備的驅動程式讓其硬體執行這些要求。
- 通用型的作業系統有許多驅動程式,開機程序的一部分是把目前可用的設備驅動程式載入運行系統中。
三、其他作業系統
- 電子零組件越來越便宜,體積越來越小,使得可以在裝置中納入更多硬體,有更強的處理能力與記憶體,具有主流通用型電腦的元件與特性;把一台數位相機稱為加了鏡頭的電腦又或是智慧型手機稱為加了通話功能的電腦。
- 「物聯網」也是以此為基礎:恆溫器、電燈、保全系統等,由「內建的電腦控制,連結至網際網路」。
四、應用程式
- 應用程式是在作業系統上執行特定工作的程式或軟體系統;它可能只專注做一件特定工作或處理廣泛的工作;可能是要花錢購買或是免費使用的;可能是高度專有的軟體或免費提供的開放源碼軟體。
- Word 或 Photoshop 都是應用程式的一種,它們具有可觀的商業價值,並歷經持續的演進增添新功能。
- 瀏覽器本來只是應用程式的一種,但現在越來越像一個作業系統提供給外掛程式、虛擬機及擴充套件等幾個層面延伸擴充。Google 推出一種名為 Chrome OS 的作業系統,主要仰賴網路型服務。
五、軟體分層
- 軟體是分層結構,這能幫助程式設計師應付管理的複雜性,每一層做不同的事,並提供一個讓上面那層能用以存取服務的抽象概念。
- 最底層是硬體,往上一層是作業系統 (核心 kernel),把硬體的特定屬性隱藏起來,向應用程式提供無關硬體屬性的介面。
- 把一個程式移到一個新的處理器上,只需要用一個合適的編譯器去編譯這程式即可;如果一個程式越是和一特定硬體的屬性緊密關聯,就越難轉換。
- 蘋果在 2020 年中,把所有平板、電腦從 Intel 的處理器轉換成 ARM 處理器,這個例子展示了軟體可以獨立於特定的處理器架構之外。
- 作業系統再往上一層是一群「函式庫」,提供通用的服務,讓個別的程式設計師透過應用程式介面(APIs)來存取這些服務,如:數學運算函式、日期與時間運算、圖形使用者介面(GUI)、壓縮等。
- 作業系統的核心功能主要有:記憶體管理、檔案系統、網路連結、控管裝置及處理器,主要是協調兩種以上應用程式存取資源,互不干擾。
- 現在「所有的電腦(包含嵌入式裝置)」都有一套作業系統,發展趨勢正朝向使用 Linux 之類的通用型作業系統,而非使用專門型作業系統。
- 現今使用的任何重要技術中都含有一個以上重要的「軟體元件」。