目錄
- 馮·諾依曼體系結構
- 一個例子來深入理解
- 初識操作系統
- 操作系統的作用
- 設計操作系統的目的
- 操作系統之上和之下分別有啥
- 管理的精髓,先描述,再組織
馮·諾依曼體系結構
我們知道,計算機這個東西發明出來就是幫助人們快速解決問題的。那如果我們想把問題交給計算機處理,我們就需要一個輸入設備把我們問題所需要的數據和信息交給計算機,然后我們需要計算機給出我們處理的結果,就需要一個叫做輸出設備的東西來讓計算機把結果顯示出來(比如顯示器)
- 而我們后人就將這個具有算術運算功能、邏輯運算功能以及控制功能的這個模塊稱為中央處理器,簡稱CPU。
- CPU的處理數據的速度非常快,可以這么說如果我們想要打游戲和刷視頻如此的流暢,一塊好的CPU是不可或缺的。
- 但是我們早期的計算機遇到了一個問題就是,CPU確實處理數據非常快,但是輸入設備和輸出設備他兩的處理數據的能力不快呀。這個時候CPU1微秒處理完數據,對輸入設備說,輸入設備我把你剛剛交給我的數據處理完了,你還有數據交給我們嗎?輸入設備這個時候說,請你等一下CPU我正在處理呢。 這個時候CPU又對輸出設備說,輸出設備我這里有一批剛剛處理完的數據要交給你,你現在有空處理嗎?這個時候輸出設備又說:等一下CPU,我這里的數據也還沒處理完呢。
- 這個時候CPU就只能翹著二郎腿在這里閑著等他們了,這個時候我們就浪費了大量的空閑時間。
- 這也是木桶原理的現象。
- 這個時候我們的諾依曼大佬也發現這個問題,就讓一個叫內存的東西作為橋梁介于CPU和輸入/輸出設備之間,內存的工作速度只是比CPU慢一點,如果說CPU處理完了數據,需要得到新的數據繼續工作,這個時候內存也剛好把輸入設備的數據拿到,這個時候內存就可以盡快的把數據拿給CPU處理,對于輸出設備的對接也是如此。
- 現在該體系的運行流程就是:用戶輸入的數據先放到內存當中,CPU讀取數據的時候就直接從內存當中讀取,CPU處理完數據后又寫回內存當中,然后內存再將數據輸出到輸出設備當中,最后由輸出設備進行輸出顯示。
- 于是就形成了最終的馮諾依曼體系結構。
一個例子來深入理解
- 今天你要使用qq對你的朋友發送一句你好的信息
- 要使用qq就需要聯網,你和你的朋友的電腦都是馮·諾依曼的體系結構:你的輸入設備是:鍵盤,輸出設備是:顯示器和網卡, 你朋友的輸入設備是:網卡,輸出設備是:顯示器
- 剛開始你在你的鍵盤中輸入了你好這個數據,那么鍵盤這個輸入設備就把數據交給內存,內存拿到了又交給CPU處理,CPU處理好后交給內存,內存又對顯示器和網卡兩個輸出設備各個發送一份,那么你的顯示器就得到了你好這個數據,這個時候你的顯示器上就顯示了你發送你好的信息,那么網卡的信息就開始交給網絡流,流到了朋友電腦的網卡這個輸入設備這里,被朋友電腦的網卡獲取到,這個時候網卡又把這個數據交給內存,內存交給CPU,CPU處理完后又交給內存,內存拿到后,交給你你朋友電腦的顯示器這個輸出設備,這個時候你朋友的顯示器上就出現了你好。
總結一下:
- CPU只和內存打交道
初識操作系統
操作系統的作用
簡單來說就是用來管理軟件和硬件的一款系統軟件
設計操作系統的目的
- 與硬件進行交互,管理所有的軟硬件資源。
- 為用戶程序(應用程序)提供一個良好的執行環境。
例如:如果用戶現在像在顯示器上看一個東西,就需要顯示器的驅動程序來啟動顯示器這個硬件,操作系統就是需要來管理驅動程序這一操作,來滿足用戶的需求。
操作系統之上和之下分別有啥
- 首先就是我們肉眼可見的計算機硬件,這些硬件的結構也是遵從我們的馮·諾依曼體系結構的。
- 但是如果只是有這些硬件是不行的,還要有一個的東西來對硬件進行管理。例如:內存什么時候從從輸入設備讀取數據?讀取多少數據?內存何時刷新緩沖區到輸出設備?是按行刷新還是全刷新?這些都是由軟件進行管理的,而這個軟件就是操作系統(Operator System)。
- 那這個時候有一個問題。我們是不是可以理解為,操作系統直接來管理硬件?
- 舉個例子,如果操作系統自己來完成鍵盤的讀取操作,那么只要你的鍵盤讀取方式進行了改變,那么操作系統的內核源代碼就需要進行重新編譯,這對操作系統來說維護成本太高了。
- 于是我們早操作系統和硬件之間也加了一個驅動層,這個驅動層的主要作用就是去直接控制底層硬件的。例如,鍵盤有鍵盤驅動,網卡有網卡驅動,硬盤有硬盤驅動,磁盤有磁盤驅動。驅動簡單來說就是去訪問某個硬件的讀,和硬件狀態驅動層就是直接和硬件打交道的。此時操作系統就只需關心何時讀取數據,而不用關心數據是如何讀取的了,也就是完成了操作系統與硬件之間的解耦。
- 這個時候大家可能對解耦這個名詞有點陌生,我這里講一下什么是高內聚和低耦合
補充知識:高內聚和低耦合
- 什么是高內聚?例如臺式電腦把顯卡和顯示器這樣主要用來顯示的功能放在一起叫做高內聚,把具有類似功能的函數封裝在一個類也是高內聚。
- 什么是低耦合,我的臺式電腦感覺用著非常卡頓,系統反應遲鈍,我現在把CPU換一個更高效的但是換了CPU并不會造成很大影響其他顯卡和內存的功能。或者我把一個函數的代碼改了并不會造成很大影響(不是沒有影響哈)另一個函數的功能,叫做低耦合
那操作系統究竟管理些什么呢?操作系統主要進行以下四項管理:
- 內存管理:內存分配、內存共享、內存保護以及內存擴張等等。
- 驅動管理:對計算機設備驅動驅動程序的分類、更新、刪除等操作。
- 文件管理:文件存儲空間的管理、目錄管理、文件操作管理以及文件保護等等。
- 進程管理:其工作主要是進程的調度。
- 而操作系統再往上就是我們所處的位置,在這里我們就可以用命令行或是圖形化界面進行各種操作,這一層被稱為用戶層。(如Windows的圖形界面操作,Linux的命令行指令操作)
- 但操作系統為了保護自己,對上只暴露了一些接口,而不會讓用戶直接訪問操作系統,這一系列接口被稱為系統調用接口(其實就是函數)。
- 例如:如果我們的程序要訪問硬件,必須通過系統調用訪問操作系統,讓操作系統去讓硬件執行相應的操作。(只有操作系統可以管理軟件和硬件)
- 但是系統調用接口的方式來訪問操作系統,對于不熟悉操作系統的人操作成本還是太高了,我們因為要使用系統調用前提條件是你得對系統有一定了解。所以在系統調用接口之上又構建出了一批庫,例如libc和libc++。實際上在語言級別上使用的各種庫,就是封裝了系統調用接口的,我們就是通過調用這些庫當中的各種函數(例如printf和scanf)進行各種程序的編寫。
- 例如我們的Printf函數要把數字打印到顯示器,就要訪問硬件,訪問硬件去需要調用系統調用讓操作系統去給顯示器說我們的需求
管理的精髓,先描述,再組織
- 要想學好操作系統,那么就必須正確理解到底什么是管理。
- 這里我們舉一個實際的例子來談談管理,現在給出三個角色:學生、輔導員和校長。很明顯,校長在這三個人當中是管理者,學生是被管理者,那么輔導員充當什么角色呢?
- 仔細想想,實際上完成任何一件事都要經過兩個過程,首先是決定要不要做這件事或是如何做這件事(決策),然后就是去做這件事情(執行)。校長作為管理者來管理學生,校長實際上就是那個做決策的人,但是校長作出決策后并不需要自己來執行,而是讓輔導員去執行,所以輔導員的主要任務就是執行管理者的決策,我們通常將其稱為執行者。
- 雖然說校長是管理學生的,但是我們在學校一般情況下是看不到校長本人的,那么校長是如何做到在不看到我們的情況下對我們進行管理的呢?
舉個例子,現在校長要求輔導員將計算機成績排名前十的學生的各科資料以及平時表現記錄拿過來,他將從這十名同學之中選出三名學生參加本次的編程大賽,當輔導員將資料拿來后校長選出三名學生說:“就這三個了,你找個老師對這三名學生進行一下強化訓練,然后參加本次的編程大賽。”然后校長就什么也不管了。
- 在這個過程中,校長根本沒有見過這三名同學,就對其進行了管理,他根據的是什么?沒錯,他根據的是數據。
- 實際上,學校將我們每個學生的各種信息都進行了管理,基本信息、成績信息以及健康信息等等。
- 每一種信息就描述了這個學生的情況,我們的學長就可以只根據這些關于這個學生的信息就可以把學生管理起來。這么一套信息在C語言當中我們稱之為抽象結構體,而在C++當中又叫做類。
- 當學生的數量多起來了,校長就可以將全部學生的信息組織起來,當然組織的方式有很多種(鏈表、順序表、樹),而每種組織方式都有其自己的優勢,于是就有了一門課程專門教我們管理數據的方式,那就是數據結構。這里我們假設校長以雙鏈表的形式將學生的信息組織起來。
- 此時校長對這些學生的管理,其實就是對雙鏈表這個數據結構的增刪查改。例如:我如果要年級最后三名開除學籍,那么我們就可以在學籍系統中,刪掉這三名學生的信息。
- 那么操作系統是不是也可以這樣管理硬件?把網卡,顯卡,鍵盤,定義一個類,描述他們的屬性,然后數據結構組織起來,對他們進行增刪查改