Global Sources
電子工程專輯
 
電子工程專輯 > 控制技術/MCU
 
 
控制技術/MCU  

針對多處理器應用的即時作業系統設計策略

上網時間: 2003年09月13日     打印版  Bookmark and Share  字型大小:  

關鍵字:RTOS  即時作業系統  shared memory  共享記憶體  SMP 

隨著對即時系統可靠性、性能和可擴展性要求的提高,多處理器的應用場合日益增多。解決緊耦合共享記憶體問題,以及多任務平行執行問題的目的是確保多處理器(SMP)系統設計中能夠安全有效地共享系統資源,本文從對稱性、旋轉鎖機制、作業系統的結構和中斷管理等方面闡述了SMP系統的設計策略,為將一個單處理器RTOS擴展為支援SMP的系統提供參考。

一般來說,當系統中採用了n個處理器時,應該無需改變任何程式碼就能得到比採用1個處理器時快n倍的處理速度。然而,實際情況並非如此簡單。

多處理器這一概念已經出現了幾十年,但只是最近,隨著對所謂‘高度可用’的CPU密集型系統(即正常執行時間為99.999%的系統)的需求增大,導致業界出現了幾種類型的多處理器系統,例如,多處理器系統就廣泛應用在3D圖像處理等應用中,由專用的多處理器晶片(例如Clearspeed公司的Fuzion

150)來完成音訊╱視訊壓縮和解壓功能。此外,這些系統還被用於高頻寬的網路通訊交換機╱路由器設計中,例如在專用多處理器上實現特殊網管特性設計(利用Broadcom公司的Mercurian系列可程式網路處理器中具有SB-1晶片的SB1250)。

本文著重介紹一種特殊類型的多處理器系統-緊耦合共享記憶體對稱式多處理器(SMP),並討論典型的即時作業系統是怎樣支援這種多處理器的。圖1:共享記憶體對稱式多處理器結構。

SMP配置

在我們的SMP配置中,所謂‘緊耦合’就是指各處理器核心個體之間距離很近,並透過一個通用高速匯流排實現實體互連。這些處理器核心透過一個公共I/O匯流排介面共享一個全局記憶體模組(即共享記憶體)以及諸多周邊設備。

SMP系統和分散式多處理器環境二者之間的差異是我們必須了解的一個問題。在一個分散式多處理器系統中,處理單元個體通常以單獨節點的形式存在,每個這樣的節點中的處理器類型可以不同,並且配備有它自己的記憶體和I/O設備。每個處理器可以執行它自己的作業系統,只透過一種互連方式,利用消息或旗語來與其它處理器同步。這種互連方式可以是乙太網路,也可以是Infiniband這樣的更專用的高速互連方式。

而緊耦合共享記憶體SMP系統則不同。在SMP系統中,所有的處理器都執行作業系統的同一個副本,該作業系統可協調每個相似的CPU上同時產生的活動。由於這些緊耦合CPU所存取的是一個公共記憶體區,所以它們必須透過一種基於低延遲共享記憶體的通訊機制來實現相互之間的同步。

SMP系統的對稱性

SMP系統定義為透過一個公共高速匯流排,將多個相同的處理器與諸如記憶體和I/O設備等一系列周邊設備連接起來的系統。這?使用‘對稱’一詞是因為,每個處理器在存取共享記憶體和周邊設備時,存取機制相同。

圖1所示為一個SMP系統,其中包含2個相同的處理器(P1和P2),一個全局記憶體模組,以及磁碟控制器和網路介面等I/O設備。這2個處理器透過一個公共高速匯流排共享儲存設備。通常,二者透過一個高速匯流排介面與每一台周邊設備間均有連接。

在SMP系統中,各處理器必須透過競爭的方式存取匯流排(例如對全局記憶體進行讀或寫)。如果P1已經佔據了匯流排,正接收從網路介面送來的數據,那麼P2就必須等待P1的作業結束之後才能存取匯流排,向磁碟中寫入數據。這樣一來,只要有任何一個設備正忙於存取記憶體,進行讀寫作業,那麼所有其它想要存取記憶體的設備都只能進入匯流排等待狀態。

然而,每一個這樣的設備中通常都會專門保留一些局部記憶體,以便讓設備自己使用。例如一台I/O設備(以一個常用的網路介面控制器為例)中就保留了一部份局部記憶體,用來對那些在網路上接收到之後,還沒有發送到(通常透過DMA方式)全局記憶體中去,讓P1或P2深入處理的數據進行緩衝或預處理。

