程式設計師需要了解的硬核知識之作業系統入門
- 2019 年 11 月 13 日
- 筆記
對於程式設計師來說,最莫大的榮耀莫過於自己的軟體被大多數人使用了吧。
歷史文章請戳
本篇文章作為作業系統的入門文章,可能入門都算不上吧,畢竟作業系統太龐大和複雜了。本篇文章主要帶你了解一下我們常用的作業系統環境。
作業系統環境
程式中包含著運行環境
這一內容,可以說 運行環境 = 作業系統 + 硬體 ,作業系統又可以被稱為軟體,它是由一系列的指令組成的。我們不介紹作業系統,我們主要來介紹一下硬體的識別。
我們肯定都玩兒過遊戲,你玩兒遊戲前需要幹什麼?是不是需要先看一下自己的筆記型電腦或者電腦是不是能肝的起遊戲?下面是一個遊戲的配置(懷念一下 wow)
圖中的主要配置如下
- 作業系統版本:說的就是應用程式運行在何種系統環境,現在市面上主要有三種作業系統環境,Windows 、Linux 和 Unix ,一般我們玩兒的大型遊戲幾乎都是在 Windows 上運行,可以說 Windows 是遊戲的天堂。Windows 作業系統也會有區分,分為32位作業系統和64位作業系統,互不兼容。
-
處理器:處理器指的就是 CPU,你的電腦的計算能力,通俗來講就是每秒鐘能處理的指令數,如果你的電腦覺得卡帶不起來的話,很可能就是 CPU 的計算能力不足導致的。想要加深理解,請閱讀部落客的另一篇文章:程式設計師需要了解的硬核知識之CPU
- 顯示卡:顯示卡承擔圖形的輸出任務,因此又被稱為圖形處理器(Graphic Processing Unit,GPU),顯示卡也非常重要,比如我之前玩兒的
劍靈
開五檔(其實就是影像變得更清晰)會卡,其實就是顯示卡顯示不出來的原因。 -
記憶體:記憶體即主存,就是你的應用程式在運行時能夠動態分析指令的這部分存儲空間,它的大小也能決定你電腦的運行速度,想要加深理解,請閱讀部落客的另一篇文章 程式設計師需要了解的硬核知識之記憶體
-
存儲空間:存儲空間指的就是應用程式安裝所佔用的磁碟空間,由圖中可知,此遊戲的最低存儲空間必須要大於 5GB,其實我們都會遺留很大一部分用來安裝遊戲。
從程式的運行環境這一角度來考量的話,CPU 的種類是特別重要的參數,為了使程式能夠正常運行,必須滿足 CPU 所需的最低配置。
CPU 只能解釋其自身固有的語言。不同的 CPU 能解釋的機器語言的種類也是不同的。機器語言的程式稱為 本地程式碼(native code)
,程式設計師用 C 等高級語言編寫的程式,僅僅是文本文件。文本文件(排除文字編碼的問題)
在任何環境下都能顯示和編輯。我們稱之為源程式碼
。通過對源程式碼進行編譯,就可以得到本地程式碼
。下圖反映了這個過程。
Windows 作業系統克服了CPU以外的硬體差異
電腦的硬體並不僅僅是由 CPU 組成的,還包括用於存儲程式指令的數據和記憶體,以及通過 I/O 連接的鍵盤、顯示器、硬碟、印表機等外圍設備。
在 WIndows 軟體中,鍵盤輸入、顯示器輸出等並不是直接向硬體發送指令。而是通過向 Windows 發送指令實現的。因此,程式設計師就不用注意記憶體和 I/O 地址的不同構成了。Windows 操作的是硬體而不是軟體,軟體通過操作 Windows 系統可以達到控制硬體的目的。
不同作業系統的 API 差異性
接下來我們看一下作業系統的種類。同樣機型的電腦,可安裝的作業系統類型也會有多種選擇。例如:AT 兼容機除了可以安裝 Windows 之外,還可以採用 Unix 系列的 Linux 以及 FreeBSD (也是一種Unix作業系統)等多個作業系統。當然,應用軟體則必須根據不同的作業系統類型來專門開發。CPU 的類型不同,所對應機器的語言也不同,同樣的道理,作業系統的類型不同,應用程式向作業系統傳遞指令的途徑也不同。
應用程式向系統傳遞指令的途徑稱為 API(Application Programming Interface)
。Windows 以及 Linux 作業系統的 API,提供了任何應用程式都可以利用的函數組合。因為不同作業系統的 API 是有差異的。所以,如何要將同樣的應用程式移植到另外的作業系統,就必須要覆蓋應用所用到的 API 部分。
鍵盤輸入、滑鼠輸入、顯示器輸出、文件輸入和輸出等同外圍設備進行交互的功能,都是通過 API 提供的。
這也就是為什麼 Windows 應用程式不能直接移植到 Linux 作業系統上的原因,API 差異太大了。
在同類型的作業系統下,不論硬體如何,API 幾乎相同。但是,由於不同種類 CPU 的機器語言不同,因此本地程式碼也不盡相同。
FreeBSD Port 幫你輕鬆使用源程式碼
不知道你有沒有這個想法:「既然 CPU 不同會導致本地程式碼不同,那為何不將源程式碼直接發送給程式呢?」這確實是一種解決辦法,Unix 系列的 FreeBSD
作業系統就使用了這種方式。
Unix 系列作業系統 FreeBSD 中,存在一種名為 Ports
的機制。該機制能夠結合當前運行環境的硬體環境來編譯應用的源程式碼,進而得到可以運行的本地程式碼。如果目標應用的源程式碼在硬體上找不到,Ports 就會自動使用 FTP 連接到相應站點下載程式碼。
全球有很多站點都提供適用於 FreeBSD 的應用源程式碼。通過使用 Ports 可以利用的程式源程式碼,大約有 16000 種。根據不同的領域進行分類,可以隨時使用。
FreeBSD 上應用的源程式碼,大部分是用 C 語言來標註的,C 編譯器
可以結合 FreeBSD 的運行環境來生成合適的本地程式碼。
FTP( File Transfer Protocol) 是連接到互聯網上的電腦之間的傳送文件的協議。
可以使用虛擬機獲取其他環境
即使不通過應用程式的移植,在同一個作業系統上仍然可以使用其他的作業系統,那就是使用 虛擬機軟體
。虛擬機(Virtual Machine)指通過軟體的具有完整硬體系統功能的、運行在一個完全隔離環境中的完整電腦系統。在實體電腦中能夠完成的工作在虛擬機中都能夠實現。
提供相同運行環境的 Java 虛擬機
總算是提到大 Java 了, Java 大法好,除了虛擬機的方法之外,還有一種方法能夠提供不依賴於特定硬體和作業系統的程式運行環境,那就是 Java。
大家說的 Java 其實有兩層意思,一種是作為程式語言的 Java;一種是作為程式運行環境的 Java。Java 與其他語言相同,都是通過源程式碼編譯後運行的。不過,編譯後生成的不是特定 CPU 使用的本地程式碼,而是名為位元組程式碼
的程式。直接程式碼的運行環境就稱為 Java 虛擬機(Java Virtual Machine)
。Java 虛擬機是一邊把 Java 位元組程式碼逐一轉換為本地程式碼一邊在運行著。
程式運行時,將編譯後的位元組程式碼轉換為本地程式碼,這樣的操作看上去有些迂迴,但由此可以實現相同的位元組碼可以在不同的作業系統環境下運行。
想像一下,你開發完成的應用部署到 Linux 環境下,是不是什麼都不用管?
Windows 有專門的 Windows 虛擬機,Macintosh 有 Macintosh 專門的虛擬機。從作業系統來看,Java虛擬機就是一個應用,從運行環境上來看,Java 虛擬機就是運行環境。
BIOS 和引導
最後對一些比較基礎的部分做一些補充說明。程式的運行環境,存在著名為 BIOS(Basic Input/Output System)
的系統。BIOS 存儲在 ROM 中,是預先內置在電腦主機內部的程式。BIOS 除了鍵盤、磁碟和顯示卡等基本控制外,還有引導程式
的功能。引導程式是存儲在啟動驅動器啟示區域的小程式。作業系統的啟動驅動器一般硬碟。不過有時也可能是 CD-ROM
或軟盤。
電腦開機後,BIOS 會確認硬體是否正常運行,沒有異常的話會直接啟動引導程式。引導程式的功能是把在硬碟等記錄的 OS 載入到記憶體中運行。雖然啟動應用是 OS 的功能,但 OS 不能啟動自己,是通過引導程式來啟動的。
文章參考:
《程式是怎樣跑起來的》第七章
關注公眾號後台回復 191106 即可獲得《程式是怎樣跑起來的》電子書