1. 程式人生 > >程序、執行緒以及CPU排程

程序、執行緒以及CPU排程

一、程序概念

程序是執行中的程式,形成所有計算的基礎。更完整的解釋是一個具有獨立功能的程式關於某個資料集合的一次執行活動。它可以申請和擁有系統資源,是一個動態的概念,是一個活動的實體。它不只是程式的程式碼,還包括當前的活動,通過程式計數器的值和處理暫存器的內容來表示。

二、程序狀態

程序有五種狀態,分別是:

新的:程序正在被建立

執行:指令正在被執行

等待:程序等待某個事件的發生(如I/O完成或收到訊號)

就緒:程序等待分配處理器

終止:程序完成執行

這五種狀態的變遷圖如下:


三、執行緒

執行緒由執行緒ID、程式計數器、暫存器集合和棧組成。它與屬於同一個程序的其他執行緒共享程式碼段、資料段和其他作業系統資源。

執行緒是CPU排程的基本單元,程序是系統資源分配的基本單元,一個程序中可能包含多個執行緒。

多執行緒程式設計具有響應度高、資源共享、經濟和多處理器體系結構的利用四個優點。雖然我們使用者程序中可以有很多執行緒可以執行,但實際上這些使用者執行緒都是對映到核心執行緒上來執行的。使用者執行緒和核心執行緒之間的對映關係模型包含有:

(1)多對一

(2)一對一

(3)多對多

執行緒庫為程式設計師提供了建立和管理執行緒的API。主要有兩種方法來實現執行緒庫,一種是使用者空間的本地函式庫(非系統呼叫),一種是系統直接支援的核心級庫(系統呼叫)。目前使用的主要有三種執行緒庫,如下:

(1)POSIX Pthread:Linux下使用的API,有使用者級也有核心級的庫

(2)Win32:Windows下的核心級執行緒庫

(3)Java:使用者級的庫,Java虛擬機器通常呼叫宿主機上的執行緒庫來實現,在windows上就是採用win32 API。

四、CPU排程

我們通常說的CPU排程是講程序排程,實際上現在支援一個程序包含多執行緒的作業系統中CPU的排程物件都是針對的核心執行緒,不過排程演算法是一樣的。下面我們都用程序排程來說排程演算法。每個程序的執行都是若干個CPU區間和I/O區間組成,I/O約束程式通常具有很短的CPU區間,CPU約束程式可能有少量的長CPU區間,瞭解程序的這種分佈有助於選擇合適的排程演算法。

CPU的排程決策會發生在如下四種情況下:

(1)執行-->等待

(2)執行-->就緒

(3)等待-->就緒

(4)執行-->終止

對於(1)和(4)兩種情況都是執行的程序要麼是資源條件不足,要麼是執行結束了,這個時候需要選擇新的就緒佇列的程序轉入執行狀態,因此只有排程,沒有選擇;對於(2)和(3)兩種情況下則是有程序進入就緒狀態,這時可以選擇。當排程只能發生在(1)和(4)兩種情況下時,排程方案稱為非搶佔排程(新的就緒程序的出現不影響正在執行的程序),否則稱為搶佔排程(新的就緒程序可能搶佔了當前執行程序的CPU資源)。

為了比較不同的排程演算法,產生了許多的排程準則,如下:

CPU使用率:需要使CPU儘量忙

吞吐量:一個時間單元內所完成程序的數量

週轉時間:從程序提交到程序完成的時間段

等待時間:在就緒佇列等待所花費時間之和

響應時間:從提交請求到產生第一相應的時間

好的排程演算法都是使CPU使用率和吞吐量最大化,而使週轉時間、等待時間和響應時間最小化。下面一一介紹具體的排程演算法。

1、先來先服務(FCFS)

最簡單的CPU排程演算法,根據程序進入就緒佇列的先後順序排程程序執行。但是這種方法的平均等待時間通常較長。

2、最短作業優先排程(SJF)

將每個程序與下一個CPU區間段相關聯,當CPU空閒時,他回賦給具有最短CPU區間的程序。如果兩個程序具有相同CPU區間長度,可以使用FCFS來排程。這裡的CPU區間長度是程序的下一個CPU區間長度,而不是程序的CPU區間總長度。此演算法可證明是最佳的,其難點在於如何知道程序的下一個CPU區間的長度。近似的情況下只能通過預測來做。

3、優先順序排程

每個程序都有一個優先順序相關聯,具有最高優先順序的程序會被分配到CPU,具有相同優先順序的程序根據FCFS順序排程。實際上短作業優先就是優先順序排程演算法的一個特例。

優先順序排程演算法的一個主要問題是導致低優先順序的程序產生無窮阻塞或飢餓(可以執行但是缺乏CPU),其解決問題之一就是老化,即以逐漸增加在系統中等待很長時間的程序的優先順序。

4、時間片輪轉法排程(RR)

為分時系統而設計,類似於FCFS,不過每個程序只分配不超過一個時間片的CPU,對就緒佇列中的程序依次迴圈分配時間執行。

5、多級佇列排程

將就緒佇列中的程序根據程序的屬性不同而永久分配到多個獨立的佇列中,每個佇列都有自己的排程演算法。同時佇列中也有排程,通常採用固定優先順序搶佔排程。

6、多級反饋佇列排程

跟多級佇列排程相似,最大的不同是允許程序在佇列之間移動。主要思想是根據不同CPU區間的特點以區分程序,如果程序使用過多CPU時間,那麼它會被轉移到更低優先順序佇列。

多級反饋佇列排程是最通用的CPU排程演算法但是因為要設定很多排程引數,因此也是最複雜的演算法。

五、多處理器排程

如果有多個CPU,則負載分配成為可能,同時相應的排程問題也變得更為複雜。與單處理器的CPU排程一樣沒有最好的排程演算法。在多處理器上的CPU排程通常有兩種方法,如下:

非對稱多處理:讓一個處理器處理所有排程決定、I/O處理以及其他系統活動,其他的處理器只執行使用者程式碼。這種方法更簡單,因為只有一個處理器訪問系統資料結構,減輕了資料共享的需要。

對稱多處理(SMP):每個處理器自我排程,排程通過每個處理器檢查共同就緒佇列並選擇一個程序來執行。現在的作業系統一般都支援這種方式。

由於CPU的排程,因此一個程序通常不會在處理器上一次性執行完,中間可能會讓出CPU,對於對稱多處理排程方法,則有可能程序從一個處理器遷移到另外一個處理器上執行,而程序相關的資料在原處理器的快取中,這樣會導致快取無效和重建,其代價很高;因此絕大多數非對稱系統都儘量使一個程序在同一個處理器上執行,這個被稱為處理器親和性。

通過提供多個物理處理器,SMP系統允許同時執行幾個執行緒。還有一種是提供多個邏輯處理器而不是物理處理器來實現,這種方法稱為對稱多執行緒(SMT)。也叫超執行緒技術。SMT實際上就是在一個物理處理器上生成多個邏輯處理器,向作業系統呈現一個多邏輯處理器的檢視,同時每個邏輯處理器都有它自己的架構狀態,包括通用的目的和機器狀態暫存器。但是這種技術是需要硬體提供支援,而不是軟體,硬體應該提供每個邏輯處理器的架構狀態的表示和中斷處理方法。