在SMP系統中,除了每個CPU均有的中斷控制器以外,通常還另有一個中斷控制器(例如英特爾的IO-APIC),用於將周邊設備發出的中斷請求訊號送給某個CPU,以實現該設備所請求的服務。

由於採用了對稱式硬體結構,SMP系統的軟體設計得以獨立於任何由設備類型或其它與硬體相關的方面決定的專用互聯方案,其中包括系統中處理器的確切數目。

為何要採用SMP?

在我們具體考慮RTOS是如何支援一個SMP系統之前,先了解一下採用SMP系統所帶來的好處:首先,在完成一組任務時,兩個處理單元平行執行比一個處理器單獨執行的速度快許多。同樣道理,四個處理器平行執行時,速度又要比兩個處理器快。其次,一個SMP系統如果能透過添加更多的處理核心和╱或周邊設備來達到平行執行更多任務的目的,那麼這種系統就提供了一個具備較強生命力的可擴展的平台。最後,即使有一個處理器出現了致命故障,其它的處理器也能無縫地接管它的工作,降低系統的停工時間。

此外,採用SMP系統還有一個好處,那就是透過作業系統來採用SMP系統相對較為簡單。因為當作業系統設計得當時,能使硬體中確切的處理單元數對應用程式員透明。於是作業系統就能不進行任何針對SMP的修改而執行現有的應用軟體。

與單處理器系統類似,在SMP系統上執行搶佔型RTOS就能保証在任何時刻,系統中執行的都是優先級最高的任務。但與單處理器系統不同的是,多處理器系統中每個處理器都能執行一項任務,因而整個系統就能同時執行多個任務。當一項優先級較高的任務就緒時,它會搶佔比其優先級低的任務的執行資源。

在一個通常執行在單處理器系統中的多執行緒應用中,RTOS透過互斥原理限制了任何一個任務對全局資源的存取。而加入旋轉鎖(spin

lock)之後,該原理也適用於多處理器系統。當我們在這類多處理器系統中使用RTOS時,主要需考慮旋轉鎖的數目以及採用哪種核心結構恰當。首先,我們來看旋轉鎖。

旋轉鎖

旋轉鎖是最基本的SMP原語。在一個支援SMP系統的核心中採用旋轉鎖可保証數據的完整性。表1中採用偽碼實現了一種簡單的旋轉鎖。

>SPINLOCK

sp_lock是一種核心數據結構。執行在任意一個處理器上的某個任務如果成功調用了lock()函數,就可獲得sp_lock,退出‘spin’循環,並得以對‘spin’所保護的共享資源進行獨佔性存取。當該任務對共享資源的存取結束後,它會調用unlock()函數,將被鎖定的資源解鎖。在這段時間內,所有其它正執行中並正企圖獲取該資源的任務(執行在其它處理器上的任務)都將空轉,並等待sp_lock被重置為0。但當sp_lock被釋放時,只有一個正等待的任務可以成功地獲得它。

下面我們根據圖2中提供的例子來討論旋轉鎖在4處理器環境下是如何工作的。首先,T1在進入其臨界區前獲得了該鎖。當T1還在存取共享資源時,執行在另一個處理器上的T2發出了對同一個鎖的請求,並開始空轉,等待T1釋放該鎖。隨後,T3也調用了lock()並開始空轉。這時,T2和T3均處於空轉狀態,等待獲取該鎖。當T1結束了其臨界程式碼的執行並釋放該鎖後,T3獲得了該鎖,儘管它提出請求的時間比T2還晚。在這一系列作業的過程中,並不存在任何上下文環境切換。

旋轉鎖被上一個任務釋放之後,下一個正空轉並請求獲得旋轉鎖的任務就立即俘獲到這一資訊,並退出while循環,繼續執行其核心程式。如果RTOS支援具有優先級的旋轉鎖,那麼一旦T1釋放了旋轉鎖,空轉任務中優先級最高的任務就會獲得該鎖。

旋轉鎖的另一種工作方式就是在它被釋放後,讓空轉的任務休眠一段時間,切換為執行另一個用戶模式的任務。一旦該任務結束後旋轉鎖被釋放,系統就會調用一個wakeup()函數,喚醒所有正休眠的、向該旋轉鎖發出了請求的任務。

