馮諾依曼體系結構
描述了一臺計算機是如何構成的(又稱爲普林斯頓體系結構)
(99% 的計算機都是馮諾依曼體系結構的,硬件的特點會對軟件開發造成直接的影響)
內存
過去幾十年,CPU的發展速度十分迅猛
“摩爾定律”:18個月,芯片集成程度提高一倍,運算能力提高一倍,成本降低一半。
但是,現在這個定律失效了,因爲 CPU 集成程度更高,就需要讓單個原件儘量小,現在最厲害的工藝 7nm 級別,這樣的空間尺度上,經典物理已經接近失效,主要靠量子力學,現在解決這個問題的辦法是,人海戰術——一個 CPU 沒辦法再提高速度,那麼就只能多搞幾個 CPU 來解決,也就是現在的多核
GPU 是一種特殊的 CPU ,專門針對一些特定場景進行優化計算(矩陣等)
Java中寫得多代碼,主要都是在內存中,new 出來的對象就是在內存上申請空間,後面介紹的 IO流,就知道了如何讓程序和內存打交道
內存和外存的對比
- 內存的存儲空間比較少,外存的存儲空間比較大
- 內存的訪問速度較快(ns級別),外存的訪問速度比較慢(μs),大概查了三四個數量級
- 內存的成本比較高,外存的額成本比較低
- 內存如果斷電,數據就丟失了,外存如果斷電了,數據不丟失(持久化存儲)
操作系統
是一個搞管理的軟件。一方面管理計算機的硬件設備,另一方面管理計算機的軟件資源。
一個完整的操作系統 = 內核 + 配置的應用程序
OS定位
在操作系統中的定位是:一款純正的搞管理的軟件
例如:System.out.println("hello world!");
代碼真正執行的時候,println 會進入到依賴的庫當中,本質上需要操作顯示器這個硬件設備來完成,println 然後就會通過相關的系統調用進入到內核當中來執行代碼。這個內核中的代碼再來執行“讓顯示器輸出”這樣的動作。最後,內核調用顯卡驅動程序具體操作顯示器。
操作系統具體怎麼管理?
所謂管理核心工作主要是兩個方面:
- 描述:相當於是創建了一個 Student 類,類中包含一些需要的屬性,再根據當前的數據創建一堆 Student的實例
- 組織:藉助一定的數據結構,把這些Student 的實例放到一起,然後在按照一定的規則來篩選
進程(process)/任務(Task)
進程是一種操作系統中非常重要的軟件資源。把一個可執行程序跑起來,系統中就會創建一個對應的進程,如果這個程序執行結束了,系統就會隨之銷燬對應的進程,進程就可以看成是一個程序的執行的“過程”。
注意區分程序和進程,程序也可以成爲可執行文件:
- 執行文件就是一個磁盤上的文件,靜態的,如果不去操作就不會發生變化
- 當雙擊某個 exe 文件時,操作系統就會加載這個可執行程序,(加載:把 exe 文件中的很多內容都加載到內存中,分配了一些資源,並開始執行這個可執行程序中包含的指令),執行過程中就是一個進程。
進程也可以認爲是操作系統進行資源分配的最小單位。
PID 是進程 id 的身份標識符,關閉一個程序後再次打開,兩次產生的PID是不同的
進程管理
管理:先描述,再組織。
以 Linux 爲例:
- 內核中使用一個 task_struct /PCB(進程控制塊)結構體來描述進程
- 每創建一個進程,就同時創建了一個 PCB 這樣的類的實例。
- 組織方式:使用雙向鏈表把所有的 PCB 對象串到一起。
雙擊一個 exe ,創建一個進程的時候,本質上就是在內核中,縣創建一個 PCB 對象,然後把這個對象加入到鏈表中。
關閉一個程序,結束一個進程的時候,本質上就是在內核中,找到這個對應的 PCB 對象,然後從鏈表上刪除,並且釋放該對象
通過任務管理器查看到的所有的進程信息,本質上就是在遍歷內核中的這個鏈表,一次讀取對應 PCB 中的節點信息
PCB 裏面包含哪些信息呢?
- pid(進程id):進程的身份標識
- 一組內存指針,指向該進程持有的一些重要數據在內存中得到位置。
- 狀態
- 優先級
- 進程的記賬信息
- 上下文
上述中3~6 爲了實現“進程調度”,如果資源非常充裕,那麼不需要調度。事實上是進程多,系統給進程分配的資源(CPU)很少,目的就是爲了讓大量的進程能夠很好的在有限的 CPU 上進行併發執行
併發:同一時刻 CPU 上只能執行一個程序的指令,由於CPU 計算/執行指令速度極快,我們就可以讓 CPU 這樣工作:先執行進程1 的指令,執行了一段時間後,執行進程2 的指令,再執行進程3 的指令……過一段時間後再繼續執行進程1 的指令,期間的時間間隔十分短,宏觀上來看,是在同時運行這些進程,但是微觀上來看,這些指令是串行執行的,只不過 CPU 切換速度極快,人宏觀上感知不到,這就是併發。
並行:是宏觀上是同時執行,微觀上也是同時進行。(兩個CPU 就可以同時執行兩個進行的指令)
實際工作中一般不會嚴格區分並行和併發,兩個術語可能會混淆使用。
操作系統中實現進程調度的模塊叫做“調度器”,實現具體調度的時候有很多策略,這些策略都依賴 PCB 的屬性
一個進程的狀態有這些狀態:
- R:就緒狀態。正在 CPU 上執行,或者即將執行
- S:睡眠狀態。這些進程沒法在 CPU 上執行,而是在等待。
- D:深度睡眠狀態。進程在長時間的忙於 IO 操作,沒精力理會 CPU
- X:退出狀態。進程已經被銷燬了
- T
- t
- Z
- ……