一、程式與執行緒
程式
-
程式由指令和資料組成,但這些指令要執行,資料要讀寫,就必須將指令載入至 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 |
多核 cpu下,每個 核(core)
都可以排程執行執行緒,這時候執行緒可以是並行的。對應的英文為parallel。在時間片1中,執行緒1與執行緒2可以同一時間執行。
CPU | 時間片 1 | 時間片 2 | 時間片 3 | 時間片 4 |
---|---|---|---|---|
core 1 | 執行緒 1 | 執行緒 1 | 執行緒 3 | 執行緒 3 |
core 2 | 執行緒 2 | 執行緒 4 | 執行緒 2 | 執行緒 4 |
引用 Rob Pike 的一段描述:
-
併發(concurrent)是同一時間應對(dealing with)多件事情的能力
-
並行(parallel)是同一時間動手做(doing)多件事情的能力
例子
-
家庭主婦做飯、打掃衛生、給孩子餵奶,她一個人輪流交替做這多件事,這時就是併發
-
家庭主婦僱了個保姆,她們一起這些事,這時既有併發,也有並行
-
-
保姆做飯、打掃衛生,併發
-
-
僱了3個保姆,一個專做飯、一個專打掃衛生、一個專餵奶,互不干擾,這時是並行
-