一、馮諾依曼體系結構
現在我們常見的計算機(筆記本電腦等)和不常見的計算機(服務器)它們都滿足馮諾依曼體系。
我們可以把計算機理解成一個個硬件組成的
- 輸入設備:鍵盤、鼠標、攝像頭、網卡、磁盤等
- 輸出設備:顯示屏、打印機、網卡、磁盤等
- 中央處理器
CPU
: 運算器+控制器- 存儲器:本質就是內存
理解輸入輸出
IO
:Input/Output
<->IO
,我們要站在內存的角度去理解,將數據輸入到內存這是輸入Input
;將數據從內存輸出,這是輸出Output
。
1. 理解軟件(程序)運行為什么要加載到內存?
我們知道軟件(程序)在運行之前,必須要先加載到內存,但是我們不知道這為什么?
了解了馮諾依曼體系結構,就知道了為什么,因為體系結構規定了。
程序在加載到內存之前,在哪?很顯然在磁盤中(也就是外存)
通過觀察馮諾依曼體現結構,我們能夠發現,
CPU
只能在內存中讀取和寫入數據;那我們的程序要像在CPU
中運行,那就必須要先加載到內存中。
那程序要加載到內存中,這不就是將數據(我們寫的代碼也是數據)輸入到內存(Input
)操作嗎(簡單來說,就是將數據拷貝到內存中)。
3. 內存
看到這里,我們可能有一個疑問:為什么要有內存呢?
CPU
直接從輸入設備
中讀取數據,然后將數據輸出到輸出設備
不也可以嗎?
對于整個問題,我們要考慮一個問題,我們CPU
處理數據是速度是很快的,如果我們CPU
直接和輸入輸出設備進行數據交互,那我們整體效率就取決于輸入輸出設備的效率的;
所以要存在內存,我們CPU
從內存中讀取數據,這樣可以平衡我們輸入輸出設備和CPU
之間的速度差距(在程序運行之前通過特定的算法將數據先加載到內存)。
那這里我們理解了,還有一個疑問,CPU
之和內存進行數據交互,那為什么不直接使用內存來存儲數據呢?
簡單來說,就是內存太貴了,如果全部使用內存來存儲數據,那一臺計算機的價格就非常高了。
2.理解數據流動
在馮諾依曼體系結構中,存在數據信號
和控制信號
;這里我們拋開控制信號不談,現在來了解一下數據,以及數據流動。
現在我們想象一個場景,
你
和你的女朋友
在微信上聊天,你發送的信息是如何顯示到你女朋友是顯示器上的呢?
簡單來說,這簡單啊:我通過鍵盤將信息輸入到微信中,然后微信通過網絡將信息發送到我女朋友的微信中,然后顯示到她的顯示器上。
但是微信又是如何將數據發送的呢?
這里我們站在硬件的角度,從馮諾依曼體系結構來理解這個數據是如何傳輸的。
首先,我們將
你
和你女朋友
使用的兩臺計算機設備想象成兩個馮諾依曼體系;我們要像使用微信發送信息,那就一定要讓微信運行起來(就是將微信程序加載到內存,在
CPU
中執行);
對于你的這個馮諾依曼體系來說:
輸入設備:就是鍵盤,你通過鍵盤輸入信息。
信息從輸入設備加載到內存,然后通過微信這一個程序對數據進行一系列操作(加密等操作),然后數據由內存到輸出設備。(此時你的輸出設備就是網卡)
然后數據通過網絡(一系列操作),將數據傳輸到你女朋友的計算機(馮諾依曼體系結構中);
對于女朋友的計算機馮諾依曼體現結構來說:
此時輸入設備就是網卡;
數據從網卡(輸入設備),然后加載到內存中,再通過微信這一個程序,對數據進行一系列操作(解密),然后數據從內存中到輸出設備中。
此時輸出設備就是顯示器。
這樣你發送的信息就顯示到了你女朋友的顯示器上。
看到這里,應該多多少少有一點理解數據流動了。
這里我們發送信息之后,我們的顯示器中也可以看到發送的信息,那就是我們的輸出設備還用顯示器
這里如果我們發送的是一個文件呢?
此時你的輸入設備就是磁盤(我們將文件拖拽到微信聊天框中這一操作,本質上就是從從磁盤中讀入數據)
而此時你女朋友的輸出設備就是磁盤(接收文件就是將文件保存到磁盤中)
二、操作系統
就目前來說,我們并不知道操作系統是什么,是干什么;
簡答來說,操作系統是一個基本的程序集合;
操作系統是一款進行軟硬件管理的軟件。
從廣義上來說,操作系統包括:內核(進程管理、文件管理、內存管理和驅動管理);其它程序(函數庫、shell程序等)
但是狹義上我們也可以認為操作系統內核就是操作系統;
理解了操作系統是什么,我們現在來看操作系統是干什么的:
這里先說結論:
- 為用戶程序(應用程序)提供一個良好的運行環境。
- 與硬件交互,管理所有的硬件資源。
試想一下,如果沒有操作系統,就一堆硬件擺在我們面前,我們能不能使用?顯然是不能的
軟硬件體系結構
看上圖,這是計算機軟硬件體系結構;我們可以看到它分為三個部分用戶部分
、系統軟件部分
和硬件部分
。
之前我們使用計算機,都是通過操作系統,來進行我們的一系列操作;就比如
linux
中的基本命令,這是shell
外殼為我們包裝好的指令,方便我們使用。
通過觀察上圖,我們可以發現系統調用接口
、驅動程序
這些我們之前聽都沒聽過;
系統調用
通過這個名字,就感覺好高級,我們是不是不能隨意的使用系統調用,準確來說是的;
系統調用其實就是函數,只不過是操作系統提供的函數。
我們如果訪問操作系統,就必須通過系統調用
這個理解起來應該很簡單,操作系統不想我們之間去訪問它,所以提供了系統調用;我們可以通過系統調用來訪問操作系統。
一個程序,如果訪問了硬件,那么它一定貫穿整個體系結構
什么意思呢,就比如我們通過指令向文件中寫入數據,指令是
shell
外殼提供的,它對系統調用進行封裝形成指令供我們使用,而操作系統呢,通過驅動程序,來訪問硬件資源進行操作。
庫里面就可能進行了系統調用的封裝
我們
C
語言中的printf
和scanf
,printf
是將數據輸出到顯示器,scanf
是從鍵盤中讀取程序,它們底層就是對系統調用進行了封裝。
理解操作系統
這里簡單來說,在整個計算機軟硬件架構中,操作系統的定位是:?款純正的
搞管理
的軟件
理解管理
操作系統在管理軟硬件資源的軟件,那如何去理解這個管理
呢?
在我們日常生活中也存在很多管理的實例,那這個管理和操作系統管理軟硬件一樣嗎?
博主是一名大學生,在大學中,我們簡化成學生
、老師
和校長
;
那在這個管理實例中,是誰在管理誰呢?
一個事情,可以分為決策和執行;
在上面例子中,我們學生肯定就是被管理者,而老師是執行者,校長則是決策者。
- 管理者和被管理者不需要見面(簡單來說就是,我們學生不需要見到校長,也能被管理起來)
- 如何管理?這很簡單,通過信息(數據)管理
- 如何得到數據?(通過中間層獲取,每個學校都有學生管理系統,我們在這個系統中可以查到我們的所有信息)
我們學校剛成立不久,學生很少,校長管理起來非常容易,搞一個execl
表格,這個表格中存儲著我們所有學生的信息;
這樣校長管理我們學生,就直接對這些數據進行管理:簡單來說就是對這些數據增刪查改。
但是隨著學校發展,學生越來越多,這個表格中數據太多了,校長管理不過來了;
如果讓我們去解決,把我們是不是就要搞一個數據結構(鏈表/順序表),將這些信息存儲到計算機里面(學生的信息無非就是姓名、學號、性別、年齡等等)我們搞一個結構體來存儲這些信息;那這樣我們就可以使用數據結構將這些學生的信息存儲起來;
那我們就可以將這些信息存儲到計算機中,然后對這些數據結構進行增刪查改操作,不就將學生管理起來了嗎。
那對于學生的管理工作,不就轉化成對鏈表的增刪查改操作了嗎(這里過程也稱為建模)
建模的過程其實就是先描述、再組織
;
我們將學生信息使用一個struct
結構體存儲起來,這不就是對學生信息的描述嗎;
我們將數據存儲到數據結構中,這不就是將數據組織起來嗎。
先描述、在組織
說了這么多,我們這里只需要知道先描述、在組織就OK了。
那我們生活中的實例和操作系統管理硬件一樣嗎?
可以說是一樣的
我們操作系統管理硬件資源,是不是也是對硬件資源信息的管理,只需要知道硬件的信息,就可以對硬件進行管理。
理解系統調用
操作系統要對上提供對應的服務,但是呢,操作系統有不信任任何人;(這句話聽起來很別扭,操作系統要給我們提供對應的服務,又不信任我;這就跟我們生活中的銀行一樣,它要給我們提供相應的服務(存錢、取錢、轉賬等),但同時它又不信任我們,只是通過柜臺窗口,讓我們進行存錢、取錢等。)
那操作系統如何提供對應的服務呢? 就是系統調用
系統調用其實就是函數,函數要有參數和返回值吧,用戶就可以通過這些參數和返回值來實現用戶和操作系統之間的數據交互。
**但是這里有疑問:**我們不了解系統調用, 不會使用系統調用啊?
這就像一個不認識字的人去銀行,銀行通過了窗口來辦理業務,但是這個人不會,不知道要做什么,這時,我們銀行內的工作人員就會幫助這個人去辦理業務;
這就祥我們一樣,我們不了解系統調用,我們該如何去使用呢?
這是就有庫
、shell
、指令
等,它們通過對系統調用的封裝,讓我們不知道系統調用的情況下,也可以使用計算機,訪問操作系統。
到這里,本篇文章就已經接近尾聲了,現在來做一個簡單總結:
馮諾依曼體系結構:理解數據流動,內存等
操作系統:操作系統是什么,理解管理
這時,我們銀行內的工作人員就會幫助這個人去辦理業務;
這就祥我們一樣,我們不了解系統調用,我們該如何去使用呢?
這是就有庫
、shell
、指令
等,它們通過對系統調用的封裝,讓我們不知道系統調用的情況下,也可以使用計算機,訪問操作系統。
到這里,本篇文章就已經接近尾聲了,現在來做一個簡單總結:
馮諾依曼體系結構:理解數據流動,內存等
操作系統:操作系統是什么,理解管理