SMP CPU調度   用於多道程序

SMP CPU調度   用於多道程序

SMP(Symmetric Multi-Processor) :對稱多處理器
SMP 服務器的主要特徵是共享,系統中所有資源 (CPU 、內存、 I/O 等 ) 都是共享的。也正是由於這種特徵,導致了 SMP 服務器的主要問題,那就是它的擴展能力非常有限。對於 SMP 服務器而言,
每一個共享的環節都可能造成 SMP 服務器擴展時的瓶頸,而最受限制的則是內存。由於每個 CPU 必須通過相同的內存總線訪問相同的內存資源,因此隨着 CPU 數量的增加,內存訪問衝突將迅速增加,
最終會造成 CPU 資源的浪費,使 CPU 性能的有效性大大降低。實驗證明, SMP 服務器 CPU 利用率最好的情況是 2 至 4 個 CPU 。NUMA(Non-Uniform Memory Access):非一致性內存訪問
 NUMA 服務器的基本特徵是具有多個 CPU 模塊,每個 CPU 模塊由多個 CPU( 如 4 個 ) 組成,並且具有獨立的本地內存、 I/O 槽口等。由於其節點之間可以通過互聯模塊 ( 如稱爲 Crossbar Switch) 進行連接和信息交互,
因此每個 CPU 可以訪問整個系統的內存 ( 這是 NUMA 系統與 MPP 系統的重要差別 ) 。顯然,訪問本地內存的速度將遠遠高於訪問遠地內存 ( 系統內其它節點的內存 ) 的速度,這也是非一致存儲訪問 NUMA 的由來。由於這個特點,
爲了更好地發揮系統性能,開發應用程序時需要儘量減少不同 CPU 模塊之間的信息交互。


wKiom1OVIYeiO8ffAADq2BwuhCU582.jpg
SMP應用

目前的SMP技術主要用在RISC服務器陣營的多路小型機、X86服務器陣營的多路處理系統以及採用部分採用虛擬CPU技術實現單CPU(或多CPU)虛擬多路中。

我們平時見到的雙路CPU系統,屬於對稱多處理系統中最常見的一種,通常稱爲"2路對稱多處理",它在普通的商業、家庭應用之中並沒有太多實際用途,但在專業製作,如3DMax Studio、Photoshop等軟件應用中獲得了非常良好的性能表現,
是組建廉價工作站的良好夥伴。隨着用戶應用水平的提高,只使用單個的處理器確實已經很難滿足實際應用的需求,因而各服務器廠商紛紛通過採用對稱多處理系統來解決這一矛盾。在國內市場上這類機型的處理器一般以4個或8個爲主,
有少數是16個處理器。但是一般來講,SMP結構的機器可擴展性較差,很難做到100個以上多處理器,常規的一般是8個到16個,不過這對於多數的用戶來說已經夠用了。這種機器的好處在於它的使用方式和微機或工作站的區別不大,
編程的變化相對來說比較小,原來用微機工作站編寫的程序如果要移植到SMP機器上使用,改動起來也相對比較容易。SMP結構的機型可用性比較差。因爲4個或8個處理器共享一個操作系統和一個存儲器,一旦操作系統出現了問題,
整個機器就完全癱瘓掉了。而且由於這個機器的可擴展性較差,不容易保護用戶的投資。但是這類機型技術比較成熟,相應的軟件也比較多,因此現在國內市場上推出的並行機大量都是這一種。PC服務器中最常見的對稱多處理系統通常採用2路、
4路、6路或8路處理器。目前UNIX服務器可支持最多64個CPU的系統,如SUN公司的產品Enterprise 10000。SMP系統中最關鍵的技術是如何更好地解決多個處理器的相互通訊和協調問題。


SMP組建條件

要組建SMP系統,首先最關鍵的一點就是需要合適的CPU相配合。我們平時看到的CPU都是單顆使用,所以看不出來它們有什麼區別,但是,實際上,支持SMP功能並不是沒有條件的,隨意拿幾塊CPU來就可以建立多處理系統那簡直是天方夜談。
要實現SMP功能,我們使用的CPU必須具備以下要求:

1、CPU內部必須內置APIC(Advanced Programmable Interrupt Controllers)單元。Intel 多處理規範的核心就是高級可編程中斷控制器(Advanced Programmable Interrupt Controllers--APICs)的使用。CPU通過彼此發送中斷來完成它們之
間的通信。通過給中斷附加動作(actions),不同的CPU可以在某種程度上彼此進行控制。每個CPU有自己的APIC(成爲那個CPU的本地APIC),並且還有一個I/O APIC來處理由I/O設備引起的中斷,這個I/O APIC是安裝在主板上的,但每個CPU上
 的APIC則不可或缺,否則將無法處理多CPU之間的中斷協調。

