進程Vs線程、併發Vs並行
CPU核心數跟線程數的關係?
對於一個CPU,線程數>=核心數
也就是說,一個核心最少可以對應一個線程,但通過超線程技術,一個CPU核心可以同時運行倆個線程。
- 線程數可等同於在某一時刻,CPU並行執行任務的數量。
進程Vs線程
何爲進程?
- 進程是一個具有獨立功能的程序,在一個數據集上的一次動態執行的過程,是系統進行資源分配和調度的基本單位。
- 在早期面向進程設計的計算機結構中,進程是程序的基本執行實體。
- 在當代面向線程設計的計算機結構中,進程是線程的容器。
- 程序是指令、數據及其組織形式的描述,進程是程序的實體。
第一點
進程是一個實體。每一個進程都有它自己的地址空間,一般情況下,包括文本區域(text region)、數據區域(data region)和堆棧(stack region)。文本區域存儲處理器執行的代碼;數據區域存儲變量和進程執行期間使用的動態分配的內存;堆棧區域存儲着活動過程調用的指令和本地變量。
第二點
進程是一個“執行中的程序”。程序是一個沒有生命的實體,只有處理器賦予程序生命時(操作系統執行之),它才能成爲一個活動的實體,我們稱其爲進程。
簡而言之呢,可概括爲:
- 進程是程序的一次執行過程,是系統運行程序的基本單位,因此進程是動態的。
- 系統運行一個程序即是一個進程從創建,運行到消亡的過程。
何爲線程?
- 線程是操作系統能夠進行運算調度的最小單位。
- 被包含在進程之中,是進程中的實際運作單位。
- 一條線程指的是進程中一個單一順序的控制流,一個進程中可以併發多個線程,每條線程並行執行不同的任務。
重要的一點
各個線程之間共享程序的內存空間(也就是所在進程的內存空間)。
一個標準的線程由線程ID,當前指令指針PC,寄存器和堆棧組成。而進程由內存空間(代碼,數據,進程空間,打開的文件)和一個或多個線程組成。
Java中的進程與線程
之所以要整理這麼多,是因爲,我覺得只總結幾句話的話真的很難理解什麼叫進程什麼叫線程,大家多讀讀上述概念自然就明白了。
接下來我們回到JAVA中來。
public class MultiThread {
public static void main(String[] args) {
// 獲取 Java 線程管理 MXBean
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
// 不需要獲取同步的 monitor 和 synchronizer 信息,僅獲取線程和線程堆棧信息
ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
// 遍歷線程信息,僅打印線程 ID 和線程名稱信息
for (ThreadInfo threadInfo : threadInfos) {
System.out.println("[" + threadInfo.getThreadId() + "] " + threadInfo.getThreadName());
}
}
}
以上程序輸出如下,打印了參與的所有線程名
[5] Attach Listener //添加事件
[4] Signal Dispatcher // 分發處理給 JVM 信號的線程
[3] Finalizer //調用對象 finalize 方法的線程
[2] Reference Handler //清除 reference 線程
[1] main //main 線程,程序入口
在Java中,當我們啓動main函數時,其實就是啓動了一個JVM的進程,而main函數所在的線程以及上述的幾個線程都是屬於這一個進程的。
進程與線程的區別
- 線程是程序執行的最小單位,而進程是操作系統分配資源的最小單位;
- 一個進程由一個或多個線程組成,線程是一個進程中代碼的不同執行路線
- 進程之間相互獨立,但同一進程下的各個線程之間共享程序的內存空間(包括代碼段,數據集,堆等)及一些進程級的資源(如打開文件和信號等),某進程內的線程在其他進程不可見;
- 每個進程都有獨立的代碼和數據空間(程序上下文),程序之間的切換會有較大的開銷;線程可以看做輕量級的進程,同一個進程內的線程共享一定的代碼和數據空間,每個線程都有自己獨立的運行棧和程序計數器(PC),線程之間切換的開銷小。
從JVM角度看Java中進程與線程的關係
併發Vs並行
併發
- 當有多個線程在操作時,如果系統只有一個CPU,則它根本不可能真正同時進行一個以上的線程,它只能把CPU運行時間劃分成若干個時間段,再將時間 段分配給各個線程執行,在一個時間段的線程代碼運行時,其它線程處於掛起狀。.這種方式我們稱之爲併發(Concurrent)。
並行
- 當系統有一個以上CPU時,則線程的操作有可能非併發。當一個CPU執行一個線程時,另一個CPU可以執行另一個線程,兩個線程互不搶佔CPU資源,可以同時進行,這種方式我們稱之爲並行(Parallel)。
二者區別
- 併發是指兩個或多個事件在同一時間間隔內發生,並行是指兩個或者多個事件在同一時刻發生。
以上部分內容參考自
- 百度百科
- https://snailclimb.top/JavaGuide/#/?id=%e5%b9%b6%e5%8f%91
- https://blog.csdn.net/kuangsonghan/article/details/80674777
站在巨人的肩膀上~