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

程式設計師需要了解的硬核知識之作業系統和應用

利用計算機執行程式大部分都是為了提高處理效率。例如,Microsoft Word 這樣的文書處理軟體,是用來提高文字檔案處理效率的程式,Microsoft Excel 等表格計算軟體,是用來提高賬本處理效率的程式。這種為了提高特定處理效率的程式統稱為 應用

程式設計師的工作就是編寫各種各樣的應用來提高工作效率,程式設計師一般不編寫作業系統,但是程式設計師編寫的應用離不開作業系統,此篇文章我們就針對 Windows 作業系統來說明一下作業系統和應用之間的關係。

作業系統功能的歷史

作業系統其實也是一種軟體,任何新事物的出現肯定都有它的歷史背景,那麼作業系統也不是憑空出現的,肯定有它的歷史背景。

在計算機尚不存在作業系統的年代,完全沒有任何程式,人們通過各種按鈕

來控制計算機,這一過程非常麻煩。於是,有人開發出了僅具有載入和執行功能的監控程式,這就是作業系統的原型。通過事先啟動監控程式,程式設計師可以根據需要將各種程式載入到記憶體中執行。雖然仍舊比較麻煩,但比起在沒有任何程式的狀態下進行開發,工作量得到了很大的緩解。

隨著時代的發展,人們在利用監控程式編寫程式的過程中發現很多程式都有公共的部分。例如,通過鍵盤進行文字輸入,顯示器進行資料展示等,如果每編寫一個新的應用程式都需要相同的處理的話,那真是太浪費時間了。因此,基本的輸入輸出部分的程式就被追加到了監控程式中。初期的作業系統就是這樣誕生了。

類似的想法可以共用,人們又發現有更多的應用程式可以追加到監控程式中,比如硬體控制程式

程式語言處理器(彙編、編譯、解析)以及各種應用程式等,結果就形成了和現在差異不大的作業系統,也就是說,其實作業系統是多個程式的集合體。

我在 程式設計師需要了解的硬核知識之CPU這篇文章中提到了組合語言,這裡簡單再提一下。

組合語言是一種低階語言,也被稱為符號語言。組合語言是第二代計算機語言,在組合語言中,用助記符代替機器指令的操作碼,用地址符號或標號代替指令或運算元的地址。用一些容易理解和記憶的字母,單詞來代替一個特定的指令,比如:用ADD代表數字邏輯上的加減,MOV代表資料傳遞等等,通過這種方法,人們很容易去閱讀已經完成的程式或者理解程式正在執行的功能,對現有程式的bug修復以及運營維護都變得更加簡單方便

可以說共用思想真是人類前進的一大步,對於解放生產力而言簡直是太重要了。

要把作業系統放在第一位

對於程式設計師來說,程式設計師創造的不是硬體,而是各種應用程式,但是如果程式設計師只做應用不懂硬體層面的知識的話,是無法成為硬核程式設計師的。現在培訓機構培養出了一批怎麼用的人才,卻沒有培訓出為什麼這麼做的人才,畢竟為什麼不是培訓機構教的,而是學校教的,我很相信耗子叔說的話:學習沒有速成這回事。言歸正題。

在作業系統誕生之後,程式設計師不需要在硬體層面考慮問題,所以程式設計師的數量就增加了。哪怕自稱對硬體一竅不通的人也可能製作出一個有模有樣的程式。不過,要想成為一個全面的程式設計師,有一點需要清楚的就是,掌握硬體的基本知識,並藉助作業系統進行抽象化,可以大大提高程式設計效率。

下面就看一下作業系統是如何給開發人員帶來便利的,在 Windows 作業系統下,用 C 語言製作一個具有表示當前時間功能的應用。time() 是用來取得當前日期和時間的函式,printf() 是把結果列印到顯示器上的函式,如下:

#include <stdio.h>
#include <time.h>

void main(){
  // 儲存當前日期和時間資訊
  time_t tm;
  
  // 取得當前的日期和時間
  time(&tm);
  
  // 在顯示器上顯示日期和時間
  printf("%s\n", ctime(&tm));
}

讀者可以自行執行程式檢視結果,我們主要關注硬體在這段程式碼中做了什麼事情

  • 通過 time_t tm,為 time_t 型別的變數申請分配記憶體空間;
  • 通過 time(&tm) ,將當前的日期和時間資料儲存到變數的記憶體空間中
  • 通過 printf("%s\n",ctime(&tm)), 把變數記憶體空間的內容輸出到顯示器上。