2、相同的產品型號,同樣類型的CPU核心。例如,雖然至強和皓龍各自都內置有APIC單元,想要讓它們一起建立SMP系統是不可能的,同時,即使同屬於至強系列或者皓龍系列的CPU核心,而且屬於同一開發平臺,也不能建立SMP系統--這是因爲他
們的運行指令不完全相同,APIC中斷協調差異也很大。

3、完全相同的運行頻率。如果要建立雙至強或雙皓龍系統,必須兩顆2.8GHz或者兩顆3.0GHz處理器,不可以用一顆2.8GHz,另一顆3.0GHz來組建,否則系統將無法正常點亮。

4、儘可能保持相同的產品序列編號。即使是同樣核心的相同頻率處理器,由於生產批次不同也會造成不可思議的問題。兩個生產批次的CPU作爲雙處理器運行的時候,有可能會發生一顆CPU負擔過高,而另一顆負擔很少的情況,無法發揮最大性能,
  更糟糕的是可能導致死機,因此,應該儘可能選擇同一批生產的處理器來組建SMP系統。




以下討論對於單CPU的調度問題。

回顧多道程序,同時把多個進程導入內存,使得一個進程在CPU中執行I/O時,一個進程用來填補CPU的時間。

通常進程都是在CPU區間和I/O區間之間轉換。

CPU調度程序稱爲短期調度程序,從內存調度到CPU。

在內存中等待的就緒隊列的節點是PCB。有許多不同的隊列實現方法。

搶佔調度和非搶佔調度(協作):前者爲一個進程還沒結束之前就被奪取CPU的擁有權,而後者則要一個進程結束或等待I/O纔給予其他進程CPU的擁有權。

雖然現代操作系統都是用搶佔調度,但是對於同時訪問一個數據來說就會有風險,比如一個進程在試圖更新一個數據,但是另一個進程搶佔,並且讀取這個數據,使得數據不一致。這時就要用到進程同步的內容。lock

對於中斷隨時可能發生的情況,我們可以在執行某個代碼段時,禁止中斷。

分派程序用來把CPU的擁有權交給短期調度程序選定的進程。每次切換進程時都要使用。

分派延遲:分派程序所花的時間。

CPU調度需要考慮的因素:

1.CPU使用率。

2.吞吐量:單位時間完成進程的數量。

3.週轉時間:進程提交到進程完成。即從磁盤等待進入內存+就緒隊列等待時間+CPU執行時間+I/O執行時間。但是CPU調度算法只是裏面的一塊。

4.等待時間:在就緒隊列等待的時間之和。

5.響應時間:用於交互系統。

CPU調度算法:     Gantt圖考點求等待時間

此算法應用於內存就緒隊列到CPU的過程。

1.FCFS 先到先服務

一旦選定進程,那麼在結束之前就不能再切換到另一個進程。

2.SJF 最短優先  精確的講是最短下一個CPU區間的算法

前面提到,一個進程是由CPU區間和I/O區間交替組成的。而SJF是看哪個進程的CPU區間最短。

(1)SRTF搶佔式:又稱最短剩餘優先,當新進來的進程的CPU區間比當前執行的進程所剩的CPU區間短,則搶佔。

(2)非搶佔:稱爲下一個最短優先,因爲在就緒隊列中選擇最短CPU區間的進程放在隊頭。

SJF用於長期調度而不能用短期調度,因爲進程是一個整體,CPU沒法知道進程中第一個CPU區間長度。

SJF需要確定下一個CPU區間的時間長度,可以通過近似估算出下一個CPU區間的長度,比如tn+1=atn+(1-a)rn  tn爲最近最近一次的CPU時間,rn爲歷史記錄。a是給定的權重。

3.優先級調度算法  pintos的優先級是0-63  0爲最低優先級,63爲最高優先級

SJF是特殊的優先級調度算法,以CPU區間長度的倒數爲優先級。

(1)內部優先級:通過內部數據比如內存要求等。

(2)外部優先級:用戶自己設定。set_priority

分爲搶佔式和非搶佔式,前者爲如果進來的進程優先級高於運行的進程,則替換;後者只是在就緒隊列中按優先級排隊。

缺點:無線阻塞或飢餓。前者爲一個優先級高且運行時間長的進程一直阻塞,後者爲優先級低的進程永遠都得不到執行。