表2提供了一種實現旋轉鎖及其相關休眠-喚醒功能的偽碼。這種實現方式更適用於完成長期互斥。否則,如果某任務佔據旋轉鎖的時間很短,那麼這種休眠-喚醒所造成的上下文環境切換開銷就會將透過切換到其它任務(而不是像表1中一樣,仍然讓執行某任務的處理器空轉等待獲得旋轉鎖)而獲得的性能提高全部抵銷。

以上是旋轉鎖的基本工作原理,下面我們將闡述如何用旋轉鎖來保証一個多處理器核心中數據的完整性。

作業系統的結構

支援SMP硬體的作業系統可能有幾種結構。修改一個單處理器核心使其支援多處理器系統的一種最簡單的方法,就是將整個作業系統視為一個不可分割的整體,並限定所有核心模式的作業均執行於同一個處理器(即主處理器)上,而另一個處理器(即從處理器)只用來執行用戶模式的作業。這樣得到的軟體結構就不再是對稱的。

在一個從處理器上執行的某個任務也可以透過進入一個任務序列來申請核心服務,該序列中的任務均等待著在主處理器上以核心模式執行。如果主處理器正空閒,那麼等待序列中優先級最高的任務就能夠執行。當被申請的核心服務執行完畢時,如果某個任務仍在等待執行,那麼它就進入第二個序列,該序列中的任務均為用戶模式任務,需要在某個從處理器上執行。

注意,這兩個序列(一個用來管理申請在主處理器上執行的任務,另一個用來管理申請在任意一個從處理器上執行的任務)都必須由旋轉鎖保護,因為不同處理器上平行執行的多個任務可能會同時要求存取這兩個序列。而採用兩個旋轉鎖就可以避免出現與這兩個序列相關的競爭條件。

其它的核心數據結構則不需要旋轉鎖保護,因為核心作業通常都在主處理器上執行。因而,只要提到核心,那麼該作業仍然是在一個單處理器環境中執行。只有用戶級任務才用得到從處理器提供的平行機制。

主-從結構的缺點在於只有當大多數任務都以用戶模式執行時,這種結構才能體現其優越性。當應用中所涉及的大部份是核心模式作業時,主-從結構會將所有任務中的核心模式作業均分配在主處理器上執行。因此,系統的總體性能就和單處理器系統的性能相差無幾。而且,如果出現了幾個任務同時請求核心業務的情況,那麼這些任務進出執行序列所帶來的開銷就會急劇降低系統的整體性能。

在一個主-從結構的RTOS中,如果應用包含了40%的核心模式作業,那麼增加第二個CPU最多能將系統性能改善30%。但隨著核心模式作業佔整個CPU利用時間的比例增加,以及更多的任務進出執行序列,該應用的性能很快就會退化。

粗加鎖方式圖2:單個giant lock在多任務之間的傳遞。

主-從型核心的一個精妙之處就在於其粗加鎖方式(giant

lock)結構。粗加鎖將整個作業系統當作一個由旋轉鎖保護的整體單片電路,但又不會將核心模式的作業侷限在某一個特定的處理器上。

任何一個要求核心模式作業的任務都可以獲得粗加鎖,並且繼續在它正使用的處理器上執行。但在某個特定的時刻,這種核心模式的作業仍然只能在某一個處理器上執行。因此,當某項任務佔用著粗加鎖時,其它所有等待獲得核心服務的任務都只能空閒。

在SMP系統的對稱型硬體結構中不存在主處理器或從處理器這樣的概念,因此這種RTOS設計使得任意一個處理器都可以執行核心模式的作業。在這種結構中,消除了切換到另一個處理器所需的開銷,但等待獲得粗加鎖的任務必須空轉。而在一個主-從結構的核心中,在目前任務位於主處理器序列中等待時,從處理器可以切換到另一種模式-用戶模式執行。

圖2提供的就是一個這樣的設計,其中整個核心被當作一個整體,由一個旋轉鎖提供保護。注意,T2耗費了很長時間在空轉中等待T3釋放粗加鎖。因此,如果T1和T3先後延長它們佔用該粗加鎖的時間,那麼T2將繼續空轉,並永不可能進行任何有意義的作業,儘管它實際上仍在某個處理器上執行。因此,如果有幾個任務都在等待獲得核心服務,那麼這些任務將像在單處理器系統中一樣一個接一個地連續執行,而不會像我們選擇多處理器系統時所期望的那樣並發執行。