應用的可執行檔案指的是,計算機的 CPU 可以直接解釋並執行的原生代碼,不過這些程式碼是無法直接控制硬體的,事實上,這些程式碼是通過作業系統來間接控制硬體的。變數中涉及到的記憶體分配情況,以及 time() 和 printf() 這些函式的執行結果,都不是面向硬體而是面向作業系統的。作業系統收到應用發出的指令後,首先會對該指令進行解釋,然後會對 時鐘IC 和顯示器用的 I/O 進行控制。

計算機中都安裝有儲存日期和時間的實時時鐘(Real-time clock),上面提到的時鐘IC 就是值該實時時鐘。

系統呼叫和程式語言的移植性

作業系統控制硬體的功能,都是通過一些小的函式集合體的形式來提供的。這些函式以及呼叫函式的行為稱為系統呼叫,也就是通過應用進而呼叫作業系統的意思。在前面的程式中用到了 time() 以及 printf() 函式,這些函式內部也封裝了系統呼叫。

C 語言等高階程式語言並不依存於特定的作業系統,這是因為人們希望不管是Windows 作業系統還是 Linux 作業系統都能夠使用相同的原始碼。因此,高階程式語言的機制就是,使用獨自的函式名,然後在編譯的時候將其轉換為系統呼叫的方式(也有可能是多個系統呼叫的組合)。也就是說,高階語言編寫的應用在編譯後,就轉換成了利用系統呼叫的原生代碼。

不過,在高階語言中也存在直接呼叫系統呼叫的程式語言,不過,利用這種方式做成應用,移植性並不友好。

移植性:移植性指的是同樣的程式在不同作業系統下執行時所花費的時間,時間越少證明移植性越好。

作業系統和高階程式語言使硬體抽象化

通過使用作業系統提供的系統呼叫,程式設計師不必直接編寫控制硬體的程式,而且,通過使用高階程式語言,有時也無需考慮系統呼叫的存在,系統呼叫往往是自動觸發的,作業系統和高階程式語言能夠使硬體抽象化,這很了不起。

下面讓我們看一個硬體抽象化的具體例項

#include <stdio.h>

void main(){
  
  // 開啟檔案
  FILE *fp = fopen("MyFile.txt","w");
  
  // 寫入檔案
  fputs("你好", fp);
  
  // 關閉檔案
  fclose(fp);
}

上述程式碼使用 C 編寫的程式,fputs() 是用來往檔案中寫入字串的函式,fclose() 是用來關閉檔案的函式。

上述應用在編譯執行後,會向檔案中寫入 "你好" 字串。檔案是作業系統對磁碟空間的抽象化,就如同我們在 程式設計師需要了解的硬核知識之磁碟 這篇文章提到的一樣,磁碟就如同樹的年輪,磁碟的讀寫是以扇區為單位的,通過磁軌來定址,如果直接對硬體讀寫的話,那麼就會變為通過向磁碟用的 I/O 指定扇區位置來對資料進行讀寫了。

但是,在上面程式碼中,扇區壓根就沒有出現過傳遞給 fopen() 函式的引數,是檔名 MyFile.txt 和指定檔案寫入的 w。傳遞給 fputs() 的引數,是往檔案中寫入的字串"你好" 和 fp,傳遞給 fclose() 的引數,也僅僅是 fp,也就是說磁碟通過開啟檔案這個操作,把磁碟抽象化了,開啟檔案這個操作就可以說是操作硬體的指令。

下面讓我們來看一下程式碼清單中 fp 的功能,變數 fp 中被賦予的是 fopen() 函式的返回值,該值被稱為檔案指標。應用開啟檔案後,作業系統就會自動申請分配用來管理檔案讀寫的記憶體空間。記憶體地址可以通過 fopen() 函式的返回值獲得。用 fopen() 開啟檔案後,接下來就是通過制定的檔案指標進行操作,正因為如此,fputs() 和 fclose() 以及 fclose() 引數中都制定了檔案指標。

由此我們可以得出一個結論,應用程式是通過系統呼叫,磁碟抽象來實現對硬碟的控制的。

Windows 作業系統的特徵

