專利名稱:基于片上多處理器的線程調度實現(xiàn)方法
技術領域:
本發(fā)明屬于嵌入式操作系統(tǒng)技術領域,具體涉及一種基于片上多處理器的線程調度實 現(xiàn)方法。
背景技術:
處理器的性能提升主要依靠提高其主頻,然而隨著主頻的不斷提升,處理器的晶體管 數目也不斷增大,功耗問題逐漸顯現(xiàn),顯然工藝的提升可以解決部分功耗問題,但工藝提 升本身就是一個耗資巨大的工程。由于多種因素的合力作用下,人們目前幾乎己不再具備 制造更大更快的單核處理器的能力?,F(xiàn)在的處理器制造廠商開始采用一種新的微處理器設 計模式片上多處理器(chip multiprocesseor,CMP)。片上多處理器就是集成到一個處 理器芯片上,作為一個整體工作的一組單核處理器,此時幾個較小的處理器內核填滿了本 來被單個大型單核處理器占用的芯片面積。
在程序員看來,CMP系統(tǒng)中的多核處理器內核是不同的實體,因此需要將傳統(tǒng)的馮*諾 依曼計算模型替換為全新的并行編程模型(parallel programming model)。實用這種模型, 程序員必須將應用程序劃分為多個線程,每個線程是一個"半"獨立的實體,多個線程可 在CMP系統(tǒng)中不同的處理器內核上并行執(zhí)行。此時如何合理的調度線程在各處理器上運行 成為一個重要問題。傳統(tǒng)的調度算法有很多,例如先來先服務,最短剩余時間調度,優(yōu) 先級調度,輪轉調度等。由于多核系統(tǒng)的興起時間不常,傳統(tǒng)的實時操作系統(tǒng)大多不支持 片上多處理器,但隨著片上多處理器的應用日益廣泛, 一些商用的實時操作系統(tǒng)也開始對 片上多處理器的支持。各廠商支持片上多處理器的方案各有不同,實現(xiàn)方式大體可分為以 下三種
1. 基于同步原語擴展的實時操作系統(tǒng)。這一方案就是在每個處理器上運行一個獨立 的實時操作系統(tǒng),然后通過擴展的組件庫來提供同步原語實現(xiàn)各處理器的通信。如風河公 司的VxWorks。
2. 傳統(tǒng)的SMP結構的實時操作系統(tǒng)。這是傳統(tǒng)的SMP結構,即一個實時操作系統(tǒng)調 度各線程到各CPU上運行,由Linux發(fā)展來的操作系統(tǒng)一般采用這種方案。
3. 基于微內核和分布式技術的實時操作系統(tǒng)。加拿大QNX公司的QNX實時操作系統(tǒng) 就采用這一方案。
以上三種方法實現(xiàn)多線程調度修改原操作系統(tǒng)代碼龐大,線程調度效率以及實時性不高,不太適用于硬實時系統(tǒng)。
發(fā)明內容
本發(fā)明的目的在于提出一種基于片上多處理器的線程調度實現(xiàn)方法。 本發(fā)明提出的基于片上多處理器的線程調度實現(xiàn)方法,包括基于三維位圖的多線程就 緒隊列、實時內核控制、線程分配,具體步驟如下
(1) 基于三維位圖的多線程就緒隊列
假設單芯片上有N個處理器核,把線程按M個優(yōu)先級標記,在同一個優(yōu)先級下可以有
N個相同優(yōu)先級的線程,每個相同優(yōu)先級的線程按創(chuàng)建進入就緒態(tài)的先后標記,這樣可以 同時創(chuàng)建M傘N個線程,讓這樣一個線程隊列就緒時注冊在一張三維的就緒位圖中,位圖中
的每一位代表一個線程的狀態(tài),為l時表示就緒態(tài),0表示非就緒態(tài);
(2) 實時內核控制
通過設置注冊表參數實時記錄當前已注冊的進程,同時為每個線程分配各自的線程棧 記錄線程的context (上下文),設置優(yōu)先級位便于線程恢復就緒態(tài),在采用優(yōu)先級判決表 中找出最高優(yōu)先級的同時,利用注冊表控制査找當前需要調度運行N個線程的循環(huán)次數; (3)線程分配
在片上多處理器的一個處理器核上運行操作系統(tǒng),用于管理線程的狀態(tài)和分配工作。 在線程控制塊結構體中設置成員變量標記該線程是否被調度和被調度的CPU號,采用位圖 副本便于修改記錄線程的調度情況。用線程控制塊指針唯一標識各個線程,在找出最高優(yōu) 先級的N個要調度的線程后,判斷各個CPU正在運行的線程,相同的繼續(xù)運行,不同的線 程分配在剩余的CPU上運行,避免線程的多余切換,各個CPU主動調用切換函數完成此工 作。
本發(fā)明具有的有益效果是:本發(fā)明是一種基于片上多處理器的線程調度實現(xiàn)方法,合 理有效的實現(xiàn)多處理器上的線程調度,同時具有很好的實時性能。
圖1是8個處理器核64個優(yōu)先級的線程就緒位圖示意圖。 圖2是本發(fā)明的實施過程示意圖。 圖3是操作系統(tǒng)啟動完畢后的數據結構示意圖。
具體實施例方式
以下結合
本發(fā)明的方法。
實施例1:
4基于片上多處理器的線程調度實現(xiàn)方法,包括以下過程
1) 線程控制塊的定義。
線程控制塊(Thread Control Block, TCB)是包含線程相關信息的數據結構,包含了線 程執(zhí)行過程中所需的所有信息。其成員變量包括指向線程棧的指針(TCBstkptr)、線程 的優(yōu)先級(TCBprio)、線程的優(yōu)先級位,記錄同一優(yōu)先級線程在位圖中的位置 (TCBprioBit)、記錄線程是否被調度和被調度的CPU號,未調度為-l (CPUID)、雙向鏈表 中指向該線程的前后線程控制塊(TCBnext、 TCBprev)、線程控制塊的位置(TCBX、 TCBY、 TCBBitX、 TCBBitY)(這四項用于加速線程進入就緒態(tài),在線程創(chuàng)建初始化時賦值)等一 些其他變量。
2) 基于三維位圖的多線程就緒隊列。
線程就緒位圖用于管理就緒線程,這里以8個處理器核64個優(yōu)先級為例說明就緒位 圖。創(chuàng)建好的就緒位圖如圖l所示,此時在一個優(yōu)先級下可以有8個相同優(yōu)先級的線程, 同時可以創(chuàng)建管理512個不同的線程。
定義四個變量- char ReadyGro叩;char ReadyLayer[8]'■ char ReadyTable[8] [8]; char RegisterTable[64]; 8位變量ReadyGroup的每一位代表一組線程,8個優(yōu)先級的64 個線程。變量ReadyLayer[8]的每一項元素的每一位表示該組中各優(yōu)先級下有無線程。變 量ReadyTable[8] [8]—共有8*8=64個元素,每一個元素是一個8位的二進制數表示一個 優(yōu)先級,每一位代表該優(yōu)先級下可以創(chuàng)建的8個線程。變量RegisterTable[64]是一張注 冊表,用于記錄64個優(yōu)先級的線程在該優(yōu)先級下注冊登記的位置,該位置由創(chuàng)建注冊先 后決定。
3) 實時內核控制。
通過線程就緒位圖的設置,協(xié)同以下算法提高操作系統(tǒng)的實時性。 定義五個變量TCB*TCBPrioTable[64] [8]; TCB *TCBHighReady [8]; TCB *TCBcur [8]; char MapTable[8]; char DecisionTable[256];變量TCBPrioTable[64] [8]用于保存每個 線程的線程控制塊指針,此變量在各線程創(chuàng)建初始化時賦值。變量TCBHighReady[8]保存 當前要被調度的8個最高優(yōu)先級線程的線程控制塊指針。而變量TCBcur[8]保存當前正在 運行的8個線程的線程控制塊指針。變量MapTable[8]H00000001, 00000010, 00000100, 00001000, 00010000, 00100000, 01000000, 10000000};變量DecisionTable[256]是一 張
優(yōu)先級判決表,其值可以這樣得到,例如44=00101100, 二進制數00101100從右往左數第一個1在第三個位置,既得DecisionTable[44]二3。 優(yōu)先級為prio的線程進入就緒態(tài)時的偽代碼如下 ReadyGroup |= MapTable[prio》3];〃登記該線程所在組 ReadyLayer[prio>>3] |= MapTable[prio&0x07];〃登記該線程所在層 TCBprioBit= !fepTable[RegisterTable[prio]++];〃確定該線程優(yōu)先級位 ReadyTable[prio》3] [ prio&0x07]|= TCBprioBit;〃在位圖中登記 優(yōu)先級位prio、優(yōu)先級位為TCBprioBit的線程退出就緒態(tài)的偽代碼如下 if(ReadyTable[prio〉〉3][ prio&0x07]&=~ TCBprioBit==0) if (ReadyLayer [prio》3]&= MapTable [prio&0x07] ==0) ReadyGroup &= ~ MapTable [prio》3];
當ReadyTable[prio》3] [ prio&0x07]所有位為0時,ReadyLayer [prio》3]的相應 位才清0,當ReadyLayer |^]^0〉〉3]所有位為0時,ReadyGroup的相應位才清0。
由于有8個處理器核,要求找出8個最高優(yōu)先級線程完成調度,下一過程中說明這部 分類容,這里先說明采用判決表找出進入就緒態(tài)的最高優(yōu)先級線程的優(yōu)先級prio的偽代 碼
High3Bit= DecisionTable[ReadyGroup]; Lo沐3Bit二 DecisionTable[ReadyLayer[High3Bit]]; prio二 (High3Bit《3) + Low3Bit; 4) 線程分配。
線程分配是把當前就緒進程中優(yōu)先級最高的8個線程找出,然后和當前正在運行的8 個線程比較,將不同的線程做切換,詳細過程如圖2所示。首先要復制位圖副本,包括變 量ReadyGroup、 ReadyLayer [8] 、 ReadyTable[8] [8],利用位圖副本找出當前最高優(yōu)先級 的線程的prio,接著記錄該優(yōu)先級下最先就緒線程的TCB的指針于TC13HighReady[8],刪 除位圖副本中該線程(算法同線程退出就緒態(tài)),然后判斷是否査找最高優(yōu)先級的8個線 程完畢,沒有完畢接著判斷當前優(yōu)先級prio下的所有就緒進程是否記錄完畢,如果完畢 回到利用位圖副本找出當前最高優(yōu)先級的線程的prio,為完畢則跳到記錄該優(yōu)先級下最先 就緒線程的TCB的指針于TC朋ighReady[8],直到查找最高優(yōu)先級的8個線程完畢。這部 分算法可由一下偽代碼實現(xiàn)
復制位圖副本;
int ChooseN=0;
6while(l)
{找出當前最高優(yōu)先級的線程的prio;〃算法在過程3)中已描述 for(int j=0;j〈 RegisterTable[prio];」++)〃避免全局遍歷提高實時性 { TCBHighReady[ChooseN]= TCBPrioTable[prio][ MapTable[j]]; 刪除位圖副本中該線程; 〃同過程3)中線程退出就緒態(tài) If (++ChooseN〉=8) 〃這里已8個處理器核為例 跳出while循環(huán)結束;}} 上述TCBHighReady [8]査找完畢,接著依次判斷個CPU上運行的線程是否包含于 TCBHighReady[8],標記相同的線程為已調度,該CPU為已調度,然后為未調度的CPU分 配為調度的線程。具體流程如圖2。
當線程分配完畢后,各CPU主動調用線程切換函數完成保護現(xiàn)場及線程切換工作。 5) 操作系統(tǒng)啟動后的數據結構。
操作系統(tǒng)初始化時建立一個由M*N個線程控制塊TCB構成的單向空線程鏈表,當線程 被建立時,鏈表的第一個TCB就賦給該線程,線程被刪除時歸還空線程鏈表。建立好的線 程TCB構成一個雙向鏈表,其地址由指針數組TCBPrioTable[64] [8]保存。這里假設操作 系統(tǒng)初始化時創(chuàng)建了 1個優(yōu)先級位0的線程,3個優(yōu)先級位1的線程,3個優(yōu)先級為2的 線程,2個優(yōu)先級為3的線程,系統(tǒng)自動創(chuàng)建8個優(yōu)先級為63的IDLE線程。則操作系統(tǒng) 啟動后的數據結構如圖3所示。此時TCBHighReady[8]、 TCBcur[8]指向相同的8個線程。
權利要求
1、一種基于片上多處理器的線程調度實現(xiàn)方法,其特征在于包括基于三維位圖的多線程就緒隊列、實時內核控制、線程分配,具體步驟如下(1)基于三維位圖的多線程就緒隊列設單芯片上有N個處理器核,把線程按M個優(yōu)先級標記,在同一個優(yōu)先級下有N個相同優(yōu)先級的線程,每個相同優(yōu)先級的線程按創(chuàng)建進入就緒態(tài)的先后標記,即可同時創(chuàng)建M*N個線程,該線程隊列就緒時注冊在一張三維的就緒位圖中;位圖中的每一位代表一個線程的狀態(tài),為1時表示就緒態(tài),0表示非就緒態(tài);(2)實時內核控制通過設置注冊表參數實時記錄當前已注冊的進程,同時為每個線程分配各自的線程棧記錄線程的上下文,設置優(yōu)先級位便于線程恢復就緒態(tài);在采用優(yōu)先級判決表快速找出最高優(yōu)先級的同時,利用注冊表控制查找當前需要調度運行N個線程的循環(huán)次數;(3)線程分配在片上多處理器的一個處理器核上運行操作系統(tǒng),用于管理線程的狀態(tài)和分配工作;在線程控制塊結構體中設置成員變量標記該線程是否被調度和被調度的CPU號,采用位圖副本便于修改記錄線程的調度情況;用線程控制塊指針唯一標識各個線程,在找出最高優(yōu)先級的N個要調度的線程后,判斷各個CPU正在運行的線程,相同的線程繼續(xù)運行,不同的線程分配在剩余的CPU上運行,避免線程的多余切換,各個CPU主動調用切換函數完成此工作。
全文摘要
本發(fā)明屬于嵌入式操作系統(tǒng)技術領域,具體涉及一種基于片上多處理器的線程調度實現(xiàn)方法。本發(fā)明以三維就緒位圖為基礎,所有處理器共用此就緒位圖,每一個就緒線程在此位圖上標記,提出操作系統(tǒng)的基于此位圖的線程分配算法,操作系統(tǒng)運行在一個處理器核上。本發(fā)明通過三維位圖、注冊表、判決表等的使用大大提高系統(tǒng)的實時性能,同時分配多線程于多個處理器核上并行處理,提高了整體執(zhí)行速度。
文檔編號G06F9/46GK101673223SQ200910197530
公開日2010年3月17日 申請日期2009年10月22日 優(yōu)先權日2009年10月22日
發(fā)明者毅 凌, 蕓 陳 申請人:同濟大學