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