1. 程式人生 > 遊戲 >《真女神轉生5》惡魔:所羅門72柱之一貝利亞

《真女神轉生5》惡魔:所羅門72柱之一貝利亞

什麼是程序? 什麼是執行緒?

在開始學習多執行緒之前,我們需要先了解程序與執行緒。

程序與執行緒

最直觀的表現,就是當我們開啟 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 執行緒,它的作用是垃圾回收。