壓縮方法及相關裝置與流程
2024-02-18 21:48:15 2

本發明涉及計算機技術領域,特別是涉及壓縮技術。
背景技術:
在數據洪水爆發的今天,面對數據的急劇膨脹,存儲設備(例如磁碟陣列)需要進行數據壓縮來有效實現數據容量縮減:假設存儲空間是1TB,但用戶需要存儲的數據是1.3TB。則存儲設備可對上述1.3TB的原始數據進行壓縮,將壓縮結果(數據)存儲,這樣可以節約存儲空間,並且這種壓縮對用戶而言是透明的;在需要讀取數據時,則需要先對壓縮數據進行解壓縮。
然而在實際應用過程中,發明人發現:解壓縮後得到的數據有可能和原始數據不一致,對外表現為數據損壞,這進一步可能引起上層應用異常,如導致虛擬機、資料庫等應用宕機。
技術實現要素:
本發明的目的在於提供壓縮方法及相關裝置,以解決上述問題。
為實現上述目的,本發明提供了如下方案:
一方面,本申請的實施例提供一種壓縮方法,該壓縮方法由存儲設備中的控制器中的處理器或硬體加速卡,與其他部件交互完成。該壓縮方法包括:獲取原始數據;對原始數據進行壓縮,得到壓縮結果;對壓縮結果進行解壓縮,得到解壓縮結果;校驗解壓縮結果與原始數據是否一致;若一致,輸出壓縮結果;若不一致,輸出原始數據。相較於現有技術,本發明提供的方案,在壓縮原始數據之後、存儲之前,會對壓縮結果進行解壓縮,得到解壓縮結果,並校驗解壓縮結果與原始數據是否一致。若一致,輸出壓縮結果,也即對壓縮結果進行存儲。若不一致,說明解壓縮後得到的數據和原始數據不一致,則拋棄壓縮結果,輸出原始數據,對原始數據進行存儲。這樣可避免解壓縮後得到的數據有可能和原始數據不一致的現象的出現。
在一個可能的設計中,在對原始數據進行壓縮之前或在校驗解壓縮結果與原始數據是否一致之前,還可先計算原始數據的校驗數據。此外,在校驗解壓縮結果與原始數據是否一致之前,還可先計算解壓縮數據的校驗數據。而校驗所述解壓縮結果與所述原始數據是否一致的步驟,可具體細化為:比較原始數據的檢驗數據與解壓縮結果的校驗數據是否一致。若一致,輸出壓縮結果;若不一致,輸出原始數據。從而可以更好得避免解壓縮後得到的數據和原始數據不一致的問題。
在一個可能的設計中,上述原始數據的校驗數據可包括原始數據的校驗碼(例如CRC碼)和原始數據的長度的至少一種。而解壓縮結果的校驗數據可包括:解壓縮結果的校驗碼(例如CRC校驗碼)和解壓縮結果的長度的至少一種。為便於區分,可將原始數據的校驗碼稱為第一校驗碼,將原始數據的長度稱為第一長度,將解壓縮結果的校驗碼稱為第二校驗碼,將解壓縮結果的長度稱為第二長度。若原始數據的校驗數據包括第一校驗碼和第一長度,則解壓縮結果的校驗數據相應的包括第二校驗碼和第二長度;若原始數據的校驗數據僅包括第一校驗碼,則解壓縮結果的校驗數據相應的僅包括第二校驗碼;而若原始數據的校驗數據僅包括第一長度,則解壓縮結果的校驗數據相應的僅包括第二長度。在本發明其他實施例中,也可用哈希算法分別得到原始數據和解壓縮結果的哈希值,將二者的哈希值作為校驗碼。本實施例提供了校驗數據的具體內容,從而可以更好得避免解壓縮後得到的數據和原始數據不一致的問題。
在一個可能的設計中,也可直接對解壓縮結果和原始數據進行逐個字節對比,這種方式相對比較簡單。
再一方面,本發明實施例提供了一種存儲設備,該存儲設備具有實現上述方法實際中存儲設備行為的功能。所述功能可以通過硬體實現,也可以通過硬體執行相應的軟體實現。
又一方面,本發明實施例提供了一種計算機存儲介質,用於儲存為上述存儲設備所用的計算機軟體指令,其包含用於執行上述方面所設計的程序。
相較於現有技術,本發明提供的方案,在壓縮原始數據之後、存儲之前,會對壓縮結果進行解壓縮,得到解壓縮結果,並校驗解壓縮結果與原始數據是否一致。若一致,輸出壓縮結果,也即對壓縮結果進行存儲。若不一致,說明解壓縮後得到的數據和原始數據不一致,則拋棄壓縮結果,輸出原始數據,對原始數據進行存儲。這樣可避免解壓縮後得到的數據有可能和原始數據不一致的現象的出現。
附圖說明
為了更清楚地說明本發明實施例或現有技術中的技術方案,下面將對實施例中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發明的一些實施例,對於本領域普通技術人員來講,在不付出創造性勞動性的前提下,還可以根據這些附圖獲得其他的附圖。
圖1為本發明實施例提供的應用場景示意圖;
圖2a和圖2b為本發明實施例提供的控制器的示例性結構圖;
圖3a、圖4為本發明實施例提供的壓縮方法示例性流程圖;
圖3b為現有的壓縮方法的示例性結構圖;
圖5為本發明實施例提供的壓縮裝置(特別是硬體加速卡)的結構示例圖;
圖6為本發明實施例提供的硬體加速卡內部的數據流向示意圖。
具體實施方式
本發明實施例提供了壓縮方法及相關裝置(壓縮裝置、存儲設備/系統、硬體加速數據卡)。
上述存儲設備/系統具體可為磁碟陣列等。
圖1描繪了本發明實施例提供的存儲設備/系統的組成圖,包括至少一個控制器101和硬碟框102。
控制器101可以是一種計算設備,如伺服器、臺式計算機等等。在控制器101上安裝有作業系統以及其他應用程式。控制器101可以接收來自應用主機的輸入輸出(I/O)請求,存儲I/O請求中攜帶的數據,並將數據寫入硬碟框102中。硬碟框102則可包括一個或多個硬碟。
在一個應用場景下,控制器101可以通過SAN網絡與應用主機(圖中未示出)連接。
硬碟框102則可包括一個或多個硬碟。例如,可安裝20個硬碟。
圖2a是上述控制器101的一種結構示例圖,如圖2a所示,控制器101可包括通過總線相連的處理器201、存儲器202、通信接口203(可進一步包括前端接口卡和後端接口卡),以及輸入設備204和輸出設備205。
其中,前端接口卡可用於和應用主機通信,控制器101的處理器201可以通過前端接口卡接收應用主機的各種操作指令。
控制器101的處理器201可能是一個中央處理器CPU,或者是特定集成電路ASIC(Application Specific Integrated Circuit),或者是被配置成實施本發明實施例的一個或多個集成電路。在本發明實施例中,處理器201可以用於接收來自應用主機的寫數據請求或者讀數據請求、處理所述寫數據請求或者讀數據請求,以及將所述寫數據請求或者讀數據請求發送給cache等其他操作。
存儲器202可用於存儲數據。更具體的,存儲器202可包含內存、緩存(例如圖2b中的cache 206)。內存可能包含高速RAM存儲器,也可能還包括非易失性存儲器(non-volatile memory),例如至少一個磁碟存儲器。可以理解的是,內存可以為隨機存儲器(Random-Access Memory,RAM)、磁碟、硬碟、光碟、固態硬碟(Solid State Disk,SSD)或者非易失性存儲器等各種可以存儲程序代碼的非短暫性的(non-transitory)機器可讀介質。需要說明的是,在實施例中內存也可集成緩存功能。
後端接口卡,可用於和硬碟框102中的硬碟通信,控制器101的處理器201可以通過後端接口卡將數據發送給硬碟框102中的硬碟存儲。
需要說明的是,若硬碟框102和控制器101共同安裝在一個框內,內部就集成了後端接口卡。
而若硬碟框102和控制器101獨立安裝在不同的框中,則後端接口卡可不與其他部件集成在一起。
上述壓縮裝置可以軟體或硬體的形式應用於上述存儲設備/系統中。
在一個示例中,當壓縮裝置以軟體形式應用於存儲設備/系統中,可由存儲器202保存有執行本發明技術方案的程序,當然,存儲器202還可以保存有作業系統和其他應用程式。處理器201可通過執行上述程序來執行本發明提供的壓縮方法。
在另一個示例中,請參見圖2b,壓縮裝置可以以硬體加速卡207的形式應用於上述存儲設備/系統中。更具體的,硬體加速卡207可安裝在控制器101(控制框)的插槽上。
當然,硬體加速卡207中也有緩存。
在使用時,控制器101的處理器201可將來自應用主機的原始數據存入cache206,cache206可決定何時將原始數據提供給硬體加速卡207,由硬體加速卡207執行本發明提供的壓縮方法。
下面將基於上面所述的本發明涉及的共性方面,對本發明實施例如何存儲管理進行進一步詳細說明。
圖3a示出了本發明實施例提供的壓縮方法的一種示例性流程,用以解決避免解壓縮後得到的數據有可能和原始數據不一致的問題。
圖3a所示的方法應用在圖1所示的應用場景中,由圖2a所示的控制器101的處理器201與其他部件交互實現,或者,由圖2b所示的控制器101的硬體加速卡207與其他部件交互實現。
該流程包括:
300部分:獲取原始數據。
在一個示例中,在由控制器101的處理器201執行壓縮方法的場景下,可由控制器101的處理器201執行300部分。具體的,可由控制器101的處理器201通過前端接口卡接收應用主機發送的原始數據,將其存入cache 206。當需要進行壓縮處理時,處理器201再讀取出cache 206中的原始數據。
在另一個示例中,在由硬體加速卡207執行壓縮方法的場景下,在處理器201將來自應用主機的原始數據存入cache 206後,cache 206將原始數據提供給硬體加速卡207。
更具體的,cache 206是以內存頁為單位,將原始數據提供給硬體加速卡。每一頁內存頁存儲容量為4kB(Byte)。
也即,無論某種場景下,原始數據均可先存入cache 206(內存)中。
需要說明的是,在有大量的原始數據需要存儲時,可進行分批處理,每次獲取原始數據的一部分。
301部分:對原始數據進行壓縮,得到壓縮結果。
可採用不同的壓縮方式進行壓縮,例如,Huffman編碼。
在一個示例中,在由控制器101的處理器201執行壓縮方法的場景下,可由控制器101的處理器201執行301部分。
在另一個示例中,在由硬體加速卡207執行壓縮方法的場景下,可由硬體加速卡207執行301部分。硬體加速卡207中可包含多個壓縮引擎,例如10個壓縮引擎,從而可以同時並行進行壓縮處理。
實際上,在硬體加速卡207內部,其處理的是內存頁上的數據。前述提及,一頁內存頁的存儲量是4KB,假定硬體加速卡一次最大能處理64KB大小的數據,則可一次處理16頁內存頁。
當然,這16頁內存頁上的數據可由多個壓縮引擎並行進行壓縮處理。
302部分:對壓縮結果進行解壓縮,得到解壓縮結果。
可採用與壓縮算法相對的解壓縮算法,對壓縮結果進行解壓縮。
在一個示例中,在由控制器101的處理器201執行壓縮方法的場景下,可由控制器101的處理器201執行302部分。
在另一個示例中,在由硬體加速卡207執行壓縮方法的場景下,可由硬體加速卡207執行302部分。硬體加速卡207中可包含多個解壓縮引擎,例如3個解壓縮引擎,從而可以同時並行進行解壓縮處理。
303部分:校驗解壓縮結果與原始數據是否一致,若一致,進入304部分,否則,進入305部分。
校驗方式有多種,在一個示例中,可直接對解壓縮結果和原始數據進行逐個字節對比,若存在不一致,則判定二者不一致,否則判定二者一致。
在另一個示例中,可採用CRC(Cyclic Redundancy Check,循環冗餘校驗)校驗或哈希校驗等。本文後續將進行具體介紹。
在一個示例中,在由控制器101的處理器201執行壓縮方法的場景下,可由控制器101的處理器201執行303部分。
在另一個示例中,在由硬體加速卡207執行壓縮方法的場景下,可由硬體加速卡207執行303部分。
304部分:輸出壓縮結果。
若校驗結果一致,說明上述壓縮結果解壓縮後,與原始數據是一致的。不會出現解壓縮後得到的數據和原始數據不一致的情況,所以輸出壓縮結果。
305部分:輸出原始數據。
若不一致,說明解壓縮後得到的數據和原始數據不一致,則拋棄壓縮結果,輸出原始數據。
在一個示例中,在由控制器101的處理器201執行壓縮方法的場景下,可由控制器101的處理器201執行304和305部分。在該場景下,控制器101的處理器201可以通過後端接口卡將原始數據或壓縮結果發送給硬碟框102進行存儲。
在另一個示例中,在由硬體加速卡207執行壓縮方法的場景下,可由硬體加速卡207執行304和305部分。硬體加速卡207將原始數據或壓縮結果輸出給cache 206。後續,cache 206將原始數據或壓縮結果發送給硬碟框102進行存儲。
需要說明的是,在本實施例中,由於最終可能輸出原始數據,也可能輸出壓縮結果。所以在輸出前,原始數據和壓縮結果均緩存在硬體加速卡207中。
請參見圖3b,在現有壓縮方式中,在獲取到原始數據後,會對其進行壓縮,並輸出壓縮結果。相較於現有技術,本發明提供的方案,在壓縮原始數據之後、存儲之前,會對壓縮結果進行解壓縮,得到解壓縮結果,並校驗解壓縮結果與原始數據是否一致。若一致,輸出壓縮結果,也即對壓縮結果進行存儲。若不一致,說明解壓縮後得到的數據和原始數據不一致,則拋棄壓縮結果,輸出原始數據,對原始數據進行存儲。這樣可避免解壓縮後得到的數據有可能和原始數據不一致。
下面,將以硬體加速卡207執行壓縮方法為例,對本發明的技術方案進行更為詳細的介紹。
圖4示出了本發明實施例提供的壓縮方法的一種交互示例性流程。圖4所示的方法應用在圖1所示的應用場景中,由圖2b所示的控制器101的硬體加速卡207與其他部件交互實現。本實施例重點介紹了如何校驗原始數據和解壓縮結果。
該交互流程包括:
400部分:硬體加速卡207從cache 206接收原始數據。
400部分與前述300部分相類似,在此不作贅述。
401部分:硬體加速卡207計算獲取到的原始數據的校驗數據。
在一個示例中,上述校驗數據可包括原始數據的校驗碼(例如CRC校驗碼)和長度。
CRC(Cyclic Redundancy Check,循環冗餘校驗)算法是一種根據指定數據產生簡短固定位數校驗碼的一種散列函數,用來檢測或校驗數據傳輸或者保存後可能出現的錯誤。
在本發明其他實施例中,還可採用哈希算法得到原始數據的哈希值作為原始數據的校驗碼。
哈希算法就是單向摘要算法,由任意長數據產生定長數據,當輸入數據發生少量變化可引起輸出數據明顯變化。
當然,還可採用其他算法來計算原始數據的校驗碼。
為便於區分,可將原始數據的(CRC)校驗碼稱為第一(CRC)校驗碼,將原始數據的長度稱為第一長度。
在另一個示例中,原始數據的校驗數據也可僅包括第一(CRC)校驗碼或第一長度。
402部分:硬體加速卡207對原始數據進行壓縮,得到壓縮結果。
403部分:硬體加速卡207對壓縮結果進行解壓縮,得到解壓縮結果。
402-403部分與前述301-302部分相類似,在此不作贅述。
404部分:硬體加速卡207計算解壓縮結果的校驗數據。
在一個示例中,與原始數據的校驗數據相一致,解壓縮結果的校驗數據可包括:解壓縮結果的校驗碼(例如CRC校驗碼)和長度。
在本發明其他實施例中,還可採用哈希算法得到解壓縮結果的哈希值作為其校驗碼。
為便於區分,可將解壓縮結果的(CRC)校驗碼稱為第二(CRC)校驗碼,將解壓縮結果的長度稱為第二長度。
當然,在另一個示例中,解壓縮結果的校驗數據也可僅包括第二(CRC)校驗碼或第二長度。
需要說明的是,若原始數據的校驗數據包括第一(CRC)校驗碼和第一長度,則解壓縮結果的校驗數據相應的包括第二(CRC)校驗碼和第二長度;若原始數據的校驗數據僅包括第一(CRC)校驗碼,則解壓縮結果的校驗數據相應的僅包括第二(CRC)校驗碼;而若原始數據的校驗數據僅包括第一長度,則解壓縮結果的校驗數據相應的僅包括第二長度。
405部分:硬體加速卡207比較原始數據的檢驗數據與解壓縮結果的校驗數據是否一致,若一致,進入406部分,否則,進入407部分。
對於原始數據的校驗數據包括第一(CRC)校驗碼和第一長度,解壓縮結果的校驗數據相應的包括第二(CRC)校驗碼和第二長度的情況,需要分別比較第一(CRC)校驗碼與第二(CRC)校驗碼是否相等,第一長度與第二長度是否相等,均相等時,才能得到校驗數據一致的結果。
而對於原始數據的校驗數據僅包括第一(CRC)校驗碼或第一長度,解壓縮結果的校驗數據相應的僅包括第二(CRC)校驗碼或第二長度的情況,則只要第一(CRC)校驗碼與第二(CRC)校驗碼相等,或第一長度與第二長度相等,就可得到得到校驗數據一致的結果。
406部分:硬體加速卡207向cache 206輸出壓縮結果。
407部分:硬體加速卡207向cache 206輸出原始數據。
406-407部分與前述的304-305部分相類似,在此不作贅述。
圖5示出了上述實施例中所涉及的壓縮裝置(特別是硬體加速卡)的一種可能的結構示意圖,包括:讀寫模塊501、壓縮模塊502、解壓縮模塊503和校驗模塊504。
其中,壓縮模塊502可用於對讀寫模塊501獲取的原始數據進行壓縮,得到壓縮結果;壓縮模塊502可包括多個壓縮引擎。
解壓縮模塊503可用於對壓縮模塊502得到的壓縮結果進行解壓縮,得到解壓縮結果;解壓縮模塊503可包括多個解壓縮引擎。
校驗模塊504可用於校驗解壓縮模塊503得到的解壓縮結果與讀寫模塊501獲取的原始數據是否一致;若一致,指示讀寫模塊501輸出上述壓縮結果,若不一致,指示讀寫模塊501輸出上述原始數據。
更具體的,請參見圖6,上述讀寫模塊501可為DMA(Direct Memory Access,直接內存存取)引擎5011。
DMA引擎5011採用DMA技術傳輸數據。
DMA引擎5011進一步可包括DMA控制器和內部存儲器(可為RAM)。
DMA技術允許不同速度的硬體裝置來溝通,而不需要依賴於CPU(這裡指的是控制器101的處理器201)的大量中斷負載。
DMA技術可將數據從一個地址空間複製到另外一個地址空間。典型的例子就是移動一個外部內存的區塊到晶片內部更快的內存區。
DMA傳輸前,CPU要把總線控制權交給DMA控制器,而在結束DMA傳輸後,DMA控制器應把總線控制權再交回給CPU。
DMA控制器獲得總線控制權後,CPU即刻掛起或只執行內部操作,由DMA控制器輸出讀寫命令,直接控制RAM與I/O接口進行DMA傳輸。
在DMA控制器的控制下,在RAM和外部設備之間直接進行數據傳送,在傳送過程中不需要CPU的參與。開始時需提供要傳送的數據的表項數據(數據的起始位置和數據長度)。
這是因為,前述提及了硬體加速卡207內部處理的是一頁一頁的內存頁,每一內存頁大小為4KB,但這4KB的存儲內容中,並不是所有內容都是原始數據。所以要提供原始數據的表項數據(起始位置和長度)。這裡的起始位置指的是偏移地址。
當然,DMA引擎向外輸出數據(可稱為回寫)時,也是需要提供回寫數據的表項數據的。
表項數據可經由CMMDQ(Controller Memory Management Data Queue,控制器內存管理-數據隊列)模塊505輸入或輸出。
CMMDQ模塊505以串行方式從cache 206接收表項數據,其可能會依次接收到很多數據,這些數據會以隊列的形式保存。
CMMDQ模塊505可向DMA引擎提供原始數據的表項數據。在輸出原始數據或壓縮結果時,CMMDQ模塊5可向外部提供輸出的數據的表項數據。
圖6示出了硬體加速卡207的內部數據流向示意圖。其可包括如下流程:
601部分:DMA引擎5011從cache 206處接收內存頁。
更具體的,是從cache 206處將內存頁複製到DMA引擎5011內部的RAM上。
而原始數據是存儲在內存頁中的。
602部分:DMA引擎5011從CMMDQ模塊505處獲取原始數據的表項數據。
603部分:DMA引擎5011根據CMMDQ模塊505提供的原始數據的表項數據,將原始數據提供給壓縮模塊502。
原始數據是存儲在內存頁的,原始數據的表項數據用於描述原始數據的起始位置和長度,得知起始位置和長度後,就可從內存頁中讀取出原始數據,將原始數據提供給壓縮模塊502。
604部分:壓縮模塊502對原始數據進行壓縮,得到壓縮結果。
壓縮結果是存儲在硬體加速卡的存儲器中的。
前述提及了,有多個壓縮引擎分別進行壓縮,每一壓縮引擎可產生一個或多個壓縮數據塊,所有的壓縮數據塊構成上述壓縮結果。當然,每一壓縮數據塊都有編號,以便於識別。
605部分:解壓縮模塊503對上述壓縮結果進行解壓縮,得到解壓縮結果。
需要說明的是,壓縮模塊502得到壓縮結果後,其工作就完成了。那麼如何令解壓縮模塊503開始解壓縮工作呢?可通過異步隊列來實現:在完成壓縮後,壓縮模塊502可在異步隊列中放入壓縮數據塊的編號。
只要異步隊列不為空,解壓縮模塊503就會根據異步隊列中的編號對壓縮數據塊進行解壓縮處理。
606部分:校驗模塊504計算原始數據的檢驗數據,並將其與解壓縮結果的校驗數據進行比對,得到校驗結果。
相關細節可參見前述401、404和405部分。
校驗結果可為一致或不一致。在實際中,可通過編碼0表徵一致,通過編碼1表徵不一致。當然,也可使用其他方式來表徵不同的校驗結果,在此不作贅述。
607部分:校驗模塊504向CMMDQ模塊505返回校驗結果。
608部分:校驗模塊504向DMA引擎5011返回原始數據或壓縮結果的表項數據。
需要說明的是,若校驗結果為一致,則校驗模塊504向DMA引擎5011返回壓縮結果的表項數據;若不一致,則校驗模塊504向DMA引擎5011返回原始數據的表項數據。
在本發明其他實施例中,由於校驗模塊504會向CMMDQ模塊505返回校驗結果,則也可由CMMDQ模塊505向DMA引擎5011返回原始數據或壓縮結果的表項數據。
609:DMA引擎5011根據表項數據向cache 206輸出原始數據或壓縮結果;同時,CMMDQ模塊505向外輸出(向cache 206輸出)原始數據或壓縮結果的表項數據。
具體的,若校驗結果一致,DMA引擎5011接收到的是壓縮結果的表項數據,則輸出包含壓縮結果的內存頁,而CMMDQ模塊505輸出的也是壓縮結果的表項數據。
反之,若校驗結果不一致,DMA引擎5011接收到的是原始數據的表項數據,則輸出包含原始數據的內存頁,而CMMDQ模塊505輸出的也是原始數據的表項數據。
此外,讀寫模塊501或DMA模塊5011還可執行圖3a所示實施例的300、304和305部分,圖4所示實施例的400、406和407部分;
壓縮模塊502還可執行圖3a所示實施例的301部分,圖4所示實施例的402部分;
解壓縮模塊503還可執行圖3a所示實施例的302部分,圖4所示實施例的403部分;
校驗模塊504還可執行圖3a所示實施例的303部分,圖4所示實施例的401、404和405部分。
上述主要從各個裝置之間交互的角度對本發明實施例提供的方案進行了介紹。可以理解的是,各個裝置,例如控制器101、硬體加速卡207等為了實現上述功能,其包含了執行各個功能相應的硬體結構和/或軟體模塊。本領域技術人員應該很容易意識到,結合本文中所公開的實施例描述的各示例的單元及算法步驟,本發明能夠以硬體或硬體和計算機軟體的結合形式來實現。某個功能究竟以硬體還是計算機軟體驅動硬體的方式來執行,取決於技術方案的特定應用和設計約束條件。專業技術人員可以對每個特定的應用來使用不同方法來實現所描述的功能,但是這種實現不應認為超出本發明的範圍。
以上所述的具體實施方式,對本發明的目的、技術方案和有益效果進行了進一步詳細說明,所應理解的是,以上所述僅為本發明的具體實施方式而已,並不用於限定本發明的保護範圍,凡在本發明的技術方案的基礎之上,所做的任何修改、等同替換、改進等,均應包括在本發明的保護範圍之內。