一、進程與線程
進程
-
程序由指令和數據組成,但這些指令要運行,數據要讀寫,就必須將指令加載至 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個保姆,一個專做飯、一個專打掃衛生、一個專餵奶,互不干擾,這時是並行
-