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

2020-12-11 CSDN

作者 | cxuan

責編 | maozz

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

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

作業系統功能的歷史

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

在計算機尚不存在作業系統的年代,完全沒有任何程序,人們通過各種按鈕來控制計算機,這一過程非常麻煩。於是,有人開發出了僅具有加載和運行功能的監控程序,這就是作業系統的原型。

通過事先啟動監控程序,程式設計師可以根據需要將各種程序加載到內存中運行。雖然仍舊比較麻煩,但比起在沒有任何程序的狀態下進行開發,工作量得到了很大的緩解。

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

類似的想法可以共用,人們又發現有更多的應用程式可以追加到監控程序中,比如硬體控制程序,程式語言處理器(彙編、編譯、解析)以及各種應用程式等,結果就形成了和現在差異不大的作業系統,也就是說,其實作業系統是多個程序的集合體。

我在《程式設計師需要了解的硬核知識之CPU》 這篇文章中提到了彙編語言,這裡簡單再提一下。彙編語言是一種低級語言,也被稱為符號語言。彙編語言是第二代計算機語言,在彙編語言中,用助記符代替機器指令的操作碼,用地址符號或標號代替指令或操作數的地址。用一些容易理解和記憶的字母,單詞來代替一個特定的指令,比如:用ADD代表數字邏輯上的加減,MOV代表數據傳遞等等,通過這種方法,人們很容易去閱讀已經完成的程序或者理解程序正在執行的功能,對現有程序的bug修復以及運營維護都變得更加簡單方便。

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

把作業系統放在第一位

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

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

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

#include<stdio.h>#include<time.h>voidmain(){// 保存當前日期和時間信息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>voidmain(){// 打開文件 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 ,可以製作出運行該硬體的新應用。

【End】

