從一切皆數據與計算的角度,理解進程與線程


一切皆數據和對數據的操作(計算)

以下是思考意識流。


“進程和線程是什么?”,這是一個常見的程序員校招面試題,簡單的回答是:線程是進程的一個實體,是 CPU 調度的基本執行單元,但線程不擁有資源。進程包含若干線程和資源(數據),一個進程至少有一個線程。

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

現在的主流計算機結構都是馮·諾伊曼結構,這個結構有兩個最基本的抽象,就是數據和計算(對數據的操作),
CPU/GPU 負責計算,內存/磁盤 負責存儲數據,IO 設備(鍵盤,鼠標,網卡,顯示器,打印機等等)負責傳輸和展示數據。

回到進程與線程,首先,進程與線程,是哪個層級的概念?CPU並沒有這個概念,進程和線程是操作系統層級的概念。
而且是操作系統的內核態概念,進程和線程,是兩個操作系統內核對象。

什么是“內核”?什么是“對象”?

回到一切皆數據與計算的角度,“對象”也是一種“數據”,是操作系統用於描述特定行為和內容的一種抽象。比如,Windows的線程對象的數據結構(數據結構:數據長什么樣子)是這樣:

上圖引用自:Windows 進程與線程管理 - 知乎

那什么是內核?就是:這里的事情由操作系統說了算(定義對數據的操作范圍),其它的程序無權過問,操作系統只提供特定的 API 供外界(用戶態程序)調用。

再看 “線程是 CPU 調度的基本執行單元” 這句話,其實就有問題了,調度線程的,不是 CPU,而是操作系統,操作系統根據一定的規則(比如時間分片輪轉)來讓 CPU 執行線程中包含的指令。

補充回答 “進程和線程是什么?” 這個問題:
進程和線程是操作系統層面的概念,本質上就是兩個操作系統內核對象:即操作系統定義的兩個數據結構,操作系統通過這兩個數據結構,來管理程序的運行。

(1)以多進程形式,允許多個任務同時運行;
(2)以多線程形式,允許單個任務分成不同的部分運行;
(3)提供協調機制,一方面防止進程之間和線程之間產生沖突,另一方面允許進程之間和線程之間共享資源。

這三點直接引用自:進程與線程的一個簡單解釋 - 阮一峰的網絡日志

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

除了上面提到的對硬件設備的分類,還有:
主板上為什么要分控制總線,數據總線和地址總線;控制總線對應計算(對數據的操作),數據總線對應了數據本身,地址總線確定應該操作哪里的數據。
所有的雲端產品,基本上分為雲計算相關和雲存儲相關。
各種協議,就是定義了數據應該長什么樣,對數據有哪些操作。

數據和計算,在不同的層級和領域,有不同的別名。
數據的別名:對象,模型,實體,文件,楨,流等等。
計算的別名:編碼解碼,讀取/寫入/拷貝(對數據的轉移,也算一種計算吧)等等。

發現一個心法就是,如果遇到什么陌生的概念,可以思考這么兩個基本問題:
1 這個概念是誰定義的(屬於哪個層級的概念)。
2 這是一個數據概念,還是一個計算概念。

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

想一遍這些問題,可以快速找到這個概念的定位,不至於一臉蒙圈,覺得很神秘。
第一次聽說“內核對象”這個概念時就覺得很神秘,很厲害的樣子,但還原到:“內核對象就是操作系統定義的一系列數據結構,內核則是一個邏輯概念,對於內核對象,操作系統只提供特定 API 供外部調用。” 這句話時,思路就清晰多了,雖然對於很多細節還是不懂。

閑扯結束。


參考鏈接:
進程與線程的一個簡單解釋 - 阮一峰的網絡日志
Windows 進程與線程管理 - 知乎

原文鏈接:https://www.cnblogs.com/jasongrass/p/13340730.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM