1.馮諾依曼體系結構
我們常見的計算機,如筆記本、臺式機。我們不常見的計算機,如服務器,大部分都遵守馮諾依曼體系結構。
CPU:運算器和控制器組成。運算器主要工作是做算術運算和邏輯運算。控制器主要工作是協調設備之間信息流動的。
輸入設備:鍵盤、鼠標、網卡等。
輸出設備:顯示器、網卡、打印機等。
存儲器:存儲器指的是內存,它的特點是掉電易失。
SSD固態硬盤或磁盤在馮諾依曼體系結構中它們不是存儲器,它們是輸入或者是輸出設備。
設備是用總線連接的,被集成在了主板上。將設備連接起來的目的是為了數據流動(本質就是設備之間數據的來回拷貝,拷貝的整體速度是決定了計算機的效率指標)。
輸入設備和輸出設備它們的效率是比較慢的,cpu的速度又非常的快,如果中間沒有了存儲器這樣的設備,那么計算機的整體速度就取決于輸入或輸出設備,為了解決這種問題,于是在硬件上加入了存儲器。
存儲器比輸入或輸出設備要快,比CPU慢,輸入設備就將數據放到存儲器中,CPU在存儲器中去讀取執行,將結果放入到存儲器,存儲器在轉交給輸出設備,這樣一來計算器的整體速度就變為了以存儲器為主。
當CPU在忙的時候,輸入設備將數據放入到存儲器中(這個工作是預先加載),當CPU不忙的時候直接到存儲器中讀取數據,將處理好的結果放入到存儲器中(這個工作是緩存),輸出設備直接在存儲器中去讀取,這樣一來計算機的效率就變得很高。
2.操作系統是如何管理底層硬件的?
第一個被加載的軟件是操作系統。操作系統是一個軟件,它的工作是對軟件資源和硬件資源進行管理。
計算機的層狀結構圖:
計算機的軟硬件結構是層狀的。最底層是硬件,硬件有網卡,硬盤,鍵盤,顯示器,CPU等等,這些硬件底層構成并不是隨便放的,都是以馮諾依曼體系結構來進行組織的。
操作系統和底層硬件之間還有一個驅動程序,驅動程序是一個軟件,專門去控制對應的軟件,例如網卡驅動控制的是網卡,網卡的讀,寫,狀態,開和關等相關操作接口,都在網卡驅動里,操作系統直接去調用網卡驅動就能控制底層硬件的網卡(幾乎每一種底層硬件都有自己的驅動程序)。
在計算機的層狀結構圖中我們先從往下去研究,來學習操作系統是如何管理底層硬件的。
操作系統類似于現實生活中的領導,領導的主要工作是管理自己底下的員工,而管理的核心就是去做出正確的決策。底層硬件類似于現實生活中的普通員工,它們的主要工作是做執行,執行領導安排的任務。驅動程序類似于現實生活中的組長,它們的主要工作是保證管理決策落地,催促小組成員完成任務(操作系統做決策,底層硬件去執行,驅動程序保證決策落地)。
下面就以校園生活為例:
校長---------操作系統
輔導員----------驅動程序
學生-----------底層硬件
在學校中,校長是管理者,學生是被管理者,大多數的學生連校長的面都沒有見過,但是各方面都被安排的明明白白的,例如:該在什么教室上什么課,住在哪一間寢室,是否可以拿到獎學金和助學金等等。所以管理者和被管理者根本不需要見面,管理的本質不在于對人做管理,而在于對人的信息(數據)做管理,例如:校長拿到一個學生的信息(數據),該學生各科成績優秀,且是學生會的主席,對學校有重大貢獻,校長就可以做出決策,讓該學生拿到助學金。管理者核心是做決策,根據數據來做決策。
管理者和被管理者面都沒有見過是如何拿到信息(數據)的呢,校長和學生沒有見過面,但是校長卻能知道學生的信息(數據),原因是因為輔導員,輔導員將學生的信息(數據)上交到了校長那里,同時輔導員還要保證管理決策落地,如果校長想組織一場運動會,不需要挨個去通知學生,只需要告訴輔導員,輔導員就會去通知學生。
管理者在面對大量的被管理者的時候,數據量是必然非常大的,因為對人的管理需要轉化成對數據的管理,數據量非常大的時候(學生非常的多),校長該如何去管理???
假設校長在沒有升職前是一個C語言的老師,他是一個懂編程的校長,在面對大量學生的信息(數據)時就想到了數據結構的鏈表,根據學生的信息(數據)去創建一個節點,例如:
將根據學生的信息(數據)所創建的節點以鏈表的形式鏈接起來,每新來一個學生就新增一個節點,將被開除的學生或者是畢業的學生就釋放掉對應的節點,還可以以身高、成績為鍵值進行排序來找出身高最高的學生或成績最好的學生進行做出決策,這樣一來對學生的管理就變成了對鏈表的增刪查改。對管理的一個計算機的建模的過程可以簡化為六個字:先描述,在組織。我們在C語言上描述一個事物只能用結構體來描述,先描述就是用結構體去描述對應的事物,比如校長用結構體去描述一個學生的基本信息,然后在使用鏈表將用結構體來描述的事物進行組織起來,這樣一來校長對學生的管理就變為了對數據結構中鏈表的增刪查改。
底層硬件雖然有很多,不同,但是硬件都有它的名稱,狀態,操作方法,對應的屬性。操作系統對底層硬件的管理也是先描述,在組織,先將底層硬件使用結構體抽象的描述出來,例如:
再將用結構體抽象描述起來硬件使用鏈表的形式組織起來。從此往后,操作系統對底層硬件的管理就變為了對數據結構鏈表的增刪查改,例如:操作系統想找一個網卡,就可以根據網卡的名稱來遍歷一遍鏈表,然后再根據它的驅動做出管理,如:發送數據,關閉網卡。如果一個設備突然壞掉了,操作系統在鏈表中將這個壞掉的設備節點釋放掉。
操作系統不僅要管理底層硬件同時也需要將驅動程序給管理起來,管理的方法也是先描述,再組織。使用結構體將驅動程序描述出來,里面的屬性有:驅動的名稱,驅動的類別,驅動的方法,驅動的狀態,驅動的版本等等....,然后再給每一個驅動程序創建一個結構體對象,再使用數據結構組織起來,如鏈表。之后操作系統對驅動程序的管理就變為了對鏈表的增刪查改。
總結:
操作系統的管理工作:先描述,再組織。
3.系統調用接口
計算機的層狀結構圖:
在前面說過,操作系統是一個軟件,它的主要工作是管理好軟硬件資源,對上層應用軟件提供良好的運行環境。判斷一款操作系統好不好主要是看這三點:穩定(軟硬件資源管理的非常好,不會經常出現藍屏死機現象)、高效(軟硬件資源管理的代碼算法部分寫的非常良好)、安全(用戶的數據不會泄露出去)。
為什么要有系統調用接口???舉個例子:在現實生活的銀行,如果我們要去銀行中存錢或取錢,銀行肯定不會讓我們跑到倉庫里自己去放錢或取錢,萬一有人要存5000,實際上只在倉庫里放了一塊錢,還順帶在倉庫里拿了一部分錢,所以銀行會擔心群眾中有壞人,它不會將自己全面暴露出來,但是為了給我們提供服務,銀行就設置了柜臺(人工服務),ATM機,讓我們去存錢或者是取錢,這樣一來,銀行就保證了自己的安全,也為群眾提供了應有的服務。
同樣也是如此,我們要去硬盤中讀取數據,操作系統肯定不會讓我們直接去遍歷它管理硬盤那一個數據結構中的某個字段,萬一我們把其他人的數據也拿去了怎么辦,所以操作系統不能將自己全面暴露出來,這樣做不安全。為了解決這個問題,所以操作系統和用戶之間有了系統調用接口這一層,系統調用接口是操作系統提供的一批接口,只允許用戶通過系統調用接口來訪問操作系統內部。
Linux操作系統是用C語言實現的(有少部分匯編),所以系統調用接口其實就是用C語言實現的函數,它是操作系統提供的系統調用函數。有些函數是有輸入、輸出的,所謂的輸入其實就是用戶想將數據交給操作系統,輸出就是通過接口函數將數據拿給用戶。
操作系統給上層用戶提供的兩方面的功能:1.數據方面的支持(如:用戶想拿到文件數據、系統當中有多少進程等),2.功能方面的支持(如:用戶想將數據通過網卡發送到網絡,將數據寫入到磁盤等)。
總結:任何人都不能直接去訪問操作系統內部的數據,必須通過操作系統提供的接口函數才能去訪問。
用戶不能直接去訪問操作系統內部的數據,能不能直接繞過操作系統去控制底層硬件???答案是不能的,假設可以,如果用戶一直在控制著網卡,網卡就會處于非常忙的狀態,這時操作系統有個任務需要使用網卡,發現網卡一直被用戶給控制著,這個任務就無法進行下去,那么操作系統的管理工作還做不做了。所以用戶不能越級去控制底層硬件,必須通過系統提供的系統調用接口才行。
重新去理解printf函數和scanf函數
在學習C語言的時候,我們肯定使用printf函數和scanf函數。以printf函數為例,printf打印的消息是在顯示器上顯示的,顯示器是一個硬件,肯定是被操作系統管理起來的,printf是C語言提供的標準輸出函數,它有能力直接在顯示器上打印內容嗎??答案是不能的,用戶不能越級去控制底層硬件,雖然我們不知道printf是怎么實現的,但是它的內部肯定封裝并且調用了系統調用接口函數才能向顯示器上打印內容。scanf同樣也是如此,必須通過系統調用接口函數才能讀取到用戶在鍵盤上輸入的數據。
不僅是C語言,其他語言也是如此,只要是影響到底層的硬件就必須通過系統調用接口函數才能去訪問硬件。
雖然系統調用接口本來就是給用戶準備的,但是要對操作系統有一定的了解才能把系統調用使用的好,因為系統調用的參數和返回值必須得對操作系統有一定的認知,如果不懂的話使用系統調用接口會非常難受,所以就有人對系統調用接口進行了封裝,形成了lib(庫),提供給用戶進行開發操作,減少使用者使用成本。
所以我們雖然沒有使用過系統調用,但是通過學習計算機語言時也間接使用了,例如C語言將訪問顯示器和鍵盤的系統調用接口封裝成了printf和scanf函數,所以才有了C標準庫這樣的概念。
系統調用和庫函數之間的關系!!
系統調用是操作系統提供,庫函數是用戶提供(如C標準庫),它們之間的關系是上下層的關系。并不是所有的庫函數都會去調用系統調用,只要是庫函數調用了系統調用它們的關系就是上下層的關系(庫函數在上,系統調用在下)。
4.總結
我們通過學習馮諾依曼體系結構了解了計算機的組成結構,在通過計算機的層狀結構圖來學習操作系統是如何管理底層硬件的。
所以為什么要有操作系統的原因以及操作系統為什么要進行軟硬件資源進行管理的原因就是因為:操作系統要對下管理好軟硬件資源,對上要將自己的功能進行打包,形成系統調用接口,給上層的用戶提供服務,可以讓用戶直接調用系統調用接口,也可以讓用戶直接使用各種庫函數,為了讓用戶更好的去操作,所以在系統調用接口之上就有了shell外殼,lib(庫),指令,用戶就能更好的去進行指令操作、開發操作、管理操作。