相關焦點

  • 躲在被窩偷看10W字:作業系統+程式設計師必知硬核知識大全,愛了
    相對而言,那些還沒有開始學,萌芽了這個想法的程式設計師會有的顧慮就是:Code很難嗎?需要多長時間呀?真的可以堅持得住嗎?其實無論你是已經選擇了還是沒有選擇的,都會有很多問題接踵而來的,這不就是很正常的運作嗎?只要你準備好了,並且堅持了,那麼你就成功了,誰的成功是一步登天的,不要輕易選擇,更不要輕易地去放棄。
  • 計算機基礎知識總結與作業系統 PDF 下載
    第一本是程式設計師必知的硬核基礎知識,這是一本非常入門的經典 PDF,看完能讓你對計算機有一個基礎的了解和入門,是培養你 內核的基礎,我們看下目錄大綱基本上涵蓋了計算機所有基礎知識,從 CPU 到內存、講解什麼是二進位、磁碟、壓縮算法、作業系統、彙編等知識。
  • 涵蓋了所有計算機底層知識總結與作業系統的實戰教程,建議收藏
    第一本是程式設計師必知的硬核基礎知識,這是一本非常入門的經典 PDF,看完能讓你對計算機有一個基礎的了解和入門,是培養你 內核 的基礎,我們看下目錄大綱基本上涵蓋了計算機所有基礎知識,從 CPU 到內存、講解什麼是二進位、磁碟、壓縮算法、作業系統、彙編等知識。
  • 高級程式設計師的修養,不得不知的硬核知識——CPU
    大家都是程式設計師,大家都是和計算機打交道的程式設計師,大家都是和計算機中軟體硬體打交道的程式設計師,大家都是和CPU打交道的程式設計師,所以,不管你是玩兒硬體的還是做軟體的,你的世界都少不了計算機最核心的 - CPUCPU是什麼CPU 的全稱是 Central Processing Unit,它是你的電腦中最硬核的組件,這種說法一點不為過
  • 程式設計師需要了解的硬核知識之壓縮算法
    在認識算法之前我們需要先了解一下文件是如何存儲的1. 文件存儲文件是將數據存儲在磁碟等存儲媒介的一種形式。程序文件中最基本的存儲數據單位是字節。文件的大小不管是 xxxKB、xxxMB 等來表示,就是因為文件是以字節 B = Byte 為單位來存儲的。文件就是字節數據的集合。
  • 節日快樂,程式設計師!今天,500萬程式設計師線上線下引爆星城
    大會以硬核技術和開源文化為主題,囊括嶽麓尖峰對話、2020開源技術英雄大會、20+場熱門技術分論壇/峰會,以及」引才入湘「專場活動、創意互動科技嘉年華、星光熠熠的開源英雄晚宴等,研討議題包括開源技術及生態建設、作業系統及硬體創新、開源社區及商業化發展、金融科技、人工智慧、區塊鏈和視頻雲等。大會吸引到上千名開發者現場參加,500萬+程式設計師線上線下關注互動。
  • IT網際網路行業程式設計師崗位有些什麼類型?
    程式設計師之間的差異其實是非常大的,只有很了解程式設計師的人才能完全了解這一點,雖然有大多數的高層管理者對所有的程式設計師都一視同仁,還是有企業是把程式設計師當做工具、資源看待,做個頭腦清醒的程式設計師,你的職業生活會更精彩。
  • 程式設計師必練六項目:從數據結構到作業系統,計算機教授為你劃重點
    如果你還在糾結,應該拿什麼項目來開始自己的編程練習,不妨來看看這份「程式設計師都應該嘗試的挑戰性項目」清單。這是田納西大學助理教授奧斯汀·亨利(Austin Z. Henley)結合自身經驗,給出的良心推薦。不僅總結了知識要點,讓你在學習中有的放矢,還貼心整理了拓展閱讀資料。
  • 成為一名優秀的程式設計師,應該如何開始並學習哪些計算機知識呢?
    程式設計師是現今比較熱門的職業,程式設計師也稱為軟體開發人員或者軟體工程師。如果要想成為一名程式設計師,必須學習相應的知識和技能。那麼一名優秀的程式設計師需要學習哪些計算機知識?如何開始呢?計算機基礎知識主要包括:軟硬體基礎知識中英文打字(特別是英文打字,程式設計師編寫代碼需要很快的文字錄入速度)Windows作業系統的基本操作
  • 每個程式設計師都該了解一點 Linux 內存管理知識
    作業系統裡內存管理的主要作用是,進程請求內存的時候為其分配可用內存,進程釋放後回收內存,並監控內存的使用狀況。最簡單的內存管理方式是所有運行的進程對所有內存具備訪問權限,這種方式下,進程必須包含對所需硬體操作的全部代碼,能找到對應的內存地址,然後將自己的數據載入內存。以這種方式進行開發,內存的利用率上不去不說,每個程式設計師差不多都會被內存管理編程搞到吐血,所以這件事得交給作業系統來做。
  • 作業系統與應用商店之爭:邊界在哪裡?
    根據安智起訴狀,用戶在通過瀏覽器下載安智市場APP及部分遊戲APP時,華為手機作業系統會彈出「該應用未經華為應用市場檢測,請謹慎安裝」提示,用戶選擇「我已充分了解風險,繼續安裝」後,會彈出安全提示「該應用未經華為市場安全檢測,請謹慎安裝。繼續安裝或使用可能造成設備損壞或數據丟失。」
  • win10作業系統高級選項菜單的應用,您了解多少
    同樣是圖形化操作界面,作業系統出現故障的時候用的比較多。今天,我們就來了解一下win10系統的高級選項菜單。如何進入win10系統的高級選項菜單win10作業系統無法正常啟動會自動進入高級選項菜單嘗試修復。如果作業系統可以正常的啟動,需要進入高級啟動菜單。
  • 可能是最好的計算機基礎知識總結,附PDF下載
    第一本是程式設計師必知的硬核基礎知識,這是一本非常入門的經典 PDF,看完能讓你對計算機有一個基礎的了解和入門,是培養你 內核的基礎,我們看下目錄大綱基本上涵蓋了計算機所有基礎知識,從 CPU 到內存、講解什麼是二進位、磁碟、壓縮算法、作業系統、彙編等知識。
  • 到底什麼是程式設計師思維以及該如何培養程式設計師思維
    通常來說,不同崗位和級別的程式設計師需要具備不同的思維方式,因為需要解決的問題通常有較大的區別。通常程式設計師分為兩大類,一類是研發級程式設計師,另一類是應用級程式設計師。研發級程式設計師通常考慮的是系統級問題,比如平臺的開發及實現,而應用級程式設計師通常解決的是行業問題,比如具體的業務邏輯如何實現。
  • Java初級程式設計師需要具備哪些知識才能勝任相關的開發崗位
    由於Java程式語言本身屬於全場景程式語言之一,所以不同領域對於Java初級程式設計師的要求也會有所不同,比如Web開發領域和大數據開發領域對於Java程式設計師的知識結構就有不同的要求,另外隨著雲計算的廣泛應用,Java程式設計師也在逐漸向全棧方向發展。
  • 編碼人員,程式設計師,開發人員和軟體工程師之間的差異
    許多人聲稱,這種差異取決於他們的教育和他們在承運人中取得的成就。這可能是事實,但有些人聲稱你正在與之合作的公司決定你是程式設計師還是編碼員。但是這使得它僅僅是一個職位的差異,而每個學期都有巨大的環境。讓我們來看看編碼員,程式設計師,開發人員和軟體工程師之間的確切區別是什麼?1.編碼員編碼員是負責編寫代碼並且能夠使得程序正常運行的人員。編碼員有能力編寫代碼來製作軟體,他們不僅能夠編寫應用程式,還可以製作視頻遊戲和其他許多東西。但是編碼員不能夠單獨開發軟體,在製作軟體的時候需要一定的幫助,例如設計和測試方面。
  • Windows 10X作業系統:但您需要了解它未知的部分功能
    Windows 10X是為新PC構建的新版Windows作業系統,基於現在的dindows10構建。但是,舊版Win 32應用程式應該會在系統發布以後通過一些技術手段增加支持。如果這樣做,Win32應用程式將默認在安全容器中運行,這意味著這些舊應用程式在關閉時不會影響系統性能和電池壽命。因此,Windows 10X是一個更加安全和穩定的作業系統。
  • 培訓班出身的程式設計師,和科班程式設計師有什麼區別?
    一種認為是否為計算機相關專業對於程式設計師的影響不大,畢竟編碼是一個實踐性很強的工作,用的技術與語言需要在實際工作中不斷積累,學校裡學的都是偏理論性的知識,對於實際工作意義不大。另一種認為科班程式設計師和非科班程式設計師即使看似code水平差不多,在初級階段也看不出太大差距。但是一旦進階到中高級,差距就日漸顯現。
  • 嵌入式程式設計師需要了解的幾個問題
    各位未來的嵌入式程式設計師,你想知道是否能夠成為一個出色的工程師,你是否想知道自己對嵌入式了解程度如何,那麼請關注一下我們接下來討論的問題。   預處理器(Preprocessor)  1.標識#define在宏中應用的基本知識。這是很重要的,因為直到嵌入(inline)操作符變為標準C的一部分,宏是方便產生嵌入代碼的唯一方法,對於嵌入式系統來說,為了能達到要求的性能,嵌入代碼經常是必須的方法。  2)。 三重條件操作符的知識。這個操作符存在C語言中的原因是它使得編譯器能產生比if-then-else更優化的代碼,了解這個用法是很重要的。  3)。
  • 能夠提升程式設計師工作效率的一些網站、應用插件和小技巧!趕緊收藏
    它可以運行在多個作業系統上,包括類Unix和Microsoft Windows以及Android。最主要的是沒有廣告,可以任意倍數播放,功能專一,沒有亂七八糟的功能,專注於視頻播放,十分推薦,可以在官網mpv.io/進行下載。