解決飢餓的方法是老化。通過每個時間間隔後將等待的進程優先級降低。

4.轉輪法 RR算法 搶佔式

用於分時系統。每個進程都佔用一個時間片的時間。就緒隊列爲FIFO循環隊列。如果一個進程的CPU區間長度小於時間片,則繼續下面的進程;如果大於時間片,則中斷切換到下一個進程執行。

通常時間片長度爲10ms-100ms,由此需要確定時間片大小使得上下文切換次數適當少。

5.多級隊列調度

根據某種性質將一個就緒隊列分成不同的獨立隊列,如系統進程,交互進程(前臺進程),交互編輯進程,批處理進程,學生進程。

每個隊列都有不同的調度算法。

每個隊列都有優先級,比如前臺隊列就比後臺隊列要有絕對的優先級,因此隊列間的分配方法:

(1)只有優先級高的隊列爲空,才能執行低優先級隊列。

(2)爲隊列分配不同權重的CPU時間,優先級高的分配時間多。

6.多級反饋隊列   搶佔式

動態調整進程,進程在不同隊列之間移動,雖然在隊列間移動需要耗費資源,但是更合理。

按照CPU區間的大小分隊列。

進程之間的劃分是按照所花CPU時間劃分,比如隊列0是就緒隊列,且規定一個時間上界,如果一個進程沒能規定時間完成,則被放入隊列1中。CPU區間越大的進程就被放入低優先級中。每個進程一開始都進入就緒隊列。

多級反饋隊列的參數:

1.隊列的數量。

2.每個隊列的調度算法。

3.怎樣升級到優先級更高的隊列。

4.確定怎樣降級到優先級更低的隊列。

5.進程需要確定進入哪個隊列。

接下來講多個CPU的負載均衡問題。

假設多個CPU是同構的,但是可能也會有特殊的限制比如只有某個CPU與I/O設備連接。

(1)非對稱多處理:一個處理器專門用於CPU調度決定等,其他用於執行用戶代碼。

(2)對稱多處理(SMP):爲每個處理器自我調度,可能會造成多個處理器同時訪問同一個數據結構則會造成衝突。

處理器親和性:一個進程只需要在一個處理器上執行即可,不會轉到另一個處理器上執行,因爲如果轉移的話,處理器緩存的資源全部無效,浪費。緩存存儲的是進程的連續訪問的數據。

軟親和性:佔時的不會轉移。

硬親和性:操作系統不允許進程在多處理器間遊走。

負載平衡條件:每個處理器都有私有的就緒隊列。

負載平衡方法:push和pull。即從負載高的處理器push到低負載的處理器上,從負載低的處理器pull到負載高的處理器,但是這樣就缺失了處理器親和性。

一個物理處理器可以劃分爲邏輯處理器,SMT(對稱多線程)使得在一個物理處理器上同時運行多個線程。

邏輯處理器對於物理處理器就像線程對進程。多個邏輯處理器共享物理處理器的資源,如緩存和總線。

舉個例子,就像分區一樣,硬盤分爲C盤,D盤等,但事實上不是真的分硬盤。更理論的講,像數據庫的邏輯和物理關係。

系統調度的是內核線程,用戶線程由線程庫管理。如果線程要在CPU上運行,需要與某個內核線程相連。

用戶線程需要連接到LWP(進程競爭範圍PCS)。

內核線程連接到物理CPU(系統競爭範圍SCS)。

linux採用搶佔、優先級的調度算法,較高優先級的進程被分配較多的CPU時間片。每個處理器都維護一個運行隊列。運行隊列分爲活動和到期的,前者是進程所耗時間小於時間片的,後者是所花時間大於時間片的任務。

當活動隊列爲空,則互換兩隊列。

調度算法的評估:

1.分析評估法。事先確定負荷和算法,即一些本來可以自己設定的數據,比如確定特定算法FCFS,確定進程到來的時間和數量;根據不同的模型來比較性能。缺點是隻適用於特定的情況。

2.排隊模型。數學公式以分析CPU和I/O的區間分佈,給定進程到達系統的時間分佈,排隊網絡分析。LITTLE公式:進入隊列的進程和離開隊列的進程要相等。

3.模擬。建模計算機系統,模擬程序,根據概率分佈隨機生成數據,不能對於前後事件進行預測。但是通過跟蹤磁帶來記錄真實系統的運作,再來按照這種順序來模擬即可。

4.實現。編程後放入操作系統,觀測。

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