進程 Vs 線程、併發 Vs 並行

進程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函數所在的線程以及上述的幾個線程都是屬於這一個進程的。

進程與線程的區別
  1. 線程是程序執行的最小單位,而進程是操作系統分配資源的最小單位;
  2. 一個進程由一個或多個線程組成,線程是一個進程中代碼的不同執行路線
  3. 進程之間相互獨立,但同一進程下的各個線程之間共享程序的內存空間(包括代碼段,數據集,堆等)及一些進程級的資源(如打開文件和信號等),某進程內的線程在其他進程不可見;
  4. 每個進程都有獨立的代碼和數據空間(程序上下文),程序之間的切換會有較大的開銷;線程可以看做輕量級的進程,同一個進程內的線程共享一定的代碼和數據空間,每個線程都有自己獨立的運行棧和程序計數器(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

站在巨人的肩膀上~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章