專利名稱:一種多隊列的高速存儲設(shè)備驅(qū)動程序設(shè)計方法
技術(shù)領(lǐng)域:
本發(fā)明涉及高速存儲設(shè)備在操作系統(tǒng)中的驅(qū)動程序設(shè)計和實現(xiàn)技術(shù),特別涉及 Linux內(nèi)核塊設(shè)備驅(qū)動程序設(shè)計方法。
背景技術(shù):
存儲設(shè)備是最重要的計算機外圍設(shè)備之一,常見的包括軟盤、磁盤、⑶-ROM和閃存 等。一般地,這些存儲設(shè)備主要由存儲介質(zhì)、設(shè)備控制器和設(shè)備接口組成,它們通過設(shè)備接 口與計算機總線相連,而操作系統(tǒng)中則需要有合適的驅(qū)動程序來對設(shè)備進(jìn)行存取。存儲設(shè)備的驅(qū)動程序位于操作系統(tǒng)中文件系統(tǒng)之下,與設(shè)備直接打交道。典型的 存儲設(shè)備驅(qū)動程序通過如下步驟來完成對設(shè)備的存取1.從文件系統(tǒng)獲取對該設(shè)備的I/O請求。這種請求的格式是設(shè)備無關(guān)的,也就是 說它決定于操作系統(tǒng)數(shù)據(jù)結(jié)構(gòu)的定義,而非決定于設(shè)備的約定。這里所述“獲取”并不一定 是設(shè)備驅(qū)動程序主動去獲得文件系統(tǒng)所產(chǎn)生的I/O請求,更多的情形是設(shè)備驅(qū)動程序提供 一個接口,當(dāng)文件系統(tǒng)產(chǎn)生請求時,將請求作為參數(shù)來調(diào)用這個接口,從而使操作系統(tǒng)代碼 的執(zhí)行路徑離開文件系統(tǒng)層、進(jìn)入到設(shè)備驅(qū)動程序。2.將獲得的I/O請求轉(zhuǎn)化為設(shè)備可識別的請求。設(shè)備驅(qū)動程序解析文件系統(tǒng)遞交 的I/O請求,獲得至少包括設(shè)備地址、主機內(nèi)存地址、操作類型(讀還是寫)、數(shù)據(jù)長度這些 信息。然后按照設(shè)備的約定,將這些信息組裝成設(shè)備可識別的請求格式。3.將轉(zhuǎn)化后的請求發(fā)送給設(shè)備。設(shè)備驅(qū)動程序通過設(shè)備控制寄存器告知設(shè)備有新 的請求。可以將整個請求寫入控制寄存器,也可以將請求置于主機內(nèi)存某個位置,然后將這 個地址通過控制寄存器告知設(shè)備,由設(shè)備來獲取請求。4.等待設(shè)備完成數(shù)據(jù)傳輸。目前的存儲設(shè)備都是以中斷方式來反饋I/O操作結(jié) 果,驅(qū)動程序則通常會在某個條件上等待,而這個條件將由中斷處理程序來使其滿足。等待 的方式不限,如輪詢、睡眠。設(shè)備以DMA (Direct Memory Access)的方式在存儲介質(zhì)和主機 內(nèi)存之間傳輸數(shù)據(jù),這個過程與CPU的指令執(zhí)行是并行進(jìn)行的。傳輸完成之后,設(shè)備將產(chǎn)生 中斷,告知操作系統(tǒng)。5.接收中斷,激活等待條件。中斷處理程序是驅(qū)動程序的一部分,當(dāng)設(shè)備產(chǎn)生中斷 時被調(diào)用。中斷處理程序獲取I/O操作的完成狀態(tài),對相應(yīng)請求的等待條件實施改變,使得 等待中的進(jìn)程可以繼續(xù)執(zhí)行。上述步驟是某一次I/O操作所經(jīng)歷的過程,包括了操作系統(tǒng)和設(shè)備各自的行為以 及二者之間的交互。實際情況中,多個I/O操作通常是并發(fā)的,即在同一個時間片段內(nèi),多 個進(jìn)程或者線程可能一起發(fā)出大量I/O請求,操作系統(tǒng)和驅(qū)動程序處理這些請求的大部分 過程是并行進(jìn)行的,如錯誤!未找到引用源。所示。并發(fā)意味著競爭,對一些關(guān)鍵數(shù)據(jù)結(jié)構(gòu)的訪問需要保證互斥;特別地,在向設(shè)備發(fā) 送請求時,必須保證發(fā)送過程處于臨界區(qū)內(nèi),即當(dāng)某一個進(jìn)程開始操作設(shè)備時,其它進(jìn)程必 須等待此進(jìn)程完成操作,錯誤!未找到引用源。展示了這種情形。實現(xiàn)互斥功能的常見方法有原子操作、自旋鎖、信號量、等待隊列等。SMP (Symmetric Multi-Processing)和多核技 術(shù)的快速發(fā)展使得單一操作系統(tǒng)映像運行于十幾個甚至幾十個核上的情形越來越普遍,上 述各種互斥手段都存在一些弊端·自旋鎖效率高、延遲小,但是只適用于臨界區(qū)較小的情形,否則容易導(dǎo)致CPU資 源嚴(yán)重浪費·原子操作效率高,但只適用于對單條指令保證其原子性,不適用于復(fù)雜的操作·等待隊列通常會使暫不能進(jìn)入臨界區(qū)的里程睡眠,不適用于對性能或?qū)崟r性要 求高的情形·信號量通常由自旋鎖或者等待隊列實現(xiàn),因此也存在這兩種機制所存在的弊端本文中,高速存儲設(shè)備是指當(dāng)前能獲得較高性能的主流存儲設(shè)備,或者新興的性 能更好的存儲設(shè)備。對性能的衡量沒有明確的量化指標(biāo),I/O帶寬等于或大于主流存儲設(shè) 備帶寬的設(shè)備都屬于高速存儲設(shè)備。當(dāng)存儲設(shè)備本身能提供比較高的讀寫帶寬時,設(shè)備的用戶都期望操作系統(tǒng)可以將 該設(shè)備的I/O能力充分利用起來,這就要求設(shè)備驅(qū)動程序必須寫得足夠好。盡管各種存儲 設(shè)備所提供給計算機的軟/硬件接口并不一樣,但是我們依然可以從上述設(shè)備驅(qū)動程序的 通用處理流程中找到關(guān)鍵路徑。一般地,從文件系統(tǒng)獲得請求、分析并轉(zhuǎn)換請求格式都是可 以完全并行化的,即各個進(jìn)程可以互不干涉地執(zhí)行;而在將請求發(fā)送給設(shè)備的時候,需要互 斥地對設(shè)備進(jìn)行訪問。這里的互斥訪問如果效率低了(如采用等待隊列、信號量),則發(fā)送 的請求并不能使設(shè)備的I/O能力達(dá)到飽和,若為了效率而采用比較激進(jìn)的互斥手段如自旋 鎖,則CPU資源的浪費將十分可觀。現(xiàn)有的存儲設(shè)備驅(qū)動程序多采用等待隊列方式,對于高 速存儲設(shè)備而言,無法充分發(fā)揮其性能。
發(fā)明內(nèi)容
為克服高速存儲設(shè)備中效率和資源消耗之間的矛盾,本發(fā)明給出一種既可以保證 I/O高效及時、又不會過多消耗CPU資源的設(shè)備驅(qū)動程序設(shè)計方法。一種多隊列的高速存儲設(shè)備驅(qū)動程序設(shè)計方法,步驟如下A、從文件系統(tǒng)獲得IO請求;B、在持有ready lock的情況下將請求入隊;C、在持有隊列切換自旋鎖的情況下檢查活動隊列,若為空則將預(yù)備隊列和活動隊 列互換,若非空則不進(jìn)行操作;D、對請求發(fā)送標(biāo)志進(jìn)行原子的test and set操作;Ε、處理請求的進(jìn)程向設(shè)備循環(huán)發(fā)送活動隊列上的請求,已發(fā)送的則從活動隊列中 移除;若隊列為空或隊列已滿,則中止這一輪發(fā)送;F、清空發(fā)送標(biāo)志;G、檢查活動隊列,若為空則將預(yù)備隊列和活動隊列互換;H、檢查活動隊列,若非空,則啟動一個定時器,在短時間內(nèi)再次從步驟D開始執(zhí) 行。本發(fā)明一種優(yōu)選技術(shù)方案在于所述步驟D test and set操作過程為測試若為 0則置1,否則不對其進(jìn)行修改;若置位成功,則當(dāng)前進(jìn)程進(jìn)入發(fā)送請求臨界區(qū),將其發(fā)送至設(shè)備;若置位不成功,則表明已有一個進(jìn)程正在活動隊列上處理請求,跳轉(zhuǎn)至步驟H。本發(fā)明的有益效果在于請求格式轉(zhuǎn)換之后不直接發(fā)送到設(shè)備,而是將其緩沖在預(yù) 備隊列中,而且對該請求的發(fā)送操作并不一定由當(dāng)前進(jìn)程來執(zhí)行;只有當(dāng)預(yù)備隊列變成活 動隊列之后,其中的請求才可以被發(fā)送到設(shè)備,此發(fā)送過程是由某一個進(jìn)程代表活動隊列 上請求的所有者來集中完成的,所以高效且資源消耗少。
圖1是一般情況下操作系統(tǒng)和驅(qū)動處理請求的過程圖2是本發(fā)明I/O請求從文件系統(tǒng)到設(shè)備的處理過程
具體實施例方式本發(fā)明提出的一種基于多隊列的存儲設(shè)備驅(qū)動程序設(shè)計方法。它包括如下數(shù)據(jù)結(jié) 構(gòu)· 一個活動隊列(active queue)存放即將發(fā)送至設(shè)備的I/O請求· 一個預(yù)備隊列(ready queue)存放暫不能發(fā)送至設(shè)備的I/O請求· 一個請求發(fā)送標(biāo)志(request flag)若置為1則表示當(dāng)前已經(jīng)有一個進(jìn)程正在 將活動隊列上的請求發(fā)送至設(shè)備,若置為0則表示 一個保護(hù)隊列切換操作的自旋鎖(switch lock)保證對活動隊列和預(yù)備隊列的 切換過程處于一個臨界區(qū)· 一個用于互斥訪問預(yù)備隊列的自旋鎖(ready lock)保證對預(yù)備隊列的入隊 (euqueue)操作是互斥的· 一個定時器(timer)用于激活對潛在的最后一批I/O請求的處理設(shè)備驅(qū)動程序獲得文件系統(tǒng)的請求并最終向設(shè)備發(fā)送I/O請求的過程遵循如下 步驟1.從文件系統(tǒng)獲得I/O請求。這通常的實現(xiàn)方法是設(shè)備驅(qū)動程序?qū)崿F(xiàn)了一個操作 系統(tǒng)規(guī)定的處理I/O請求的接口,當(dāng)文件系統(tǒng)層產(chǎn)生新的I/O請求時,將調(diào)用這一接口,從 而進(jìn)入到設(shè)備驅(qū)動程序代碼段。2.將請求入隊(enqueue)到預(yù)備隊列。這一步要在持有ready lock的前提下執(zhí) 行,保證各個并發(fā)的入隊操作都是完整進(jìn)行的,從而不會破壞預(yù)備隊列的完整性。3.檢查活動隊列,若為空則將預(yù)備隊列和活動隊列互換;若非空則不做任何操 作。這一步要在持有隊列切換自旋鎖的前提下執(zhí)行,保證活動隊列或者預(yù)備隊列指針始終 指向正確的目標(biāo)隊列。4.對請求發(fā)送標(biāo)志(request flag)進(jìn)行原子的test and set操作測試若為0 則置為1,否則不對其進(jìn)行修改。若置位成功,則當(dāng)前進(jìn)程進(jìn)入發(fā)送請求的臨界區(qū),它代表活 動隊列上的所有請求的擁有者來處理這些請求(本文稱之為代表進(jìn)程),將其發(fā)送至設(shè)備。 若置位不成功,表明已經(jīng)有一個進(jìn)程正在活動隊列上處理請求,則跳至85.處理請求的進(jìn)程向設(shè)備循環(huán)發(fā)送活動隊列上的請求,已發(fā)送的則從活動隊列中 移除。若隊列變?yōu)榭?,或者設(shè)備不能再接受更多的請求,則這一輪發(fā)送終止。6.清空發(fā)送標(biāo)志(request flag)。
7.檢查活動隊列,若為空則將預(yù)備隊列和活動隊列互換。8.檢查活動隊列,若非空,則啟動一個定時器,在很短的時間(如1毫秒)之后再 次從步驟4開始執(zhí)行。這一步可以結(jié)合內(nèi)核定時器及內(nèi)核線程來完成,在Linux內(nèi)核2. 6 以上的版本中,已提供了相應(yīng)的實現(xiàn)。
權(quán)利要求
1.一種多隊列的高速存儲設(shè)備驅(qū)動程序設(shè)計方法,其特征在于步驟如下A、從文件系統(tǒng)獲得IO請求;B、在持有readylock的情況下將請求入隊;C、在持有隊列切換自旋鎖的情況下檢查活動隊列,若為空則將預(yù)備隊列和活動隊列互 換,若非空則不進(jìn)行操作;D、對請求發(fā)送標(biāo)志進(jìn)行原子的testand set操作;Ε、處理請求的進(jìn)程向設(shè)備循環(huán)發(fā)送活動隊列上的請求,已發(fā)送的則從活動隊列中移 除;若隊列為空或隊列已滿,則中止這一輪發(fā)送;F、清空發(fā)送標(biāo)志;G、檢查活動隊列,若為空則將預(yù)備隊列和活動隊列互換;H、檢查活動隊列,若非空,則啟動一個定時器,在短時間內(nèi)再次從步驟D開始執(zhí)行。
2.如權(quán)利要求1所述一種多隊列的高速存儲設(shè)備驅(qū)動程序設(shè)計方法,其特征在于所 述步驟D test and set操作過程為測試若為0則置1,否則不對其進(jìn)行修改;若置位成功, 則當(dāng)前進(jìn)程進(jìn)入發(fā)送請求臨界區(qū),將其發(fā)送至設(shè)備;若置位不成功,則表明已有一個進(jìn)程正 在活動隊列上處理請求,跳轉(zhuǎn)至步驟H。
全文摘要
本發(fā)明提供了一種多隊列的高速存儲設(shè)備驅(qū)動程序設(shè)計方法,請求格式轉(zhuǎn)換之后不直接發(fā)送到設(shè)備,而是將其緩沖在預(yù)備隊列中,而且對該請求的發(fā)送操作并不一定由當(dāng)前進(jìn)程來執(zhí)行;只有當(dāng)預(yù)備隊列變成活動隊列之后,其中的請求才可以被發(fā)送到設(shè)備,此發(fā)送過程是由某一個進(jìn)程代表活動隊列上請求的所有者來集中完成的,所以高效且資源消耗少。
文檔編號G06F9/44GK102073493SQ20101059855
公開日2011年5月25日 申請日期2010年12月17日 優(yōu)先權(quán)日2010年12月17日
發(fā)明者李麟, 袁清波, 許建衛(wèi), 賀志強 申請人:天津曙光計算機產(chǎn)業(yè)有限公司