抽象理解進程和線程

概述

在前幾篇博客中,我係統的整理了上下文切換和用戶態以及內核態相關的知識,在整理過程中多次出現進程以及線程的概念。在學習其它博客時,我發現大部分博客內容前後矛盾,無法做到自圓其說,作爲讀者我也看得雲裏霧裏,完全搞不清楚線程和進程的真面目。因此通過本片博客,我打算抽象的描述一下進程和線程的關係及作用。


進程和線程

關於爲什麼要抽象的描述進程和線程是因爲:進程和線程本身就是兩個抽象的概念

作爲 java 開發者的我深受 面向對象 思想的影響(毒害),總是下意識的把任何概念都理解爲一種對象。這對於理解一些抽象概念其實是起到反作用的,因爲抽象概念本身就是看不見摸不着的,而對象可以理解爲實際存在的東西,在過分追求屬性和方法時很容易鑽牛角尖。

下面我們直接進入正題:

用一句話來概括:進程和線程都是一個時間段的描述,是CPU工作時間段的描述

我們的電腦通過 CPU + 內存 + 光驅 + 鍵盤 + 顯卡等等資源組成,然而實際運行時主要通過CPU、寄存器和內存來完成的。CPU執行的速度極快,除了寄存器勉強能跟上 CPU 的速度外,其他設備都相差甚遠。這樣在多個任務需要執行時,無論採用什麼樣的執行策略,在CPU看來都是輪流執行,哪個任務優先級高先執行哪個,哪個任務排隊時間長先執行哪個。

關於CPU、寄存器,和內存我們可以這樣抽象理解:CPU 就類似皇上,寄存器就類似皇上身邊的小太監,內存就像站在下面的大臣。當大臣有任務需要執行時,先交給小太監,小太監再去稟告皇上。皇上執行完後將結果告訴小太監,小太監再去通知大臣。也就是說,CPU不直接和內存交互,而是通過寄存器作爲中轉站來交互,一個CPU會對應多個寄存器,CPU和寄存器交互的主要原因是因爲寄存器快。至於爲什麼不把內存全部換成寄存器,除非你有鈔能力。

當我們執行一段程序代碼時,除了CPU之外,其他的資源如顯卡等也必須就緒。等所有資源就緒後,CPU開始執行,這裏除了CPU之外的所有資源就組成了程序的運行環境,也就是前面提到的上下文。當這個程序執行完或者時間片用完後就需要切換到其他程序,在被切換出去前需要保存當前任務的上下文,確保下次被CPU調度時可以接着上次的結果繼續向下執行。

串聯起來說也就是:CPU的輪流執行就是:CPU加載程序A的上下文,執行一段時間,CPU保存A的上下文,CPU加載程序B的上下文,執行一段時間,CPU保存B的上下文,CPU加載A的上下文,接着上次運行結果,CPU接着向下執行。。。。

進程和線程的概念就是根據該執行串抽象出來的:

進程就是包括上下文切換程序執行時間的總和:CPU加載上下文 + CPU執行 + CPU保存上下文

而進程的粒度太大,一個程序不可能只有一條邏輯,可能有很多條邏輯,每個邏輯實現一小部分功能,這些小功能組成整個程序。

也就是說,進程的執行過程也可以劃分爲以下過程:CPU加載程序A的上下文,cpu 執行任務a,cpu 執行任務b,cpu執行任務c,CPU保存程序A的上下文

任務a,b,c 共享整個進程的上下文,CPU 在執行過程中沒有執行進程上下文切換。這裏的a,b,c 就是線程,也就是更小粒度的CPU執行時間段。

總結以下:進程和線程都是一個時間段的描述,是CPU工作時間段的描述,不過是顆粒大小不同


抽象描述

這裏我通過一個工廠的例子描述進程和線程的關係:

  • CPU是計算機的核心,它就像一個工廠,時刻都在運行

  • 工廠中電力有限,每次只能運行一個車間,也就是說單個CPU同時只能執行一個任務

  • 進程就像車間,它代表CPU所能處理的單個任務。

  • 除了車間,還必須有相應的工具車間才能運行。這裏表示任務的執行不僅僅需要CPU,還需要其他資源。

  • 單個車間有很多工人,這些工人一起維持車間的正常運轉。這裏的工人就類似線程

  • 車間的空間是共享的,很多房間工人都可以進出。這裏表示所有線程共享進程的公共資源

  • 每個房間的大小有限,只能容納一定數量的工人,當房間工人數量達到界限時,其他工人就不能進入了。這裏表示對於一些共享內存,當存在線程佔有後,其他線程必須等它結束才能執行。

  • 有些房間只能容納一個工人,這裏可以使用鎖,工人進去後把房間鎖起來。這裏表示互斥鎖

  • 有些房間可以容納n個工人,可以在門口掛n個標識,工人進去時必須擁有標識。這裏表示信號量

也就是說,操作系統的設計主要集中在以下三點:

  1. 多進程執行:同時可以併發執行多個任務,多核CPU計算機中可以實現並行

  2. 多線程執行:每個大任務可以被拆分爲多個小人物併發執行

  3. 協調機制:一方面防止進程和進程之間訪問,一方面允許線程和線程之間訪問


參考:
https://www.zhihu.com/question/25532384
http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
https://blog.csdn.net/qq_39759656/article/details/82081974
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章