天天看點

CPU線程排程了解

算法概念

假設計算機隻有一個 CPU ,則在任意時刻隻能執行一條機器指令,每個線程隻有獲得 CPU 的使用權才能執行指令。

  • 所謂多線程的并發運作,其實是指從宏觀上看,各個線程輪流獲得 CPU 的使用權,分别執行各自的任務。
  • 在運作池中,會有多個處于就緒狀态的線程在等待 CPU ,Java 虛拟機的一項任務就是負責線程的排程,線程排程是指按照特定機制為多個線程配置設定 CPU 的使用權。

有兩種排程模型:分時排程模型和搶占式排程模型。

  • 分時排程模型是指讓所有的線程輪流獲得 CPU 的使用權,并且平均配置設定每個線程占用的 CPU 的時間片這個也比較好了解。 。
  • Java 虛拟機采用搶占式排程模型,是指優先讓可運作池中優先級高的線程占用 CPU ,如果可運作池中的線程優先級相同,那麼就随機選擇一個線程,使其占用 CPU 。處于運作狀态的線程會一直運作,直至它不得不放棄CPU 。

(使用者空間和核心空間)

線程饑餓概念

饑餓,一個或者多個線程因為種種原因無法獲得所需要的資源,導緻一直無法執行的狀态。

Java 中導緻饑餓的原因:

  • 高優先級線程吞噬所有的低優先級線程的 CPU 時間。
  • 線程被永久堵塞在一個等待進入同步塊的狀态,因為其他線程總是能在它之前持續地對該同步塊進行通路。
  • 線程在等待一個本身也處于永久等待完成的對象(比如調用這個對象的 wait 方法),因為其他線程總是被持續地獲得喚醒。

線程優化級概念

每一個線程都是有優先級的,一般來說,高優先級的線程在運作時會具有優先權,但這依賴于線程排程的實

現,這個實作是和作業系統相關的(OS dependent)。

  • 我們可以定義線程的優先級,但是這并不能保證高優先級的線程會在低優先級的線程前執行。線程優先級是一個 int 變量(從1-10),1 代表最低優先級,10 代表最高優先級。
  • Java 的線程優先級排程會委托給作業系統去處理,是以與具體的作業系統優先級有關,如非特别需要,一般無需設定線程優先級。

程序

概念

計算機的核心是CPU,它承擔了所有的計算任務,而作業系統是計算機的管理者,它負責任務的排程,資源的配置設定和管理,統領整個計算機硬體;應用程式是具有某種功能的程式,程式是運作于作業系統之上的。

程序是一個具有一定獨立功能的程式在一個資料集上的一次動态執行的過程,是作業系統進行資源配置設定和排程的一個獨立機關,是應用程式運作的載體。程序是一種抽象的概念,從來沒有統一的标準定義。

程序一般由程式,資料集合和程序控制塊三部分組成。

  • 程式用于描述程序要完成的功能,是控制程序執行的指令集;
  • 資料集合是程式在執行時所需要的資料和工作區;
  • 程式控制塊包含程序的描述資訊和是程序存在的唯一标志。

程序具有的特征:

動态性:程序是程式的一次執行過程,是臨時的,有生命期的,是動态産生,動态消亡的;

并發性:任何程序都可以同其他程序一起并發執行;

獨立性:程序是系統進行資源配置設定和排程的一個獨立機關;

結構性:程序由程式,資料和程序控制塊三部分組成。

線程

在早期的作業系統中并沒有線程的概念,程序是擁有資源和獨立運作的最小機關,也是程式執行的最小機關。任務排程采用的是時間片輪轉的搶占式排程方式,而程序是任務排程的最小機關,每個程序有各自獨立的一塊記憶體,使得各個程序之間記憶體位址互相隔離。

後來随着計算機的發展,對CPU的要求越來越高,程序之間的切換開銷較大,已經無法滿足越來越複雜的程式的要求了。于是就發明了線程,線程是程式執行中一個單一的順序控制流程,是程式執行流的最小單元,是處理器排程和分派的基本機關。一個程序可以有一個或多個線程,各個線程之間共享程式的記憶體空間(也就是所在程序的記憶體空間)。一個标準的線程由線程ID,目前指令指針PC,寄存器和堆棧組成。

而程序由記憶體空間(代碼,資料,程序空間,打開的檔案)和一個或多個線程組成。

生命周期

我始終記住:青春是美麗的東西,而且對我來說,它永遠是鼓舞的源泉。——(現代)巴金