欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

基于ssd的大容量緩存中的lru策略實現(xiàn)方法

文檔序號:6400873閱讀:233來源:國知局
專利名稱:基于ssd的大容量緩存中的lru策略實現(xiàn)方法
技術(shù)領(lǐng)域
本發(fā)明涉及計算機存儲領(lǐng)域,具體涉及一種基于SSD的大容量緩存中的低開銷LRU策略實現(xiàn)方法。
背景技術(shù)
緩存是一種根據(jù)局部性原理,利用小容量的高速存儲設(shè)備保存近期頻繁使用的數(shù)據(jù),從而提高整個存儲系統(tǒng)性能的機制。它因為簡單有效、性價比高、對上層應(yīng)用透明而被廣泛的應(yīng)用于計算機系統(tǒng)中。緩存只保存近期頻繁訪問的數(shù)據(jù),不再頻繁訪問的數(shù)據(jù)將被替換出緩存,識別不頻繁訪問數(shù)據(jù)的機制被稱為緩存替換策略。LRU(Least RecentlyUsed,最久未使用)是一種基本的緩存替換策略。它因為準確地反映了局部性原理而被廣泛地采用,成為大部分復雜緩存替換策略的基礎(chǔ)。LRU替換策略維護一條LRU隊列。近期訪問的數(shù)據(jù)被放到LRU隊列的頭部,近期未訪問的數(shù)據(jù)逐步淘汰到LRU隊列的底部。發(fā)生緩存替換時,僅需將LRU隊列底部的數(shù)據(jù)替換出緩存即可。
本發(fā)明針對基于SSD(Solid State Drive,固態(tài)盤)的緩存,提出一種低開銷的LRU緩存替換策略實現(xiàn)方法。基于本發(fā)明提出的方法,可以實現(xiàn)更復雜的緩存替換策略。SSD是一種新型的存儲設(shè)備。它讀寫延遲較低,能夠提供很高的帶寬。但是,相比于磁盤,SSD價格較貴,容量較小。所以,SSD適合當作磁盤的緩存。相對基于DRAM (Dynamic RandomAccess Memory,內(nèi)存)的緩存,基于SSD的緩存容量很大。這種大容量緩存采用的替換策略需要維護很長的LRU隊列。目前,LRU替換策略的實現(xiàn)方法通常有以下兩種:
1、LRU隊列以雙向鏈表的方式實現(xiàn),鏈表中的每個節(jié)點索引一頁數(shù)據(jù)。當一頁數(shù)據(jù)被訪問時,相應(yīng)的節(jié)點被移動到鏈表的頭部。很久不被訪問的數(shù)據(jù)逐步淘汰到鏈表的尾部,緩存替換時只需將鏈表尾部的數(shù)據(jù)淘汰出緩存即可。這種方法只能將鏈表實現(xiàn)在內(nèi)存中,因為操作系統(tǒng)發(fā)出的每個讀寫請求都會觸發(fā)雙向鏈表中節(jié)點的移動,頻繁的鏈表操作只能在內(nèi)存中進行。對于基于SSD的大容量緩存,這種實現(xiàn)方式占用過多的內(nèi)存。另外,基于雙向鏈表的實現(xiàn)方式需要為鏈表維護一個互斥鎖,頻繁地加鎖和解鎖也會占用很多計算資源。
2、以Clock (時鐘)隊列替代LRU隊列。LRU隊列以雙向鏈表的方式實現(xiàn)時,互斥鎖消耗較多的計算資源,Clock隊列則用來減少加鎖和解鎖操作的頻率。Clock隊列也維護一個雙向鏈表,鏈表的每個節(jié)點索引一頁數(shù)據(jù),同時還為這頁數(shù)據(jù)設(shè)置一個標志位,標志位初始化為O。如果一頁數(shù)據(jù)被訪問,只需將標志位置為1,而不需將整個節(jié)點移動到雙向鏈表的頭部,所以避免了加鎖和解鎖。緩存替換時,檢查Clock隊列尾部的節(jié)點,如果節(jié)點的標志位為1,則將該節(jié)點移動到隊列頭部,并將標志位置為O ;否則,將該節(jié)點刪除,該節(jié)點索引的數(shù)據(jù)被替換出緩存。Clock隊列避免了頻繁地加鎖和解鎖,但必須實現(xiàn)在內(nèi)存中,因為需要頻繁地重置標志位。對于基于SSD的大容量緩存,這種方法仍然不適用。發(fā)明內(nèi)容
本發(fā)明要解決的技術(shù)問題是提供一種實現(xiàn)簡單、操作快捷、存儲占用空間低、內(nèi)存開銷低的基于SSD的大容量緩存中的LRU策略實現(xiàn)方法。
為了解決上述技術(shù)問題,本發(fā)明采用的技術(shù)方案為:
一種基于SSD的大容量緩存中的LRU策略實現(xiàn)方法,其實施步驟如下:
I)在SSD上分配一塊連續(xù)的地址空間初始化FIFO隊列;在內(nèi)存中建立用于記錄只訪問過一次的磁盤邏輯地址的第一計數(shù)型布隆選擇器和用于記錄訪問過兩次以上的磁盤邏輯地址的第二計數(shù)型布隆選擇器的數(shù)據(jù)結(jié)構(gòu),在內(nèi)存中分別申請兩塊地址空間作為待寫入磁盤邏輯地址緩沖區(qū)和待替換磁盤邏輯地址緩沖區(qū),跳轉(zhuǎn)執(zhí)行下一步;
2)接收操作系統(tǒng)對磁盤邏輯地址的讀寫請求,跳轉(zhuǎn)執(zhí)行下一步;
3)檢查讀寫請求的磁盤邏輯地址是否記錄在第二計數(shù)型布隆選擇器中,若在第二計數(shù)型布隆選擇器中存在,等待在新的讀寫請求到來時跳轉(zhuǎn)執(zhí)行步驟2);否則跳轉(zhuǎn)執(zhí)行步驟4);
4)檢查讀寫請求的磁盤邏輯地址是否記錄在第一計數(shù)型布隆選擇器中,若在第一計數(shù)型布隆選擇器中存在,跳轉(zhuǎn)執(zhí)行步驟5);否則,跳轉(zhuǎn)執(zhí)行步驟6);
5)將讀寫請求的磁盤邏輯地址從第一計數(shù)型布隆選擇器中刪除,同時將讀寫請求的磁盤邏輯地址添加到第二計數(shù)型布隆選擇器中,等待在新的讀寫請求到來時跳轉(zhuǎn)執(zhí)行步驟2);
6)判定第一計數(shù)型布隆選擇器和第二計數(shù)型布隆選擇器的數(shù)據(jù)結(jié)構(gòu)中均不包含讀寫請求的磁盤邏輯地址,將讀寫請求的磁盤邏輯地址添加至第一計數(shù)型布隆選擇器中,跳轉(zhuǎn)執(zhí)行下一步;
7)將讀寫請求的磁盤邏輯地址寫到待寫入磁盤邏輯地址緩沖區(qū),跳轉(zhuǎn)執(zhí)行下一I K少;
8)檢查待寫入磁盤邏輯地址緩沖區(qū)是否寫滿,若未寫滿則跳轉(zhuǎn)執(zhí)行步驟10),否則跳轉(zhuǎn)執(zhí)行步驟9);
9)將待寫入磁盤邏輯地址緩沖區(qū)中的磁盤邏輯地址刷新到SSD中FIFO隊列的尾部,同時將FIFO隊列的尾部指針遞增,跳轉(zhuǎn)執(zhí)行下一步;
10)判定讀寫請求的請求類型,如果請求類型為寫請求,則直接將待寫入的用戶數(shù)據(jù)寫到SSD上;如果請求類型為讀請求,由于沒有在SSD上命中,先從底層存儲系統(tǒng)讀出數(shù)據(jù),將數(shù)據(jù)返回給上層應(yīng)用的同時,將數(shù)據(jù)寫到SSD上;跳轉(zhuǎn)執(zhí)行下一步;
11)檢查SSD的空閑存儲空間占SSD總?cè)萘康谋壤欠裥∮诘谝活A設(shè)閾值,若SSD的空閑存儲空間占SSD總?cè)萘康谋壤∮诘谝活A設(shè)閾值則跳轉(zhuǎn)執(zhí)行步驟12),否則等待在新的讀寫請求到來時跳轉(zhuǎn)執(zhí)行步驟2);
12)讀取FIFO隊列的頭部到待替換磁盤邏輯地址緩沖區(qū),跳轉(zhuǎn)執(zhí)行下一步;
13)取出所述待替換磁盤邏輯地址緩沖區(qū)的首個磁盤邏輯地址作為當前磁盤邏輯地址,跳轉(zhuǎn)執(zhí)行下一步;
14)判斷當前磁盤邏輯地址是否在第二計數(shù)型布隆選擇器中,如果在第二計數(shù)型布隆選擇器中則跳轉(zhuǎn)執(zhí)行步驟15);否則跳轉(zhuǎn)執(zhí)行步驟16);
15)將當前磁盤邏輯地址從第二計數(shù)型布隆選擇器中刪除,同時將當前磁盤邏輯地址添加到第一計數(shù)型布隆選擇器中,跳轉(zhuǎn)執(zhí)行步驟17);
16)判斷當前磁盤邏輯地址是否在第一計數(shù)型布隆選擇器中,如果在第一計數(shù)型布隆選擇器中則將當前磁盤邏輯地址從第一計數(shù)型布隆選擇器中刪除,跳轉(zhuǎn)執(zhí)行步驟18);
17)將當前磁盤邏輯地址寫入到待寫入磁盤邏輯地址緩沖區(qū),使得當前磁盤邏輯地址對應(yīng)的數(shù)據(jù)繼續(xù)保留在SSD上,跳轉(zhuǎn)執(zhí)行步驟18);
18)判斷所述待替換磁盤邏輯地址緩沖區(qū)的所有磁盤邏輯地址是否已經(jīng)全部處理完畢,如果尚未處理完畢則獲取下一個磁盤邏輯地址作為當前磁盤邏輯地址,跳轉(zhuǎn)執(zhí)行步驟14);如果已經(jīng)處理完畢則跳轉(zhuǎn)執(zhí)行步驟19);
19)檢查SSD的空閑存儲空間占SSD總?cè)萘康谋壤欠翊笥诘诙A設(shè)閾值,所述第二預設(shè)閾值比第一預設(shè)閾值大,若SSD的空閑存儲空間占SSD總?cè)萘康谋壤笥诘诙A設(shè)閾值,則等待在新的讀寫請求到來時跳轉(zhuǎn)執(zhí)行步驟2);否則跳轉(zhuǎn)執(zhí)行步驟12)。
作為本發(fā)明上述技術(shù)方案的進一步改進:
所述步驟I)中在內(nèi)存中建立的第一計數(shù)型布隆選擇器和第二計數(shù)型布隆選擇器的數(shù)據(jù)結(jié)構(gòu)均包含一個整數(shù)數(shù)組,所述第一計數(shù)型布隆選擇器和第二計數(shù)型布隆選擇器均對應(yīng)設(shè)有多個哈希函數(shù);在將磁盤邏輯地址添加到第一計數(shù)型布隆選擇器或第二計數(shù)型布隆選擇器中時,將磁盤邏輯地址代入到所述多個哈希函數(shù)中得到多個哈希值,將所述哈希值分別對應(yīng)指向整數(shù)數(shù)組中各個位置的整數(shù)都加I;在將磁盤邏輯地址從第一計數(shù)型布隆選擇器或第二計數(shù)型布隆選擇器中刪除時,將磁盤邏輯地址代入到所述多個哈希函數(shù)中得到多個哈希值,將所述哈希值分別對應(yīng)指向整數(shù)數(shù)組中各個位置的整數(shù)都減I ;在查詢磁盤邏輯地址是否在第一計數(shù)型布隆選擇器或第二計數(shù)型布隆選擇器中時,將磁盤邏輯地址代入到所述多個哈希函數(shù)中得到多個哈希值,檢查所述哈希值分別對應(yīng)指向整數(shù)數(shù)組中各個位置的整數(shù)是否都大于0,如果都大于O則說明在第一計數(shù)型布隆選擇器或第二計數(shù)型布隆選擇器中。
所述步驟I)中在內(nèi)存中分別申請兩塊地址空間作為待寫入磁盤邏輯地址緩沖區(qū)和待替換磁盤邏輯地址緩沖區(qū)時,待寫入磁盤邏輯地址緩沖區(qū)和待替換磁盤邏輯地址緩沖區(qū)的地址空間大小均為4KB。
所述第一預設(shè)閾值為5%。
所述第二預設(shè)閾值為10%。
本發(fā)明基于SSD的大容量緩存中的LRU策略實現(xiàn)方法具有下述優(yōu)點:
1.本發(fā)明在SSD上分配一塊連續(xù)的地址空間初始化FIFO隊列,針對FIFO隊列的操作只發(fā)生在隊列的頭部和尾部,實現(xiàn)簡單。相比之下,現(xiàn)有技術(shù)采用LRU隊列,一個磁盤邏輯地址在LRU隊列中命中時,首先需要查找該磁盤邏輯地址在LRU隊列中的位置,然后將該磁盤邏輯地址移動到LRU隊列的頭部,操作非常復雜。
2.本發(fā)明的FIFO隊列保存在SSD上,不占用內(nèi)存空間。由于每個讀寫請求都會觸發(fā)對LRU隊列的操作,隊列操作頻繁,且隊列操作可能發(fā)生在LRU隊列的任何位置,所以現(xiàn)有技術(shù)只能將LRU隊列保存在內(nèi)存中,而LRU隊列必然占用大量內(nèi)存空間;而本發(fā)明通過FIFO隊列模擬實現(xiàn)LRU隊列,充分利用了 SSD的高讀寫速度,而且不會占用內(nèi)存空間。
3.本發(fā)明的FIFO隊列中只記錄磁盤邏輯地址,每個磁盤邏輯地址僅占4字節(jié),整個FIFO隊列占用的SSD空間較少。相比之下,現(xiàn)有技術(shù)采用LRU隊列時,LRU隊列的每個節(jié)點不僅包含磁盤邏輯地址,還包含維護LRU隊列所需的前向指針和后向指針,整個LRU隊列所占的空間是FIFO隊列的三倍以上。
4.本發(fā)明提出的方法僅將兩個計數(shù)型布隆選擇器保存在內(nèi)存中,計數(shù)型布隆選擇器在內(nèi)存中僅僅為兩個整數(shù)數(shù)組,其占用內(nèi)存空間很小。相比之下,現(xiàn)有技術(shù)采用LRU隊列時,LRU隊列占用數(shù)GB內(nèi)存空間。


