從一切皆資料與計算的角度,理解程序與執行緒

2022-02-22 12:01:30 字數 1913 閱讀 2905

一切皆資料和對資料的操作(計算)

以下是思考意識流。

「程序和執行緒是什麼?」,這是乙個常見的程式設計師校招面試題,簡單的回答是:執行緒是程序的乙個實體,是 cpu 排程的基本執行單元,但執行緒不擁有資源。程序包含若干執行緒和資源(資料),乙個程序至少有乙個執行緒。

但總覺得這個解釋缺點味道。一天想到馮·諾伊曼結構,對什麼是程序和執行緒,有了另乙個解釋角度,覺得很有趣。

現在的主流計算機結構都是馮·諾伊曼結構,這個結構有兩個最基本的抽象,就是資料和計算(對資料的操作),

cpu/gpu 負責計算,記憶體/磁碟 負責儲存資料,io 裝置(鍵盤,滑鼠,網絡卡,顯示器,印表機等等)負責傳輸和展示資料。

回到程序與執行緒,首先,程序與執行緒,是哪個層級的概念?cpu並沒有這個概念,程序和執行緒是作業系統層級的概念。

而且是作業系統的核心態概念,程序和執行緒,是兩個作業系統核心物件。

什麼是「核心」?什麼是「物件」?

回到一切皆資料與計算的角度,「物件」也是一種「資料」,是作業系統用於描述特定行為和內容的一種抽象。比如,windows的執行緒物件的資料結構(資料結構:資料長什麼樣子)是這樣:

上圖引用自:windows 程序與執行緒管理 - 知乎

那什麼是核心?就是:這裡的事情由作業系統說了算(定義對資料的操作範圍),其它的程式無權過問,作業系統只提供特定的 api 供外界(使用者態程式)呼叫。

再看 「執行緒是 cpu 排程的基本執行單元」 這句話,其實就有問題了,排程執行緒的,不是 cpu,而是作業系統,作業系統根據一定的規則(比如時間分片輪轉)來讓 cpu 執行執行緒中包含的指令。

補充回答 「程序和執行緒是什麼?」 這個問題:

程序和執行緒是作業系統層面的概念,本質上就是兩個作業系統核心物件:即作業系統定義的兩個資料結構,作業系統通過這兩個資料結構,來管理程式的執行。

(1)以多程序形式,允許多個任務同時執行;

(2)以多執行緒形式,允許單個任務分成不同的部分執行;

(3)提供協調機制,一方面防止程序之間和執行緒之間產生衝突,另一方面允許程序之間和執行緒之間共享資源。

這三點直接引用自:程序與執行緒的乙個簡單解釋 - 阮一峰的網路日誌

再回到一切皆資料與計算,會發現計算機世界所有事情都可以放在這個模型下思考。


除了上面提到的對硬體裝置的分類,還有:

主機板上為什麼要分控制匯流排,資料匯流排和位址匯流排;控制匯流排對應計算(對資料的操作),資料匯流排對應了資料本身,位址匯流排確定應該操作**的資料。

所有的雲端產品,基本上分為雲計算相關和雲儲存相關。

各種協議,就是定義了資料應該長什麼樣,對資料有哪些操作。

資料和計算,在不同的層級和領域,有不同的別名。

資料的別名:物件,模型,實體,檔案,楨,流等等。

計算的別名:編碼解碼,讀取/寫入/拷貝(對資料的轉移,也算一種計算吧)等等。

發現乙個心法就是,如果遇到什麼陌生的概念,可以思考這麼兩個基本問題:

1 這個概念是誰定義的(屬於哪個層級的概念)。

2 這是乙個資料概念,還是乙個計算概念。

其它的比如:

為什麼要定義這個概念,與它一起工作的其它概念有哪些?這個概念的底層概念是什麼?上層概念是什麼?與這個概念相關的操作有哪些?這個概念有沒有演化路徑?其它地方有沒有相似的概念?

想一遍這些問題,可以快速找到這個概念的定位,不至於一臉矇圈,覺得很神秘。

第一次聽說「核心物件」這個概念時就覺得很神秘,很厲害的樣子,但還原到:「核心物件就是作業系統定義的一系列資料結構,核心則是乙個邏輯概念,對於核心物件,作業系統只提供特定 api 供外部呼叫。」 這句話時,思路就清晰多了,雖然對於很多細節還是不懂。

閒扯結束。

windows 程序與執行緒管理 - 知乎

linux管道 如何理解一切皆檔案

一 linux檔案型別 涉及到i o的都可以抽象為檔案 1.普通檔案 log 2.目錄 usr home 3.字元裝置檔案 dev tty的屬性是 crw rw rw 注意前面第乙個字元是 c 這表示字元裝置檔案,比如貓等串列埠裝置 4.塊裝置檔案 dev hda1 的屬性是 brw r 注意前面的...

如何理解python中一切皆物件?

在python中,函式和類也是物件,具有如下特點 1.可以賦值給乙個變數 將函式賦值給變數 def ask name bobby print name my func ask my func hello kitty 執行結果 hello kitty將類賦值給變數 class person def i...

Linux 的世界,一切皆檔案

linux 的世界,一切皆檔案 在linux的世界中,它會把一切都看作是檔案,包括普通檔案 目錄檔案 字元裝置 鍵盤 滑鼠等 塊裝置 硬碟 光碟機等 socket epoll socket 管道 終端等等,所有一切都抽象成了檔案,提供了統一的介面,用於程式呼叫。linux 把一切視為檔案,那我們寫的...