Windows 作業系統是世界上使用者數量最龐大的群體,作為 Windows 作業系統的資深使用者,你都知道 Windows 作業系統有哪些特徵嗎?下面列舉了一些 Windows 作業系統的特性

  • Windows 作業系統有兩個版本:32位和64位
  • 通過 API 函式整合來提供系統呼叫
  • 提供了採用圖形使用者介面的使用者介面
  • 通過 WYSIWYG 實現列印輸出,WYSIWYG 其實就是 What You See Is What You Get ,值得是顯示器上顯示的圖形和文字都是可以原樣輸出到印表機列印的。
  • 提供多工功能,即能夠同時開啟多個任務
  • 提供網路功能和資料庫功能
  • 通過即插即用實現裝置驅動的自設定

這些是對程式設計師來講比較有意義的一些特徵,下面針對這些特徵來進行分別的介紹

32位作業系統

這裡表示的32位作業系統表示的是處理效率最高的資料大小。Windows 處理資料的基本單位是 32 位。這與最一開始在 MS-DOS 等16位作業系統不同,因為在16位作業系統中處理32位資料需要兩次,而32位作業系統只需要一次就能夠處理32位的資料,所以一般在 windows 上的應用,它們的最高能夠處理的資料都是 32 位的。

比如,用 C 語言來處理整數資料時,有8位的 char 型別,16位的short型別,以及32位的long型別三個選項,使用位數較大的 long 型別進行處理的話,增加的只是記憶體以及磁碟的開銷,對效能影響不大。

現在市面上大部分都是64位作業系統了,64位作業系統也是如此。

通過 API 函式集來提供系統呼叫

Windows 是通過名為 API 的函式集來提供系統呼叫的。API是聯絡應用程式和作業系統之間的介面,全稱叫做 Application Programming Interface,應用程式介面。

當前主流的32位版 Windows API 也稱為 Win32 API,之所以這樣命名,是需要和不同的作業系統進行區分,比如最一開始的 16 位版的 Win16 API,和後來流行的 Win64 API

API 通過多個 DLL 檔案來提供,各個 API 的實體都是用 C 語言編寫的函式。所以,在 C 語言環境下,使用 API 更加容易,比如 API 所用到的 MessageBox() 函式,就被儲存在了 Windows 提供的 user32.dll 這個 DLL 檔案中。

提供採用了 GUI 的使用者介面

GUI(Graphical User Interface) 指得就是圖形使用者介面,通過點選顯示器中的視窗以及圖示等視覺化的使用者介面,舉個例子:Linux 作業系統就有兩個版本,一種是簡潔版,直接通過命令列控制硬體,還有一種是視覺化版,通過游標點選圖形介面來控制硬體。

通過 WYSIWYG 實現列印輸出

WYSIWYG 指的是顯示器上輸出的內容可以直接通過印表機列印輸出。在 Windows 中,顯示器和印表機被認作同等的圖形輸出裝置處理的,該功能也為 WYSIWYG 提供了條件。

藉助 WYSIWYG 功能,程式設計師可以輕鬆不少。最初,為了是現在顯示器中顯示和在印表機中列印,就必須分別編寫各自的程式,而在 Windows 中,可以藉助 WYSIWYG 基本上在一個程式中就可以做到顯示和列印這兩個功能了。

提供多工功能

多工指的就是同時能夠執行多個應用程式的功能,Windows 是通過時鐘分割技術來實現多工功能的。時鐘分割指的是短時間間隔內,多個程式切換執行的方式。在使用者看來,就好像是多個程式在同時執行,其底層是 CPU 時間切片,這也是多執行緒多工的核心。

提供網路功能和資料庫功能

Windows 中,網路功能是作為標準功能提供的。資料庫(資料庫伺服器)功能有時也會在後面追加。網路功能和資料庫功能雖然並不是作業系統不可或缺的,但因為它們和作業系統很接近,所以被統稱為中介軟體而不是應用。意思是處於作業系統和應用的中間層,作業系統和中介軟體組合在一起,稱為系統軟體。應用不僅可以利用作業系統,也可以利用中介軟體的功能。

相對於作業系統一旦安裝就不能輕易更換,中介軟體可以根據需要進行更換,不過,對於大部分應用來說,更換中介軟體的話,會造成應用也隨之更換,從這個角度來說,更換中介軟體也不是那麼容易。

通過即插即用實現裝置驅動的自動設定

即插即用(Plug-and-Play)指的是新的裝置連線(plug) 後就可以直接使用的機制,新裝置連線計算機後,計算機就會自動安裝和設定用來控制該裝置的驅動程式

裝置驅動是作業系統的一部分,提供了同硬體進行基本的輸入輸出的功能。鍵盤、滑鼠、顯示器、磁碟裝置等,這些計算機中必備的硬體的裝置驅動,一般都是隨作業系統一起安裝的。