圖1為本發(fā)明實施例的方法流程示意圖。
具體實施方式
如圖1所示,本實施例基于SSD的大容量緩存中的LRU策略實現(xiàn)方法的實施步驟如下:
I)在SSD上分配一塊連續(xù)的地址空間初始化FIFO隊列;在內(nèi)存中建立用于記錄只訪問過一次的磁盤邏輯地址的第一計數(shù)型布隆選擇器CBF1和用于記錄訪問過兩次以上的磁盤邏輯地址的第二計數(shù)型布隆選擇器CBF2的數(shù)據(jù)結(jié)構(gòu),在內(nèi)存中分別申請兩塊地址空間作為待寫入磁盤邏輯地址緩沖區(qū)和待替換磁盤邏輯地址緩沖區(qū),跳轉(zhuǎn)執(zhí)行下一步。
本實施例中,F(xiàn)IFO隊列存放在SSD中的一片連續(xù)地址空間上,這片連續(xù)地址空間被循環(huán)利用,連續(xù)地址空間的空間大小取決于磁盤邏輯地址的長度和SSD的容量。假定基于SSD的緩存容量為512GB,SSD中每頁占4KB,則整個緩存可以保存512GB/4KB = 128M個磁盤邏輯地址的數(shù)據(jù),這128M個磁盤邏輯地址保存在FIFO隊列中。假定每個磁盤邏輯地址為4字節(jié),則整個FIFO隊列占512MB的SSD空間。
計數(shù)型布隆選擇器CBF由一個維護在內(nèi)存中的整數(shù)數(shù)組和k個哈希函數(shù)Ii1(X),h2(x),h3(x), , hk(x)組成,整數(shù)數(shù)組的所有元素被初始化為O。CBF能夠以較低的空間開銷記錄一個集合中包含有哪些元素。本實施例中,步驟I)中在內(nèi)存中建立的第一計數(shù)型布隆選擇器CBF1和第二計數(shù)型布隆選擇器CBF2的數(shù)據(jù)結(jié)構(gòu)均包含一個整數(shù)數(shù)組,第一計數(shù)型布隆選擇器CBF1和第二計數(shù)型布隆選擇器CBF2均對應(yīng)設(shè)有k個哈希函數(shù)Qi1 (x),h2 (x),h3(x),...,hk(x));在將磁盤邏輯地址添加到第一計數(shù)型布隆選擇器CBF1和第二計數(shù)型布隆選擇器CBF2中時,將磁盤邏輯地址代入到多個哈希函數(shù)中得到多個哈希值,將哈希值分別對應(yīng)指向整數(shù)數(shù)組中各個位置的整數(shù)都加I ;在將磁盤邏輯地址從第一計數(shù)型布隆選擇器CBF1和第二計數(shù)型布隆選擇器CBF2中刪除時,將磁盤邏輯地址代入到多個哈希函數(shù)中得到多個哈希值,將哈希值分別對應(yīng)指向整數(shù)數(shù)組中各個位置的整數(shù)都減I ;在查詢磁盤邏輯地址是否在第一計數(shù)型布隆選擇器CBF1和第二計數(shù)型布隆選擇器CBF2中時,將磁盤邏輯地址代入到多個哈希函數(shù)中得到多個哈希值,檢查哈希值分別對應(yīng)指向整數(shù)數(shù)組中各個位置的整數(shù)是否都大于0,如果都大于O則說明在第一計數(shù)型布隆選擇器CBF1或第二計數(shù)型布隆選擇器CBF2中。本實施例中,CBF1和CBF2各維護4個哈希函數(shù)Ii1 (x),h2 (x),h3 (x),h4(X)。
本實施例中,第一計數(shù)型布隆選擇器和第二計數(shù)型布隆選擇器均對應(yīng)的多個哈希函數(shù),哈希函數(shù)通過將磁盤邏輯地址代入到SHAl函數(shù)中進行哈希運算得到。對于磁盤邏輯地址Addr,當需要使用它的4個哈希值時,計算Addr的SHAl (Secure Hash Algorithm,安全哈希算法)值,Addr 的 SHAl 值包含 160 位,Ii1 (Addr), h2 (Addr), h3 (Addr), h4 (Addr)分別對應(yīng)這160位中不同的29位。這種方法保證4個哈希函數(shù)的隨機性和均勻性,且計算簡單。
由于SSD的最小讀寫單位是頁,頁大小一般為4KB。將磁盤邏輯地址添加到FIFO隊列的尾部時,需要累積1024個4字節(jié)的磁盤邏輯地址,才能向SSD發(fā)送一個寫請求,待寫入磁盤邏輯地址緩沖區(qū)正是用來累積一頁的磁盤邏輯地址。引入待寫入磁盤邏輯地址緩沖區(qū)和待替換磁盤邏輯地址緩沖區(qū)主要是因為SSD的最小讀寫單位是頁,頁大小一般為4KB,因此本實施例中,步驟I)中在內(nèi)存中分別申請兩塊地址空間作為待寫入磁盤邏輯地址緩沖區(qū)和待替換磁盤邏輯地址緩沖區(qū)時,待寫入磁盤邏輯地址緩沖區(qū)和待替換磁盤邏輯地址緩沖區(qū)的地址空間大小均為4KB,既可以進行累積一頁的磁盤邏輯地址來適配SSD的寫入需要而且各占用4KB內(nèi)存空間,開銷很小。CBF維護的整數(shù)數(shù)組的大小取決于可能放入該CBF中的元素個數(shù)。如果基于SSD的緩存為512GB,SSD每頁4KB,則放入CBF1和CBF2中的磁盤邏輯地址最多為128M個。每個磁盤邏輯地址添加到CBF1 (CBF2)中時,都會將CBF1 (CBF2)維護的整數(shù)數(shù)組中的k個元素加1,這k個元素的位置取決于磁盤邏輯地址和采用的哈希函數(shù)。為了減少哈希沖突,CBF1和CBF2維護的整數(shù)數(shù)組都包含512M個元素。整數(shù)數(shù)組中每個元素占2位,整個數(shù)組占128MB的內(nèi)存空間。所以,本實施例的第一計數(shù)型布隆選擇器CBF1和第二計數(shù)型布隆選擇器CBF2共占用256MB的內(nèi)存空間。當4KB的待寫入磁盤邏輯地址緩沖區(qū)寫滿時,則將待寫入磁盤邏輯地址緩沖區(qū)中的磁盤邏輯地址刷新到SSD上FIFO隊列的尾部;發(fā)生緩存替換時,先從FIFO隊列頭部取出4KB的磁盤邏輯地址,放到待替換磁盤邏輯地址緩沖區(qū)內(nèi),然后逐個處理這些邏輯地址。
2)接收操作系統(tǒng)對磁盤邏輯地址Addr的讀寫請求,跳轉(zhuǎn)執(zhí)行下一步。
3)檢查讀寫請求的磁盤邏輯地址Addr是否記錄在第二計數(shù)型布隆選擇器CBF2中,若在第二計數(shù)型布隆選擇器CBF2中存在,等待在新的讀寫請求到來時跳轉(zhuǎn)執(zhí)行步驟2);否則跳轉(zhuǎn)執(zhí)行步驟4)。
本實施例將讀寫請求的磁盤邏輯地址Addr代入到第二計數(shù)型布隆選擇器CBF2的四個哈希函數(shù) Ii1 (X),h2 (X),h3 (X),h4 (X)中,得至Ij Ii1 (Addr),h2 (Addr),h3 (Addr),h4 (Addr)四個29位的哈希值,這四個哈希值指向第二計數(shù)型布隆選擇器CBF2維護的內(nèi)存中整數(shù)數(shù)組中的四個位置,如果這四個位置對應(yīng)的整數(shù)都大于0,說明讀寫請求的磁盤邏輯地址Addr在第二計數(shù)型布隆選擇器CBF2中。
4)檢查讀寫請求的磁盤邏輯地址Addr是否記錄在第一計數(shù)型布隆選擇器CBF1中,若在第一計數(shù)型布隆選擇器CBF1中存在,跳轉(zhuǎn)執(zhí)行步驟5);否則,跳轉(zhuǎn)執(zhí)行步驟6)。
與步驟3)類似,本實施例將讀寫請求的磁盤邏輯地址Addr代入到第一計數(shù)型布隆選擇器 CBF1 的四個哈希函數(shù) Ii1 (X),h2 (X),h3 (x),h4 (x)中,得到 Ii1 (Addr),h2 (Addr),h3(Addr), h4 (Addr)四個29位的哈希值,這四個哈希值指向第一計數(shù)型布隆選擇器CBF1維護的內(nèi)存中整數(shù)數(shù)組中的四個位置,如果這四個位置對應(yīng)的整數(shù)都大于0,說明讀寫請求的磁盤邏輯地址Addr在第一計數(shù)型布隆選擇器CBF1中。
5)將讀寫請求的磁盤邏輯地址Addr從第一計數(shù)型布隆選擇器CBF1中刪除,同時將讀寫請求的磁盤邏輯地址Addr添加到第二計數(shù)型布隆選擇器CBF2中,等待在新的讀寫請求到來時跳轉(zhuǎn)執(zhí)行步驟2)。
將讀寫請求的磁盤邏輯地址Addr從第一計數(shù)型布隆選擇器CBF1中刪除時,將讀寫請求的磁盤邏輯地址Addr代入到四個哈希函數(shù)Ill(X), h2(x),h3(x),h4(x)中,得到hi (Addr), h2 (Addr), h3 (Addr), h4 (Addr)四個29位的哈希值,這四個哈希值指向第一計數(shù)型布隆選擇器CBF1維護的整數(shù)數(shù)組中的四個位置,將這四個位置的整數(shù)都減1,即將讀寫請求的磁盤邏輯地址Addr從第一計數(shù)型布隆選擇器CBF1中刪除;將讀寫請求的磁盤邏輯地址Addr添加到第二計數(shù)型布隆選擇器CBF2中時,將讀寫請求的磁盤邏輯地址Addr代入到四個哈希函數(shù) Ii1 (X),h2 (X),h3 (X),h4 (X)中,得至Ij Ii1 (Addr),h2 (Addr),h3 (Addr),h4 (Addr)四個29位的哈希值,這四個哈希值指向第二計數(shù)型布隆選擇器CBF2維護的整數(shù)數(shù)組中的四個位置,將這四個位置的整數(shù)都加1,即實現(xiàn)將讀寫請求的磁盤邏輯地址Addr添加到第二計數(shù)型布隆選擇器CBF2中。本實施例中,在第二計數(shù)型布隆選擇器CBF2維護的整數(shù)數(shù)組中,每個元素僅占2位,能表示的最大整數(shù)為3。如果某一位置的整數(shù)為3,不能將它加I。
6)判定第一計數(shù)型布隆選擇器CBF1和第二計數(shù)型布隆選擇器CBF2的數(shù)據(jù)結(jié)構(gòu)中均不包含讀寫請求的磁盤邏輯地址,將讀寫請求的磁盤邏輯地址添加至第一計數(shù)型布隆選擇器CBF1中,跳轉(zhuǎn)執(zhí)行下一步。
本實施例將讀寫請求的磁盤邏輯地址添加至第一計數(shù)型布隆選擇器CBF1中與添加到第二計數(shù)型布隆選擇器CBF2相同,步驟為:將讀寫請求的磁盤邏輯地址Addr代入到四個哈希函數(shù) Ii1 (X),h2 (X),h3 (X),h4 (X)中,得至Ij Ii1 (Addr),h2 (Addr),h3 (Addr),h4 (Addr)四個29位的哈希值,這四個哈希值指向第一計數(shù)型布隆選擇器CBF1維護的整數(shù)數(shù)組中的四個位置,將這四個位置的整數(shù)都加1,即實現(xiàn)將Addr添加到第一計數(shù)型布隆選擇器CBF1中。本實施例中,在第一計數(shù)型布隆選擇器CBF1維護的整數(shù)數(shù)組中,每個元素僅占2位,能表示的最大整數(shù)為3。如果某一位置的整數(shù)為3,同樣也不能將它加I。
7)將讀寫請求的磁盤邏輯地址Addr寫到待寫入磁盤邏輯地址緩沖區(qū),跳轉(zhuǎn)執(zhí)行下一步。
8)檢查待寫入磁盤邏輯地址緩沖區(qū)是否寫滿,若未寫滿則跳轉(zhuǎn)執(zhí)行步驟10),否則跳轉(zhuǎn)執(zhí)行步驟9)。
9)將待寫入磁盤邏輯地址緩沖區(qū)中的磁盤邏輯地址刷新到SSD中FIFO隊列的尾部,同時將FIFO隊列的尾部指針遞增,跳轉(zhuǎn)執(zhí)行下一步。
10)判定讀寫請求的請求類型,如果請求類型為寫請求,則直接將待寫入的用戶數(shù)據(jù)寫到SSD上;如果請求類型為讀請求,由于沒有在SSD上命中,先從底層存儲系統(tǒng)讀出數(shù)據(jù),將數(shù)據(jù)返回給上層應(yīng)用的同時,將數(shù)據(jù)寫到SSD上;跳轉(zhuǎn)執(zhí)行下一步。
將讀寫請求的磁盤邏輯地址Addr對應(yīng)的數(shù)據(jù)寫到SSD上,因此遞減SSD的緩存空閑空間C。將讀寫請求的磁盤邏輯地址Addr對應(yīng)的數(shù)據(jù)寫到SSD上時對于寫請求,直接將待寫入的用戶數(shù)據(jù)寫到SSD上。對于讀請求,由于沒有在SSD上命中,先從底層存儲系統(tǒng)讀出數(shù)據(jù),將數(shù)據(jù)返回給上層應(yīng)用的同時,將數(shù)據(jù)寫到SSD上。
11)檢查SSD的空閑存儲空間占SSD總?cè)萘康谋壤齝是否小于第一預設(shè)閾值α,若SSD的空閑存儲空間占SSD總?cè)萘康谋壤齝小于第一預設(shè)閾值α則跳轉(zhuǎn)執(zhí)行步驟12),否則等待在新的讀寫請求到來時跳轉(zhuǎn)執(zhí)行步驟2);
本實施例中,第一預設(shè)閾值α為5%,即緩存空間利用率超過95%時,觸發(fā)緩存替換。如果第一預設(shè)閾值α取值太大,則可能引起SSD被頻繁讀寫,而本實施例中第一預設(shè)閾值α取值為5%,能夠盡量避免對SSD的讀寫操作,又能夠確保SSD有足夠的緩存空間可用。
12)讀取FIFO隊列的頭部到待替換磁盤邏輯地址緩沖區(qū),跳轉(zhuǎn)執(zhí)行下一步。
由于SSD的基本讀寫單位是頁,所以從FIFO隊列的頭部讀取一頁的磁盤邏輯地址,放到待替換磁盤邏輯地址緩沖區(qū)。由于在步驟9)中以4KB為單位將磁盤邏輯地址寫到FIFO隊列中,這里以4KB為基本單位從FIFO隊列頭部將磁盤邏輯地址讀出,放到待替換磁盤邏輯地址緩沖區(qū)。每個磁盤邏輯地址大小為N字節(jié),所以一共讀出4KB/N的磁盤邏輯地址。下面的步驟13) 步驟18)即為將這4KB/N個磁盤邏輯地址對應(yīng)的數(shù)據(jù)替換出SSD,直到SSD的空閑存儲空間大于第二預設(shè)閾值β,其中第二預設(shè)閾值β與第一預設(shè)閾值α的關(guān)系為:β > α。
13)取出待替換磁盤邏輯地址緩沖區(qū)(共存儲有4ΚΒ/Ν個磁盤邏輯地址)的首個磁盤邏輯地址Addrn(η = I)作為當前磁盤邏輯地址,跳轉(zhuǎn)執(zhí)行下一步。
14)判斷當前磁盤邏輯地址Addrn是否在第二計數(shù)型布隆選擇器CBF2中,如果在第二計數(shù)型布隆選擇器CBF2中則跳轉(zhuǎn)執(zhí)行步驟15);否則跳轉(zhuǎn)執(zhí)行步驟16)。
與步驟3)相同,本實施例將當前磁盤邏輯地址Addrn代入到第二計數(shù)型布隆選擇器的四個哈希函數(shù) Ii1 (X), h2(x), h3(x), h4(x)中,得到 Ii1 (Addr), h2 (Addr), h3 (Addr),h4(Addr)四個29位的哈希值,這四個哈希值指向第二計數(shù)型布隆選擇器CBF2維護的內(nèi)存中整數(shù)數(shù)組中的四個位置,如果這四個位置對應(yīng)的整數(shù)都大于0,說明當前磁盤邏輯地址Addrn在第二計數(shù)型布隆選擇器CBF2中。
15)將當前磁盤邏輯地址Addrn從第二計數(shù)型布隆選擇器CBF2中刪除,同時將當前磁盤邏輯地址Addrn添加到第一計數(shù)型布隆選擇器CBF1中,跳轉(zhuǎn)執(zhí)行步驟17)。
與步驟5)類似,將當前磁盤邏輯地址Addrn從第二計數(shù)型布隆選擇器CBF2中刪除時,將當前磁盤邏輯地址Addrn代入到四個哈希函數(shù)Ill (X),h2(x),h3(x),h4(x)中,得到hi (Addr), h2 (Addr), h3 (Addr), h4 (Addr)四個29位的哈希值,這四個哈希值指向第二計數(shù)型布隆選擇器CBF2維護的整數(shù) 數(shù)組中的四個位置,將這四個位置的整數(shù)都減1,即實現(xiàn)將當前磁盤邏輯地址Addrn從第二計數(shù)型布隆選擇器CBF2中刪除;將當前磁盤邏輯地址Addrn添加到第一計數(shù)型布隆選擇器CBF1中時,將當前磁盤邏輯地址Addrn代入到四個哈希函數(shù)Ii1 (X),h2 (X),h3 (X),h4 (X)中,得至Ij Ii1 (Addr),h2 (Addr),h3 (Addr),h4 (Addr)四個 29 位的哈希值,這四個哈希值指向第一計數(shù)型布隆選擇器CBF1維護的整數(shù)數(shù)組中的四個位置,將這四個位置的整數(shù)都加1,即實現(xiàn)將當前磁盤邏輯地址Addr1J^加到第一計數(shù)型布隆選擇器CBF1中。本實施例中,在第一計數(shù)型布隆選擇器CBF1維護的整數(shù)數(shù)組中,每個元素僅占2位,能表示的最大整數(shù)為3。如果某一位置的整數(shù)為3,不能將它加I。
16)判斷當前磁盤邏輯地址Addrn是否在第一計數(shù)型布隆選擇器CBF1中,如果在第一計數(shù)型布隆選擇器CBF1中則將當前磁盤邏輯地址從第一計數(shù)型布隆選擇器CBF1中刪除,跳轉(zhuǎn)執(zhí)行步驟18)。
本實施例中,無論當前磁盤邏輯地址Addrn是否記錄在第一計數(shù)型布隆選擇器CBF1中,都將當前磁盤邏輯地址Addrn對應(yīng)的數(shù)據(jù)從SSD上替換出來,將該數(shù)據(jù)占據(jù)的空間添加到SSD的空閑存儲空間中。當前磁盤邏輯地址Addrn不出現(xiàn)在第二計數(shù)型布隆選擇器CBF2中,說明當前磁盤邏輯地址Addrn是不頻繁訪問的邏輯地址,應(yīng)該盡快替換出緩存。
同時,本步驟中對η值遞增I,使得當前磁盤邏輯地址Addrn切換到4ΚΒ/Ν個磁盤邏輯地址中的下一個磁盤邏輯地址。
本實施例中,判斷當前磁盤邏輯地址Addrn是否在第一計數(shù)型布隆選擇器CBF1中與步驟3)相似,本實施例將當前磁盤邏輯地址AddrnR入到第一計數(shù)型布隆選擇器CBF1的四個哈希函數(shù) Ii1 (X),h2 (X),h3 (X),h4 (X)中,得至Ij Ii1 (Addr),h2 (Addr),h3 (Addr),h4 (Addr)四個29位的哈希值,這四個哈希值指向第一計數(shù)型布隆選擇器CBF1護的內(nèi)存中整數(shù)數(shù)組中的四個位置,如果這四個位置對應(yīng)的整數(shù)都大于0,說明當前磁盤邏輯地址Addrn在第一計數(shù)型布隆選擇器CBF1中;將當前磁盤邏輯地址從第一計數(shù)型布隆選擇器CBF1中刪除與步驟15)中將當前磁盤邏輯地址Addrn從第二計數(shù)型布隆選擇器CBF2中刪除相似:將當前磁盤邏輯地址Addrn代入到第一計數(shù)型布隆選擇器CBF1維系的四個哈希函數(shù)Ii1 (x),h2 (x),h3 (X),h4 (X)中,得至Ij Ii1 (Addr),h2 (Addr),h3 (Addr),h4 (Addr)四個 29 位的哈希值,這四個哈希值指向第一計數(shù)型布隆選擇器CBF1維護的整數(shù)數(shù)組中的四個位置,將這四個位置的整數(shù)都減1,即實現(xiàn)將當前磁盤邏輯地址Addrn從第一計數(shù)型布隆選擇器CBF1中刪除。
17)將當前磁盤邏輯地址Addrn寫入到待寫入磁盤邏輯地址緩沖區(qū),使得當前磁盤邏輯地址Addrn對應(yīng)的數(shù)據(jù)繼續(xù)保留在SSD上,跳轉(zhuǎn)執(zhí)行步驟18)。
因為當前磁盤邏輯地址Addrn出現(xiàn)在第二計數(shù)型布隆選擇器CBF2中,說明當前磁盤邏輯地址AddrnS頻繁訪問的邏輯地址,不用替換出緩存,將它重新寫到待寫入磁盤邏輯地址緩沖區(qū)中,使它對應(yīng)的數(shù)據(jù)在緩存中駐留更長的時間,從而當前磁盤邏輯地址Addrn再次獲得駐留在SSD中的機會。
同時,本步驟中對η值遞增I,使得當前磁盤邏輯地址Addrn切換到4ΚΒ/Ν個磁盤邏輯地址中的下一個磁盤邏輯地址。
18)判斷待替換磁盤邏輯地址緩沖區(qū)的所有磁盤邏輯地址是否已經(jīng)全部處理完畢(即判斷待替換磁盤邏輯地址緩沖區(qū)是否空),如果尚未處理完畢則獲取下一個磁盤邏輯地址作為當前磁盤邏輯地址,跳轉(zhuǎn)執(zhí)行步驟14);如果已經(jīng)處理完畢則跳轉(zhuǎn)執(zhí)行步驟19)。
本實施例中,具體為將η值與4ΚΒ/Ν進行比較,若η值大于4ΚΒ/Ν,說明這一批次從FIFO隊列尾部取出的4KB/N個磁盤邏輯地址處理完畢,跳轉(zhuǎn)執(zhí)行步驟19)。若η值小于等于4ΚΒ/Ν,跳轉(zhuǎn)執(zhí)行步驟14)對4ΚΒ/Ν個磁盤邏輯地址中的下一個磁盤邏輯地址進行處理。
19)檢查SSD的空閑存儲空間占SSD總?cè)萘康谋壤齝是否大于第二預設(shè)閾值β,第二預設(shè)閾值β比第一預設(shè)閾值α大,若SSD的空閑存儲空間占SSD總?cè)萘康谋壤齝大于第二預設(shè)閾值β,則等待在新的讀寫請求到來時跳轉(zhuǎn)執(zhí)行步驟2);否則跳轉(zhuǎn)執(zhí)行步驟12)。
本實施例中,第二預設(shè)閾值β為10%,即當SSD的空閑空間超過總?cè)萘康?0%時,停止緩存替換。通過第二預設(shè)閾值β的設(shè)置,使得每一輪緩存替換都會將SSD空閑出5%的存儲空間,能夠盡量避免對SSD的讀寫操作,又能夠確保SSD有足夠的緩存空間可用。
綜上所述,本實施例針對基于SSD的緩存容量較大的問題,將上層應(yīng)用讀寫請求的邏輯地址組織成FIFO (First In First Out,先進先出)隊列,并用兩個計數(shù)型布隆選擇器(Counting Bloom Filter, CBF)結(jié)構(gòu)分類記錄FIFO隊列中的邏輯地址。其中,第一個CBF記錄FIFO隊列中只訪問過一次的邏輯地址,第二個CBF記錄FIFO隊列中被多次訪問的邏輯地址。緩存替換時優(yōu)先將第一個CBF中邏輯地址對應(yīng)的數(shù)據(jù)替換出緩存。FIFO隊列和兩個CBF能夠準確地模擬LRU隊列的行為。FIFO隊列保存在SSD上,不占用內(nèi)存空間。兩個CBF保存在內(nèi)存中,但占用內(nèi)存空間很小。所以,本實施例以很低的內(nèi)存開銷為前提實現(xiàn)了 LRU隊列的功能,LRU緩存替換策略實現(xiàn)方法,充分利用了 SSD的高讀寫性能的優(yōu)點,具有實現(xiàn)簡單、操作快捷、存儲占用空間低、內(nèi)存開銷低的優(yōu)點。
以上所述僅是本發(fā)明的優(yōu)選實施方式,本發(fā)明的保護范圍并不僅局限于上述實施例,凡屬于本發(fā)明思路下的技術(shù)方案均屬于本發(fā)明的保護范圍。應(yīng)當指出,對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理前提下的若干改進和潤飾,這些改進和潤飾也應(yīng)視為本發(fā)明的保護范圍。
權(quán)利要求
1.一種基于SSD的大容量緩存中的LRU策略實現(xiàn)方法,其特征在于實施步驟如下: 1)在SSD上分配一塊連續(xù)的地址空間初始化FIFO隊列;在內(nèi)存中建立用于記錄只訪問過一次的磁盤邏輯地址的第一計數(shù)型布隆選擇器和用于記錄訪問過兩次以上的磁盤邏輯地址的第二計數(shù)型布隆選擇器的數(shù)據(jù)結(jié)構(gòu),在內(nèi)存中分別申請兩塊地址空間作為待寫入磁盤邏輯地址緩沖區(qū)和待替換磁盤邏輯地址緩沖區(qū),跳轉(zhuǎn)執(zhí)行下一步; 2)接收操作系統(tǒng)對磁盤邏輯地址的讀寫請求,跳轉(zhuǎn)執(zhí)行下一步; 3)檢查讀寫請求的磁盤邏輯地址是否記錄在第二計數(shù)型布隆選擇器中,若在第二計數(shù)型布隆選擇器中存在,等待在新的讀寫請求到來時跳轉(zhuǎn)執(zhí)行步驟2);否則跳轉(zhuǎn)執(zhí)行步驟4); 4)檢查讀寫請求的磁盤邏輯地址是否記錄在第一計數(shù)型布隆選擇器中,若在第一計數(shù)型布隆選擇器中存 在,跳轉(zhuǎn)執(zhí)行步驟5);否則,跳轉(zhuǎn)執(zhí)行步驟6); 5)將讀寫請求的磁盤邏輯地址從第一計數(shù)型布隆選擇器中刪除,同時將讀寫請求的磁盤邏輯地址添加到第二計數(shù)型布隆選擇器中,等待在新的讀寫請求到來時跳轉(zhuǎn)執(zhí)行步驟2); 6)判定第一計數(shù)型布隆選擇器和第二計數(shù)型布隆選擇器的數(shù)據(jù)結(jié)構(gòu)中均不包含讀寫請求的磁盤邏輯地址,將讀寫請求的磁盤邏輯地址添加至第一計數(shù)型布隆選擇器中,跳轉(zhuǎn)執(zhí)行下一步; 7)將讀寫請求的磁盤邏輯地址寫到待寫入磁盤邏輯地址緩沖區(qū),跳轉(zhuǎn)執(zhí)行下一步; 8)檢查待寫入磁盤邏輯地址緩沖區(qū)是否寫滿,若未寫滿則跳轉(zhuǎn)執(zhí)行步驟10),否則跳轉(zhuǎn)執(zhí)行步驟9); 9)將待寫入磁盤邏輯地址緩沖區(qū)中的磁盤邏輯地址刷新到SSD中FIFO隊列的尾部,同時將FIFO隊列的尾部指針遞增,跳轉(zhuǎn)執(zhí)行下一步; 10)判定讀寫請求的請求類型,如果請求類型為寫請求,則直接將待寫入的用戶數(shù)據(jù)寫至IJ SSD上;如果請求類型為讀請求,由于沒有在SSD上命中,先從底層存儲系統(tǒng)讀出數(shù)據(jù),將數(shù)據(jù)返回給上層應(yīng)用的同時,將數(shù)據(jù)寫到SSD上;跳轉(zhuǎn)執(zhí)行下一步; 11)檢查SSD的空閑存儲空間占SSD總?cè)萘康谋壤欠裥∮诘谝活A設(shè)閾值,若SSD的空閑存儲空間占SSD總?cè)萘康谋壤∮诘谝活A設(shè)閾值則跳轉(zhuǎn)執(zhí)行步驟12),否則跳轉(zhuǎn)執(zhí)行步驟2)等待新的讀寫請求到來; 12)讀取FIFO隊列的頭部到待替換磁盤邏輯地址緩沖區(qū),跳轉(zhuǎn)執(zhí)行下一步; 13)取出所述待替換磁盤邏輯地址緩沖區(qū)的首個磁盤邏輯地址作為當前磁盤邏輯地址,跳轉(zhuǎn)執(zhí)行下一步; 14)判斷當前磁盤邏輯地址是否在第二計數(shù)型布隆選擇器中,如果在第二計數(shù)型布隆選擇器中則跳轉(zhuǎn)執(zhí)行步驟15);否則跳轉(zhuǎn)執(zhí)行步驟16); 15)將當前磁盤邏輯地址從第二計數(shù)型布隆選擇器中刪除,同時將當前磁盤邏輯地址添加到第一計數(shù)型布隆選擇器中,跳轉(zhuǎn)執(zhí)行步驟17); 16)判斷當前磁盤邏輯地址是否在第一計數(shù)型布隆選擇器中,如果在第一計數(shù)型布隆選擇器中則將當前磁盤邏輯地址從第一計數(shù)型布隆選擇器中刪除,跳轉(zhuǎn)執(zhí)行步驟18); 17)將當前磁盤邏輯地址寫入到待寫入磁盤邏輯地址緩沖區(qū),使得當前磁盤邏輯地址對應(yīng)的數(shù)據(jù)繼續(xù)保留在SSD上,跳轉(zhuǎn)執(zhí)行步驟18);18)判斷所述待替換磁盤邏輯地址緩沖區(qū)的所有磁盤邏輯地址是否已經(jīng)全部處理完畢,如果尚未處理完畢則獲取下一個磁盤邏輯地址作為當前磁盤邏輯地址,跳轉(zhuǎn)執(zhí)行步驟14);如果已經(jīng)處理完畢則跳轉(zhuǎn)執(zhí)行步驟19); 19)檢查SSD的空閑存儲空間占SSD總?cè)萘康谋壤欠翊笥诘诙A設(shè)閾值,所述第二預設(shè)閾值比第一預設(shè)閾值大,若SSD的空閑存儲空間占SSD總?cè)萘康谋壤笥诘诙A設(shè)閾值,則等待在新的讀寫請求到來時跳轉(zhuǎn)執(zhí)行步驟2);否則跳轉(zhuǎn)執(zhí)行步驟12)。
2.根據(jù)權(quán)利要求1所述的基于SSD的大容量緩存中的LRU策略實現(xiàn)方法,其特征在于:所述步驟I)中在內(nèi)存中建立的第一計數(shù)型布隆選擇器和第二計數(shù)型布隆選擇器的數(shù)據(jù)結(jié)構(gòu)均包含一個整數(shù)數(shù)組,所述第一計數(shù)型布隆選擇器和第二計數(shù)型布隆選擇器均對應(yīng)設(shè)有多個哈希函數(shù);在將磁盤邏輯地址添加到第一計數(shù)型布隆選擇器或第二計數(shù)型布隆選擇器中時,將磁盤邏輯地址代入到所述多個哈希函數(shù)中得到多個哈希值,將所述哈希值分別對應(yīng)指向整數(shù)數(shù)組中各個位置的整數(shù)都加I ;在將磁盤邏輯地址從第一計數(shù)型布隆選擇器或第二計數(shù)型布隆選擇器中刪除時,將磁盤邏輯地址代入到所述多個哈希函數(shù)中得到多個哈希值,將所述哈希值分別對應(yīng)指向整數(shù)數(shù)組中各個位置的整數(shù)都減I ;在查詢磁盤邏輯地址是否在第一計數(shù)型布隆選擇器或第二計數(shù)型布隆選擇器中時,將磁盤邏輯地址代入到所述多個哈希函數(shù)中得到多個哈希值,檢查所述哈希值分別對應(yīng)指向整數(shù)數(shù)組中各個位置的整數(shù)是否都大于O,如果都大于O則說明在第一計數(shù)型布隆選擇器或第二計數(shù)型布隆選擇器中。
3.根據(jù)權(quán)利要求2所述的基于SSD的大容量緩存中的LRU策略實現(xiàn)方法,其特征在于:所述步驟I)中在內(nèi)存中分別申請兩塊地址空間作為待寫入磁盤邏輯地址緩沖區(qū)和待替換磁盤邏輯地址緩沖區(qū)時,待寫入磁盤邏輯地址緩沖區(qū)和待替換磁盤邏輯地址緩沖區(qū)的地址空間大小均為4KB。
4.根據(jù)權(quán)利要求1或2或3所述的基于SSD的大容量緩存中的LRU策略實現(xiàn)方法,其特征在于:所述第一預設(shè)閾值為5%。
5.根據(jù)權(quán)利要求4所述的基于SSD的大容量緩存中的LRU策略實現(xiàn)方法,其特征在于:所述第二預設(shè)閾 值為10%。
全文摘要
本發(fā)明公開了一種基于SSD的大容量緩存中的LRU策略實現(xiàn)方法,該方法將上層應(yīng)用讀寫請求的邏輯地址組織成FIFO隊列,兩個計數(shù)型布隆選擇器分別用于記錄FIFO隊列中只訪問過一次和訪問過多次的邏輯地址,F(xiàn)IFO隊列和兩個計數(shù)型布隆選擇器能夠準確地模擬LRU隊列的行為。FIFO隊列保存在SSD上,不占用內(nèi)存空間。兩個計數(shù)型布隆選擇器保存在內(nèi)存中,但占用內(nèi)存空間很小。本發(fā)明以很低的內(nèi)存開銷實現(xiàn)了LRU隊列的功能,具有實現(xiàn)簡單、操作快捷、存儲占用空間低、內(nèi)存開銷低的優(yōu)點。
文檔編號G06F5/16GK103150136SQ20131009730
公開日2013年6月12日 申請日期2013年3月25日 優(yōu)先權(quán)日2013年3月25日
發(fā)明者肖儂, 盧宇彤, 陳志廣, 周恩強, 劉芳, 所光, 謝旻, 董勇, 張偉 申請人:中國人民解放軍國防科學技術(shù)大學
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
洛南县| 汕尾市| 新兴县| 新邵县| 南昌县| 奉新县| 佛坪县| 汝阳县| 静宁县| 宁国市| 利津县| 吴桥县| 龙南县| 平泉县| 两当县| 彭州市| 吉林省| 柘城县| 青州市| 女性| 北海市| 远安县| 清水河县| 合山市| 即墨市| 横峰县| 探索| 甘肃省| 五原县| 区。| 祁阳县| 霍林郭勒市| 泊头市| 峨山| 德清县| 金门县| 锡林郭勒盟| 明光市| 霍邱县| 靖江市| 大城县|