在正式開始學習 Linux 操作系統之前,有必要先回顧/學習一下計算機和操作系統的基本知識,為我們在後續的學習中鋪路搭橋,在了解計算機一些基礎原理的條件下再去進行學習,理解應該會更透徹一些。我會從一個程序的簡單構成開始,逐步介紹我對計算機工作原理的一些理解,希望能夠給大家做一個參考。由於中間涉及的知識很多,有些內容我沒有進行深究,存在許多漏洞,因此僅供參考。
程序是由什麼構成的?簡單說來,這裡有一個公式:程序 = 數據 + 指令。這是程序員再熟悉不過的了,數據自不用多說,指令就是告訴程序,怎樣操作目標數據,這個“操作”不僅僅是在數據之間進行簡單的運算,而是包含了操作這些數據的一系列行為的集合,比如做兩個數字的加法運算,除了本身的加法這一指令之外,我們還需告訴CPU從哪裡讀取目標數據,以及完成加法操作後將數據放到何處等。
計算機的底層是二進制數據,因此不管是指令還是數據,最終都會以二進制的形式保存。對於CPU,怎麼區分我們傳入的二進制代碼是數據還是指令呢?這就需要不同的線路將數據和指令進行分離。
一個CPU的核心部件包括三個:運算器,控制器和寄存器。
運算器是執行運算操作的地方,它會接收數據的輸入,在內部計算完成之後將數據輸出。
光有運算器還是不夠的,由於我們的指令和數據都是保存在內存中,運算器需要知道在內存的哪個地方讀取數據,哪個地方讀取指令,以及在計算完成之後將數據放到哪裡等。這些信息就是由控制器提供的。
寄存器是做什麼的?寄存器也叫暫存器,顧名思義,就是暫時保存數據的地方。寄存器位於CPU的內部,用以保存等待處理或者處理過的數據。為什麼需要寄存器?比如我們做一個四則運算,每次運算之後的結果應該保存在哪裡?內存嗎?如果將每步運算結果保存在內存中,無疑是加大了CPU的開銷,因為要在每步計算完成之後將其放入內存中,然後再讀取出來,再輸入到運算器進行計算……這很麻煩,開銷很大,並且浪費了CPU寶貴的性能。寄存器的作用就是將數據暫時存放在CPU的內部,那麼CPU在訪問這些數據的時候,效率將會得到極大的提高(就近原則)。
計算機有很多I/O設備,比如鍵盤,鼠標,光驅,磁盤,硬盤等。如果我們敲擊了鍵盤,CPU怎麼知道我們操作的是鍵盤而不是鼠標或者光驅呢?我們可以將敲擊鍵盤這個行為當做一個事件,這個事件是偶發的,CPU如果想偵測到這個事件,有兩個方式可以選擇:
和CPU一樣,我們都非常勤(lan)快(duo),喜歡輕松又有保障的活。對於輪詢機制,有一個問題:事件是有隨機性的,有可能CPU輪詢了一天,用戶並沒有做出任何操作,那不是虧大發了嗎。所以我們肯定會選擇中斷機制啦,事實上CPU采用的也正是中斷機制。
上面說了CPU的中斷機制。那麼問題來了,CPU又怎麼知道是鼠標還是鍵盤上產生了事件?
這時候中斷控制器就登場了。中斷控制器和CPU的針腳相連,如果把中斷控制器比做蜘蛛,它將通過周圍遍布的蛛網和計算機上的I/O設備連接,如果某個I/O設備上產生了一個事件,就會發生電信號的變化,這個變化通過蛛網傳給中斷控制器,控制器也就知道是哪一個設備發生了響應,進而將訊息傳遞給CPU。
對於計算機中的數據處理,有高速低速之分,或者高頻和低頻之分。南橋和北橋就是分別用來傳輸這兩種類型的數據,北橋在物理上距離CPU較進,用來處理高速高頻的數據。大多數的I/O設備都在南橋上,這些設備經過南橋匯總後,通過線路連接傳到北橋,再由北橋傳給CPU。
舉例:一個網頁同時給一百萬個用戶訪問,網頁文件存放在服務器的硬盤中,服務器的每次響應都需要從硬盤中讀取這個網頁,由於硬盤連接在南橋,讀取速度和頻率較慢,這會產生嚴重的服務器延遲(比如一個硬盤最高一次只能進行10萬次的數據輸出,那麼剩下的九十萬用戶就得等著),這是非常搞糟的體驗。因此,現在的服務器很多都采用了固態硬盤,並將硬盤直接連接在北橋上,以獲取更高的讀取性能。
主頻可以理解為CPU的計算能力,主頻越大,CPU在單位時間的計算能力越強。CPU的頻率可以達到1GHZ,而內存的讀取速度遠遠低於CPU的頻率。由於木桶原理,即使CPU的速度再高,內存的讀取效率跟不上,計算機的整體性能也難以提高。為此我們可以造更快的內存,但是這種方式造價極高。於是出現了緩存技術,緩存技術是在速度和造價之間的擇中原則。
速度越快的部件,造價越高。因此最快的核心部件,我們只要一小塊,然後在其外圍放性能稍低(相對於核心)造價也稍低的設備,這就是緩存。CPU有一級緩存,二級緩存...緩存在CPU和內存之間起到了承上啟下的作用。
緩存的工作,需要遵循程序的局部性原理,程序的局部性原理分為時間局部性和空間局部性。
程序的局部性原理,不僅應用在CPU的工作上,也用在碼農的編碼過程中,運用時間局部性和空間局部性,可以顯著提高程序的運行效率。
舉例:
我們知道所有程序必須要編譯機器碼(二進制)才能被計算機識別和執行,我們也知道匯編是對機器碼的抽象,讓我們不用直面枯燥難懂的機器碼,而使用易於人類理解的語言進行編程。匯編語言也叫作微碼,是CPU廠商為我們暴露出來(可以理解為接口),通過微碼我們可以進行針對CPU的編程。需要注意的是,不同的CPU架構不同,對於同一操作,其暴露出的微碼也不盡相同。因此針對不同的CPU,我們需要分別對他們進行編程。盡管有些許蛋疼,但總比使用機器碼編程好太多了。
高級語言是對匯編語言更高一層的抽象,結合一些額外的機制,來彌合CPU之間的不同。然後暴露出公共的API程序員調用,盡管對於這份API,其在不同的平台下可能會進行不同的實現,但是對於程序員,我們只需調用這個API,就可以實現平台的兼容,而我們自己再也不用考慮硬件的差異性了。
下面是一些常見的架構:
單核的CPU,在某個時刻只能進行一次運算,為什麼我們的程序看上去是並行執行呢?
這裡需要引入切割機制,切割機制可以分為CPU切割和內存切割。
CPU切割:把CPU按照時間片(Slice)切割。比如一個Slice是5ms,那麼每個程序只能運行5ms,下一個5ms就該換一個程序運行了(當然也可能仍然運行這個程序,具體取決於CPU的分配機制)。同時,CPU還應該有一個機制來記錄程序的運行狀態,以便程序在下一次運行的時候可以從先前的狀態繼續執行。
內存切割:引入分段機制,想象兩個程序同時運行,而且都從內存的某一個編號開始占用(比如0x00000),那麼後面的程序就會破壞掉前面程序的數據。現在引入了內存分段的機制,將內存分為一塊塊的區域,這些區域內部都從0x00000開始,那麼程序就不會相互干擾了。
上例中,怎麼保證每個程序在每個時間片中程序都是嚴格執行呢?如果程序賴著不走怎麼辦?
這就需要引入操作系統了,操作系統就是用來對程序進行調度,以及協調其他程序進行工作,是位於硬件和應用軟件之間的中間層。有了操作系統,任何程序都不能直接和硬件打交道,而是要經過操作系統這一中間層進行處理。
同一份程序,在不同的操作系統運行的效果不同的解釋:程序要執行某一個功能,將請求交給操作系統,操作系統通過調用相關的庫來執行,不同的操作系統實現實現某種庫的方式可能不一樣,那麼程序的效果也就不一樣了。
以Windows為例,為什麼雙擊桌面上的圖標就可以運行相應的程序,或則在命令行中輸入calc就可以打開計算器呢?
上面的兩種操作:雙擊圖標和在命令行輸入命令回車,本質上都是指令。我們的指令需要操作系統傳到內核(kernel)中,然後實現程序的運行。接收指令的這個東東,就是人機交互接口(Shell)。Shell包括兩種:
不管是GUI還是CLI,目的都是向內核傳送指令,實現某項操作,對於內核來說,通過什麼方式傳送指令並不重要。
操作系統內核的功能包括:
終於講到Linux了,照例在此之前應該講講Linux的起源,Unix,Bell實驗室,Apple和Windows等等,但是歷史性的東西並不是這篇博文的重點,這裡就暫且跳過。
Linux是操作系統,也就是軟件,軟件要想運行,就需要編譯成相應的二進制代碼才能運行。
上面我們也談到過,不同的CPU架構,完成某項操作的實現方式可能不同,因此在編譯操作系統的時候不應該出現交叉編譯的情況(比如在AMD上編譯在Intel上運行)。
也就是說,想要在某個平台上使用操作系統,需要針對這個平台進行編譯。這無疑增加了學習和使用的難度,作為初學者而言,這是噩夢。於是出現了一些組織,他們來對Linux的源碼和外圍的一些軟件進行編譯集成,然後發行出來,這就是Linux的發行版。這樣的公司或組織有RedHat,Debian等。
早期的軟件都是隨著內核一起打包發布的,這樣有個明顯的缺點:不利於軟件的管理,如軟件的安裝,卸載等。於是出現了軟件包管理器,用來方便軟件的管理,安裝,卸載等。比較著名的有dpt(debian),rpm(redhat)等。
基本格式為:命令 = 命題主體 + 選項 + 參數。
命令執行:輸入命令後,由shell將指令發送給kernel,kernel即對該指令進行判斷,決定是否執行。
命令可以跟上選項,用來修正命令的執行方式。格式為:
短選項多個選項可以組合:-a -h 可以組合成 -ah。長選項通常不能組合。
命令的參數:命令的表示命令的作用對象。如:ls -ah /etc 為列出 /etc 目錄下的文件,如果不加參數,默認為當前目錄。
Linux(我這裡使用的是RedHat)下一般有6個終端可以使用,可以按鍵盤組合鍵 ctrl + alt + f1~f6切換。
$ startx & -> 啟用圖形界面。
Linux圖形界面的類型:Gnome(C),KDE(C++),XFace(輕量級圖形界面)。
Linux命令行界面類型:bash csh zsh ksh....
任何跟shell相關的啟動的程序,只要shell關了,這個程序也就關了(這不廢話嗎)。
su:切換用戶(switch user 縮寫)。
su root [-l] :半切換,完全切換。
passwd:修改密碼,連輸兩次即可。
對於root,可以隨便修改,對於普通用戶,需要滿足密碼復雜性規則。
這篇文章主要介紹了CPU和操作系統的簡單工作原理,涉及到的概念有:運算器,控制器,寄存器,總線,南北橋,操作系統,shell等。算是對基礎知識的一些總結,由於沒有深刻學習,文章中有很多漏洞,更有許多模糊的知識沒有加以說明。文章組織不夠嚴謹,只是單純的將知識點分條羅列,邏輯性有待加強。
就以這篇文章開始,一步步打開Linux的大門吧。
作者:Charleylla 轉載請注明出處:http://www.cnblogs.com/charleylla/p/5967255.html
http://xxxxxx/Linuxjc/1165395.html TechArticle