在開始學習多執行緒之前,我們需要先了解行程與執行緒,
行程與執行緒
最直觀的表現,就是當我們打開 Mac 的「活動監視器」時,會發現有兩個欄,分別是「行程名稱」與「執行緒(數量)」,

其中,行程可以簡單地理解為程式的一次運行,比如我們打開了「網易云音樂」,就會有一個「網易云音樂」的行程,我們好像并沒有見過叫做「kernel_task」的軟體,這類程式其實是系統的后臺行程,它隨作業系統的啟動而啟動,完成作業系統的基本服務功能,另外一類程式也被稱為用戶行程,它是由用戶來啟動,完成用戶所需要的具體的應用功能,比如瀏覽網站,聽音樂,上面說的「網易云音樂」就是一個用戶行程,
一個行程可以有一個或多個執行緒,上圖執行緒一欄的數字就代表對應行程中的執行緒數量,各個執行緒共享行程的記憶體空間、系統資源,早期的作業系統其實只有行程,沒有執行緒,隨著 CPU 計算能力的顯著提升,為了提高 CPU 的利用率,彌補行程獨傲度過于笨重的問題,行程內部演進出了并發調度的需求,于是發明了執行緒,
行程是作業系統資源分配的最小單位,執行緒是 CPU 調度的最小單位,
行程的結構
一個行程,大致可以被分為三個部分:代碼段、資料段、行程控制塊,
代碼段:行程的程式指令在記憶體中的位置,包含需要執行的指令集合,
資料段:行程的操作資料在記憶體中的位置,
行程控制塊(PCB):包括描述資訊和控制資訊,
下面我們來說說,PCB 里面一些重要的概念,
行程 ID:行程的唯一標識,在作業系統中我們很常見到他們,即 PID,
行程名稱:跟人名一樣,行程也有各自的名稱,
行程狀態:分為新建態、終止態,運行態,就緒態,阻塞態,
行程優先級:行程調度的重要依據,行程優先級越好,則越有可能被優先調度,
程式起始地址:程式第一行指令的記憶體地址,程式就是從這個地址開始執行的,
通信資訊:行程間通信時的訊息佇列,
記憶體資訊:行程的記憶體占用情況以及記憶體管理所用的資料結構,
I/O 設備資訊:所用的I/O設備編號及相應的資料結構,
檔案句柄:所打開檔案的資訊,
行程背景關系:行程的環境,包括 CPU 暫存器、程式計數器(PC)以及各種堆疊,在行程讓出 CPU 時,行程的背景關系環境就會保存在 PCB 中,供下次恢復運行時使用,
執行緒的結構
與行程相似,一個執行緒主要由三個部分組成:執行緒描述資訊、程式計數器(PC)、堆疊記憶體,
執行緒描述資訊:即執行緒的基本資訊,
PC:記錄了執行緒下一條指令的代碼段記憶體地址,
堆疊記憶體:執行緒中的區域變數存盤在堆疊記憶體中,這部分記憶體為執行緒獨立擁有的,不會在執行緒之間共享,
那么,執行緒都有哪些基本資訊?
執行緒 ID:執行緒的唯一標識,
執行緒名稱:方便用戶識別,用戶可以指定執行緒名稱(不指定則系統自動分配),
執行緒優先級:執行緒調度的優先級,優先級越高,獲得 CPU 的執行機會就越大,
執行緒狀態:執行緒的執行狀態,分為新建、就緒、運行、阻塞、結束,
其他:比如,是否是守護執行緒,
Java 中的行程與執行緒
眾所周知,Java 程式是運行在 JVM 之上的,每當我們使用 Java 命令啟動一個 Java 程式,就會啟動一個 JVM 行程,JVM 會尋找程式的入口(main 方法),運行 main 方法便有了「主執行緒」,
除了主執行緒之外,Java 行程還包含一些「守護執行緒」,比如 GC 執行緒,它的作用是垃圾回收,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/356019.html
標籤:Java
上一篇:JVM垃圾回識訓制