這就是粗加鎖核心結構的本質缺點。即當幾個任務同時需要進行一段長時間的核心模式作業時,採用粗加鎖的多處理器並不能真正提高應用的性能。粗加鎖結構的這種較差的可擴展能力以及它對中斷延遲的不利影響,最終導致大多數支援多處理器的RTOS都沒有採用這種設計。

粗加鎖核心是細加鎖設計一種極端情況。為了提供優秀的擴展能力,SMP作業系統需要為不同的核心子系統配備單獨的鎖。所謂的核心細加鎖設計就允許各核心子系統同時在不同的處理器上分別以執行緒方式執行,因而這種設計能在一個應用中的各個任務之間實現更好的平行性。

核心細加鎖

設計核心細加鎖(fine-grained

locking)結構的目的是為了讓不同處理器上執行的任務能夠同時執行核心模式作業。採用這種結構的核心叫做執行緒化核心(threaded

kernel)。這是透過對不同的核心子系統分別採用旋轉鎖來實現的,以便企圖存取這些子系統的任務能夠並發執行。

加鎖機制的粒度(granularity)決定了最大可並發執行的核心執行緒數。例如,大多數作業系統的核心調度器和文件系統組件都是相對核心服務獨立的。因此,採用兩個不同的旋轉鎖就能保護這兩個子系統。這樣,當某項任務正讀╱寫一個較大的文件,作業中涉及耗時的磁碟I/O時,它無需阻斷另一個企圖存取調度器的任務就可完成任務。於是,為這兩個子系統分別配備一個旋轉鎖就得到一個執行緒化的核心,這時兩個不同的任務就能同時以核心模式執行。

如圖3所示,當T1忙於磁碟I/O時,T2可以啟動優先級較高的T3,因而使得這段時間內,T2和T3能夠進行一些有意義的作業,而不是空轉。注意,T3在它自己作業失靈之前先釋放了它獲得的旋轉鎖。如果T3不釋放這個旋轉鎖,那麼就將導致所有其它企圖獲得該旋轉鎖的任務永遠空轉。

核心的這種細加鎖機制在很大程度上增大了用戶任務在執行時的平行性,這對促進CPU的利用和提高整個應用的數據吞吐量有很大幫助。

然而,為每個不同的核心子系統分別配備額外的旋轉鎖後,為了保証每個子系統內的互斥性,必須對每個旋轉鎖分別管理,這就導入了多個旋轉鎖的管理開銷。

同時,設置多個旋轉鎖還使系統出現了死鎖的可能。例如,在圖3所描述的情景下,結果可能出現:


1. T1獲得SP_LOCK1圖3:兩個旋轉鎖。


2. T2獲得SP_LOCK2


3. 然後T2企圖獲得SP_LOCK1,因而在空轉中等待T1釋放SP_LOCK1


4. 最後T1企圖獲得SP_LOCK2,因而在空轉中等待T2釋放SP_LOCK2

這就導致整個系統因死鎖而挂起。當作業系統中的旋轉鎖數目更多時,這一問題會變得更加複雜(這個問題可透過實現區分優先級的旋轉鎖或優先繼承協議1來解決,前者必須限定最高優先級)。

基於以上原因,我們在管理多旋轉鎖所帶來的開銷和應用中期望得到的平行度之間必須進行仔細權衡。這時,最好能夠確定哪些核心子系統需要單獨的旋轉鎖。在仔細選擇出一組應單獨受旋轉鎖保護的核心子系統後,RTOS設計通常就能為其SMP實現(針對某些特定類型的應用)提供較強的擴展能力。

細加鎖機制的應用

MontaVista Linux專業版是Linux

2.4核心的派生產品,內帶一個完全搶佔調度器。它的SMP核心中就採用了細加鎖機制,以便改善其可擴展性。這樣設計之後,用戶任務就能在不同的處理器上以單獨的核心模式執行緒並發執行。

在其它更流行的商業RTOS廠商中,QNX和Wind

River也宣稱支援多處理器。在對多處理器的支援方面,Wind

River的VxWorks或VxMP均有同步原語,該同步原語基於各節點上所執行的不同VxWorks之間的消息傳遞介面,目的主要針對涉及電路板級互聯的多板設計,而不是傳統的SMP設計。

QNX則支援作業系統為微核結構而非整體結構的SMP設計。其核心自身支援一組核心服務,如調度器或中斷管理器,而其它諸如網路I/O(包括協議堆疊)等服務則以單獨的進程方式執行。這就使核心模式作業的執行時間非常短,因而在實現SMP加鎖機制時,可將微核看作一個單一的實體。欲獲知更多有關QNX及其微核結構的資訊,請參看QNX系統結構手冊2。

