Java併發(一)----程式、執行緒、並行、併發

|舊市拾荒|發表於2023-04-10

一、程式與執行緒

程式

  • 程式由指令和資料組成,但這些指令要執行,資料要讀寫,就必須將指令載入至 CPU,資料載入至記憶體。在指令執行過程中還需要用到磁碟、網路等裝置。程式就是用來載入指令、管理記憶體、管理 IO 的

  • 當一個程式被執行,從磁碟載入這個程式的程式碼至記憶體,這時就開啟了一個程式。

  • 程式就可以視為程式的一個例項。大部分程式可以同時執行多個例項程式(例如記事本、畫圖、瀏覽器等),也有的程式只能啟動一個例項程式(例如網易雲音樂、360 安全衛士等)

執行緒

  • 一個程式之內可以分為一到多個執行緒。

  • 一個執行緒就是一個指令流,將指令流中的一條條指令以一定的順序交給 CPU 執行

  • Java 中,執行緒作為最小排程單位,程式作為資源分配的最小單位。 在 windows 中程式是不活動的,只是作為執行緒的容器

二者對比

  • 程式基本上相互獨立的,而執行緒存在於程式內,是程式的一個子集

  • 程式擁有共享的資源,如記憶體空間等,供其內部的執行緒共享

  • 程式間通訊較為複雜

    • 同一臺計算機的程式通訊稱為 IPC(Inter-process communication)

    • 不同計算機之間的程式通訊,需要透過網路,並遵守共同的協議,例如 HTTP

  • 執行緒通訊相對簡單,因為它們共享程式內的記憶體,一個例子是多個執行緒可以訪問同一個共享變數

  • 執行緒更輕量,執行緒上下文切換成本一般上要比程式上下文切換低

二、並行與併發

單核 cpu 下,執行緒實際還是 序列執行 的。作業系統中有一個元件叫做任務排程器,將 cpu 的時間片(windows 下時間片最小約為 15 毫秒)分給不同的執行緒使用,只是由於 cpu 線上程間(時間片很短)的切換非常快,人類感覺是 同時執行的 。總結為一句話就是:微觀序列,宏觀並行

一般會將這種 執行緒輪流使用 CPU 的做法稱為併發,對應的英文單詞為 concurrent

CPU 時間片 1 時間片 2 時間片 3 時間片 4
core 執行緒 1 執行緒 2 執行緒 3 執行緒 4

Java併發(一)----程式、執行緒、並行、併發

多核 cpu下,每個 核(core)都可以排程執行執行緒,這時候執行緒可以是並行的。對應的英文為parallel。在時間片1中,執行緒1與執行緒2可以同一時間執行。

CPU 時間片 1 時間片 2 時間片 3 時間片 4
core 1 執行緒 1 執行緒 1 執行緒 3 執行緒 3
core 2 執行緒 2 執行緒 4 執行緒 2 執行緒 4

Java併發(一)----程式、執行緒、並行、併發

引用 Rob Pike 的一段描述:

  • 併發(concurrent)是同一時間應對(dealing with)多件事情的能力

  • 並行(parallel)是同一時間動手做(doing)多件事情的能力

例子

  • 家庭主婦做飯、打掃衛生、給孩子餵奶,她一個人輪流交替做這多件事,這時就是併發

  • 家庭主婦僱了個保姆,她們一起這些事,這時既有併發,也有並行

    • 保姆做飯,主婦餵奶,並行

    • 保姆做飯、打掃衛生,併發

  • 僱了3個保姆,一個專做飯、一個專打掃衛生、一個專餵奶,互不干擾,這時是並行

  • 在實際的應用過程中一般既有併發也有並行。

 

相關文章