有時 DLL 檔案也會同裝置驅動檔案一起安裝。這些 DLL 檔案中儲存著用來利用該新追加的硬體API,通過 API ,可以製作出執行該硬體的心應用。

文章參考:

https://baike.baidu.com/item/組合語言/61826?fr=aladdin

《程式是怎樣跑起來的》第九章

https://baike.baidu.com/item/Windows作業系統/852149?fr=aladdin

關注公眾號後臺回覆 191106 即可獲得《程式是怎樣跑起來的》電子書

相關推薦

程式設計師需要知識作業系統應用

利用計算機執行程式大部分都是為了提高處理效率。例如,Microsoft Word 這樣的文書處理軟體,是用來提高文字檔案處理效率的程式,Microsoft Excel 等表格計算軟體,是用來提高賬本處理效率的程式。這種為了提高特定處理效率的程式統稱為 應用 程式設計師的工作就是編寫各種各樣的應用來提高工作效率

程式設計師需要知識CPU

大家都是程式設計師,大家都是和計算機打交道的程式設計師,大家都是和計算機中軟體硬體打交道的程式設計師,大家都是和CPU打交道的程式設計師,所以,不管你是玩兒硬體的還是做軟體的,你的世界都少不了計算機最核心的 - CPU CPU是什麼 CPU 的全稱是 Central Processing Unit,它是你的電

程式設計師需要知識記憶體

我們都知道,計算機是處理資料的裝置,而資料的主要儲存位置就是磁碟和記憶體,並且對於程式設計師來講,CPU 和記憶體是我們必須瞭解的兩個物理結構,它是你通向高階程式設計師很重要的橋樑,那麼本篇文章我們就來介紹一下基本的記憶體知識。 什麼是記憶體 記憶體(Memory)是計算機中最重要的部件之一,它是程式與CPU

程式設計師需要知識磁碟

此篇文章是 《程式設計師需要了解的硬核知識》系列第四篇,歷史文章請戳 程式設計師需要了解的硬核知識之記憶體 程式設計師需要了解的硬核知識之CPU 程式設計師需要了解的硬核知識之二進位制 我們大家知道,計算機的五大基礎部件是 儲存器、控制器、運算器、輸入和輸出裝置,其中從儲存功能的角度來看,可以把儲存器分為記憶

程式設計師需要知識壓縮演算法

此篇文章是《程式設計師需要了解的硬核知識》第五篇文章,歷史文章請戳 程式設計師需要了解的硬核知識之記憶體 程式設計師需要了解的硬核知識之CPU 程式設計師需要了解的硬核知識之二進位制 程式設計師需要了解的硬核知識之磁碟 之前的文章更多的介紹了計算機的硬體知識,會有一些難度,本篇文章的門檻會低一些,一起來看一下

程式設計師需要知識作業系統入門

對於程式設計師來說,最莫大的榮耀莫過於自己的軟體被大多數人使用了吧。 歷史文章請戳 程式設計師需要了解的硬核知識之記憶體 程式設計師需要了解的硬核知識之CPU 程式設計師需要了解的硬核知識之二進位制 程式設計師需要了解的硬核知識之磁碟 程式設計師需要了解的硬核知識之壓縮演算法 本篇文章作為作業系統的入門文章,

程式設計師需要知識組合語言(一)

之前的系列文章從 CPU 和記憶體方面簡單介紹了一下組合語言,但是還沒有系統的瞭解一下組合語言,組合語言作為第二代計算機語言,會用一些容易理解和記憶的字母,單詞來代替一個特定的指令,作為高階程式語言的基礎,有必要系統的瞭解一下組合語言,那麼本篇文章希望大家跟我一起來了解一下組合語言。 組合語言和原生代碼 我們

程式設計師需要知識組合語言(全)

之前的系列文章從 CPU 和記憶體方面簡單介紹了一下組合語言,但是還沒有系統的瞭解一下組合語言,組合語言作為第二代計算機語言,會用一些容易理解和記憶的字母,單詞來代替一個特定的指令,作為高階程式語言的基礎,有必要系統的瞭解一下組合語言,那麼本篇文章希望大家跟我一起來了解一下組合語言。 組合語言和原生代碼 我們

程式設計師需要知識控制硬體

應用和硬體的關係 我們作為程式設計師一般很少直接操控硬體,我們一般通過 C、Java 等高階語言編寫的程式起到間接控制硬體的作用。所以大家很少直接接觸到硬體的指令,硬體的控制是由 Windows 作業系統 全權負責的。 你一定猜到我要說什麼了,沒錯,我會說但是,任何事情沒有絕對性,環境的不同會造成結果的偏差。

