一、進程和線程的概念
1.1 進程
- 程序由指令和數據組成,但這些指令要運行,數據要讀寫,就必須將指令加載至CPU,數據加載至內存。在指令運行過程中還需要用到磁盤、網絡等設備。進程就是用來加載指令、管理內存、管理 IO 的。
- 當一個程序被運行,從磁盤加載這個程序的代碼至內存,這時就開啟了一個進程。
- 進程可以視為程序的一個實例。大部分程序可以同時運行多個實例進程(例如記事本、畫圖、瀏覽器等),也有的程序只能啟動一個實例進程(例如網易云音樂、360安全衛士等)。
1.2 線程
- 一個進程之內可以分為一到多個線程
- 一個線程就是一個指令流,將指令流中的一條條指令以一定的順序交給 CPU 執行
- Java 中,線程作為最小調度單位,進程作為資源分配的最小單位。在 Windows 中進程是不活動的,只是作為線程的容器
1.3 二者對比
- 進程基本上相互獨立的,而線程存在于進程內,是進程的一個子集
- 進程擁有共享的資源,如內存空間等,供其內部的線程共享
- 進程間通信較為復雜
- 同一臺計算機的進程通信稱為 IPC(Inter-process communication)
- 不同計算機之間的進程通信,需要通過網絡,并遵守共同的協議,例如 HTTP
- 線程通信相對簡單,因為它們共享進程內的內存,一個例子是多個線程可以訪問同一個共享變量
- 線程更輕量,線程上下文切換成本一般要比進程上下文切換低
二、并行和并發的概念
單核 CPU 下,線程實際還是 串行執行的。操作系統中有一個組件叫做任務調度器,將 CPU 的時間片(Windows 下時間片最小約為 15 毫秒)分給不同的線程使用,只是由于 CPU 在線程間(時間片很短)的切換非常快,人類感覺是同時運行的。總結為一句話就是:微觀串行,宏觀并行。
一般會將這種線程輪流使用 CPU 的做法稱為并發,concurrent。
- 并發(concurrent)是同一時間應對(dealing with)多件事情的能力
- 并行(parallel)是同一時間動手做(doing)多件事情的能力
例子:
- 家庭主婦做飯、打掃衛生、給孩子喂奶,一個人輪流交替做這多件事,這是就是并發
- 家庭主婦雇了個保姆,她們一起做這些事,這時既有并發,也有并行(這時可能會產生競爭,例如只有一口鍋,一個人用鍋時,另一個人就得等待)
- 雇了3個保姆,一個專門做飯、一個專門打掃衛生、一個專門喂奶,互不打擾,這時是并行
三、總結
- 程序是有指令和代碼組成的。進程是運行中的程序,進程可以視為程序的一個實例。一個進程之內可以分為一到多個線程。一個線程就是一個指令流,將指令流中的一條條指令以一定的順序交給 CPU 執行。
- 單核 CPU 下,線程實際還是 串行執行的。
- 并行:多個 CPU 同時執行多個任務,比如:多個人同時做不同的事。
- 并發:一個 CPU(采用時間片)同時執行多個任務,比如:秒殺、多個人做同一件事。
- 一般會將這種線程輪流使用 CPU 的做法稱為并發。