一切皆數據和對數據的操做(計算)html
如下是思考意識流。程序員
「進程和線程是什麼?」,這是一個常見的程序員校招面試題,簡單的回答是:線程是進程的一個實體,是 CPU 調度的基本執行單元,但線程不擁有資源。進程包含若干線程和資源(數據),一個進程至少有一個線程。面試
但總以爲這個解釋缺點味道。一天想到馮洛伊曼結構,對什麼是進程和線程,有了另外一個解釋角度,以爲頗有趣。網絡
如今的主流計算機結構都是馮洛伊曼結構,這個結構有兩個最基本的抽象,就是數據和計算(對數據的操做),
CPU/GPU 負責計算,內存/磁盤 負責存儲數據,IO 設備(鍵盤,鼠標,網卡,顯示器,打印機等等)負責傳輸和展現數據。數據結構
回到進程與線程,首先,進程與線程,是哪一個層級的概念?CPU並無這個概念,進程和線程是操做系統層級的概念。
並且是操做系統的內核態概念,進程和線程,是兩個操做系統內核對象。多線程
什麼是「內核」?什麼是「對象」?編碼
回到一切皆數據與計算的角度,「對象」也是一種「數據」,是操做系統用於描述特定行爲和內容的一種抽象。好比,Windows的線程對象的數據結構(數據結構:數據長什麼樣子)是這樣:雲計算
上圖引用自:Windows 進程與線程管理 - 知乎操作系統
那什麼是內核?就是:這裏的事情由操做系統說了算(定義對數據的操做範圍),其它的程序無權過問,操做系統只提供特定的 API 供外界(用戶態程序)調用。線程
再看 「線程是 CPU 調度的基本執行單元」 這句話,其實就有問題了,調度線程的,不是 CPU,而是操做系統,操做系統根據必定的規則(好比時間分片輪轉)來讓 CPU 執行線程中包含的指令。
補充回答 「進程和線程是什麼?」 這個問題:
進程和線程是操做系統層面的概念,本質上就是兩個操做系統內核對象:即操做系統定義的兩個數據結構,操做系統經過這兩個數據結構,來管理程序的運行。
(1)以多進程形式,容許多個任務同時運行;
(2)以多線程形式,容許單個任務分紅不一樣的部分運行;
(3)提供協調機制,一方面防止進程之間和線程之間產生衝突,另外一方面容許進程之間和線程之間共享資源。
這三點直接引用自:進程與線程的一個簡單解釋 - 阮一峯的網絡日誌
再回到一切皆數據與計算,會發現計算機世界全部事情均可以放在這個模型下思考。
除了上面提到的對硬件設備的分類,還有:
主板上爲何要分控制總線,數據總線和地址總線;控制總線對應計算(對數據的操做),數據總線對應了數據自己,地址總線肯定應該操做哪裏的數據。
全部的雲端產品,基本上分爲雲計算相關和雲存儲相關。
各類協議,就是定義了數據應該長什麼樣,對數據有哪些操做。
數據和計算,在不一樣的層級和領域,有不一樣的別名。
數據的別名:對象,模型,實體,文件,楨,流等等。
計算的別名:編碼解碼,讀取/寫入/拷貝(對數據的轉移,也算一種計算吧)等等。
發現一個心法就是,若是遇到什麼陌生的概念,能夠思考這麼兩個基本問題:
1 這個概念是誰定義的(屬於哪一個層級的概念)。
2 這是一個數據概念,仍是一個計算概念。
其它的好比:
爲何要定義這個概念,與它一塊兒工做的其它概念有哪些?這個概念的底層概念是什麼?上層概念是什麼?與這個概念相關的操做有哪些?這個概念有沒有演化路徑?其它地方有沒有類似的概念?
想一遍這些問題,能夠快速找到這個概念的定位,不至於一臉蒙圈,以爲很神祕。
第一次據說「內核對象」這個概念時就以爲很神祕,很厲害的樣子,但還原到:「內核對象就是操做系統定義的一系列數據結構,內核則是一個邏輯概念,對於內核對象,操做系統只提供特定 API 供外部調用。」 這句話時,思路就清晰多了,雖然對於不少細節仍是不懂。
閒扯結束。