程式設計師需要知識二進位制

我們都知道,計算機的底層都是使用二進位制資料進行資料流傳輸的,那麼為什麼會使用二進位制表示計算機呢?或者說,什麼是二進位制數呢?在拓展一步,如何使用二進位制進行加減乘除?二進位制數如何表示負數呢?本文將一一為你揭曉。 ## 為什麼用二進位制表示 我們大家知道,計算機內部是由IC電子元件組成的,其中 `CP

每一個程式設計師需要的10個Linux命令

作為一個程式設計師,在軟體開發職業生涯中或多或少會用到Linux系統,並且可能會使用Linux命令來檢索需要的資訊。本文將為各位開發者分享10個有用的Linux命令,希望對你會有所幫助。 以下就是今天我們要介紹的Linux命令: man touch, cat an

Java程式設計師需要的兩種伺服器設計模型

我們在IO模型和Java網路程式設計模型中,對IO有了一定的理解。這一篇,主要講解基於事件驅動的兩種是在原來基礎上的擴充套件。在基於事件驅動的網路程式設計模型中,Reactor和Proactor模型是兩種常用的IO設計模型。 我們知道BIO(阻塞IO)只有等待阻塞方法結束了,操作權才會交還給呼叫

程式設計師不得不瞭解的知識大全

我們每個程式設計師或許都有一個夢,那就是成為大牛,我們或許都沉浸在各種框架中,以為框架就是一切,以為應用層才是最重要的,你錯了。在當今計算機行業中,會應用是基本素質,如果你懂其原理才能讓你在行業中走的更遠,而計算機基礎知識又是重中之重。下面,跟隨我的腳步,為你介紹一下計算機底層知識。 CPU 還不瞭解 CPU

程式設計師需要依賴衝突的原因以及解決方案

0x00. 前言 依賴衝突是日常開發中經常碰到的過程,如果運氣好,並不會有什麼問題。偏偏小黑哥有點背,碰到好幾次生產問題,排查一整晚,最後發現卻是依賴衝突的引起的問題。 沒碰到過這個問題同學可能沒什麼感覺,小黑哥舉兩個最近碰到例子,讓大家感受一些。 例子 1: 我們公司有個古老的業務基礎包 A。B,C 業

需要的HTTP知識都在這裏

gem agent pre 基本 語法 lan 重要 詳細 thead 前言 HTTP網絡通信協議在任何的開發工作中都起到非常重要的作用,今天,我們來講解下關於HTTP的相關知識。 目錄 5分鐘全面了解HTTP相關知識.png 計算機網絡相關知識 計算機網絡體

Android開發中需要的session知識

Cookie和Session都為了用來儲存狀態資訊,都是儲存客戶端狀態的機制,它們都是為了解決HTTP無狀態的問題而所做的努力 Session可以用Cookie來實現,也可以用URL回寫的機制來實現 Cookie和Session有以下明顯的不同點: 1)Cookie將狀態儲存

Java入門需要的一些知識

目錄 Java各版本的含義 Java的特性和優勢 Java應用程式的執行機制 JVM、JRE和JDK Java各版本的含義        JavaSE(Java Standard Edition):標準版,定位在個人計算

前端需要的http知識

一、五層協議1. OSI(Open System Interconnection 開放式系統互聯)七層協議 1)應用層 2)表示層 3)會話層 4)傳輸層 5)網路層 6)資料鏈接層 7)物理層2. TCP/IP四層網路協議 (Transmission Control Protocol 傳輸控制協議) 1)應

學資料結構的意義需要的基礎知識

本人為初學者,此文為學習的一些總結,如有不當之處,還請多多包涵。 要說起學習資料結構的意義,不得不先說一下,CPU,記憶體,磁碟(硬碟或固態硬碟)。 首先,CPU中的儲存空間很小,基本可以忽略不計,(造價太貴),其次是記憶體(造價也很貴),再其次是磁碟(硬碟一般很大,因為造價最便宜)

需要的Smbios知識

什麼是Smbios  Smbios(system management bios)是主機板或者系統製造廠商以標準格式顯示產品資訊所遵循的統一規範,Smbios規範標準定義了收集的電腦資訊都包含哪方面的資訊?其實就是包含很多c語言中的結構體,每一個結構體代表一種資訊。  每個主機板廠商或者