1. 程式人生 > >程式設計師需要了解的硬核知識之作業系統入門

程式設計師需要了解的硬核知識之作業系統入門

對於程式設計師來說,最莫大的榮耀莫過於自己的軟體被大多數人使用了吧。

歷史文章請戳

程式設計師需要了解的硬核知識之記憶體

程式設計師需要了解的硬核知識之CPU

程式設計師需要了解的硬核知識之二進位制

程式設計師需要了解的硬核知識之磁碟

程式設計師需要了解的硬核知識之壓縮演算法

本篇文章作為作業系統的入門文章,可能入門都算不上吧,畢竟作業系統太龐大和複雜了。本篇文章主要帶你瞭解一下我們常用的作業系統環境。

作業系統環境

程式中包含著執行環境這一內容,可以說 執行環境 = 作業系統 + 硬體 ,作業系統又可以被稱為軟體,它是由一系列的指令組成的。我們不介紹作業系統,我們主要來介紹一下硬體的識別。

我們肯定都玩兒過遊戲,你玩兒遊戲前需要幹什麼?是不是需要先看一下自己的筆記本或者電腦是不是能肝的起遊戲?下面是一個遊戲的配置(懷念一下 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 即可獲得《程式是怎樣跑起來的》電子書