中斷管理

作為RTOS設計一個重要方面,對系統定時器和I/O設備等各種中斷驅動設備的服務機制要專門討論。以系統定時器為例,系統時脈中斷所造成的延遲直接關係到系統的調度延遲,而調度延遲則決定了RTOS核心的即時性能。

在一個典型的單處理器RTOS中,為了避免在存取同一個全局共享資源的任務和中斷句柄之間出現潛在競爭條件,當一個任務正執行其臨界區程式碼時,該任務會暫時禁止各種中斷。然而在一個多處理器系統中,僅僅禁止中斷並不足以避免出現競爭條件。

假設出現這樣的情況,當列表3所示的中斷句柄Timer_ISR()正接受服務時,執行在另一個處理器上的任務Task_1禁止了中斷,並進入其臨界程式碼區。這時,系統時脈中斷句柄Timer_ISR()和Task_1()同時執行,而且均要存取全局變量‘time’。於是,Task_1()和Timer_ISR()之間就出現了競爭條件,Task_1()所讀取的‘time’變量目前的值為秒級,而實際值則在微秒級。

為了避免在SMP系統中的任務和中斷服務程式(ISR)之間出現競爭條件,任務和ISR二者均必須獲得一個旋轉鎖才能存取它們的臨界區所用到的共享資源,即二者必須實現互斥存取。

列表4提供的是修改後的Task_1()和Timer_ISR()的偽碼。如果ISR發現已有其它程式在使用旋轉鎖,那麼它將在空轉中等待其它任務或ISR釋放該旋轉鎖。這對中斷延遲以及整個系統對外部事件的響應均有影響。

在主-從處理器配置中,所有中斷句柄均要求核心模式的作業,所以它們均只能在主處理器上執行,這種方式潛在地避免了以上競爭條件。但在粗加鎖設計和核心細加鎖設計中,我們必須在中斷句柄程式中實現這種旋轉鎖保護功能。

在核心細加鎖設計中,旋轉鎖對中斷延遲的影響非常不利。因為在這種系統中,所有任務和ISR都必須透過競爭來獲取唯一的核心旋轉鎖。

但在一個SMP系統中,如果某應用涉及大量的I/O作業,而這些I/O作業中又有很大部份均為需要核心模式作業的中斷驅動數據傳輸任務,那麼通常必須採用核心細加鎖設計才能滿足合理的平行性。

本文小結

由於緊耦合共享記憶體的SMP系統具備以上種種獨特功能,所以可以用這種系統來代替目前的單處理器系統,以便為那些CPU佔用比例較大並且實用性較高的設計提供可擴展的平台。

將一個單處理器RTOS擴展為支援SMP的系統其實並不困難,通常只需在作業系統中加入一些基本的原語(如旋轉鎖等)。只要我們設置好旋轉鎖,再選擇一種恰當的核心結構,用戶級的任務就能在多處理器上平行執行,並能同時安全有效地競爭共享資源。設計者應根據應用所需的平行度和正確管理旋轉鎖所能承受的開銷來決定使用旋轉鎖的數目。

從一個單處理器系統過渡到SMP系統後,系統的整體數據吞吐量並不一定會有所提高,但各種多執行緒應用和可平行化的算法卻能夠大幅加速執行速度。

本文作者Srinivas Dharmasanam是Pillar Data Systems公司的工程師。他在Ann

Arbor的密西根大學獲得航空和航空工程的MS學位。可透過the_srinivas@hotmail.com與他聯繫。

作者:Srinivas Dharmasanam




投票數:   加入我的最愛
我來評論 - 針對多處理器應用的即時作業系統設計策...
評論:  
*  您還能輸入[0]個字
*驗證碼:
 
論壇熱門主題 熱門下載
 •   將邁入40歲的你...存款多少了  •  深入電容觸控技術就從這個問題開始
 •  我有一個數位電源的專利...  •  磷酸鋰鐵電池一問
 •   關於設備商公司的工程師(廠商)薪資前景  •  計算諧振轉換器的同步整流MOSFET功耗損失
 •   Touch sensor & MEMS controller  •  針對智慧電表PLC通訊應用的線路驅動器
 •   下週 深圳 llC 2012 關於PCB免費工具的研討會  •  邏輯閘的應用


EE人生人氣排行
 
返回頁首