freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

計算機科學(xué)與技術(shù)專業(yè)畢業(yè)設(shè)計-存儲編碼高效算法的實現(xiàn)-資料下載頁

2025-06-07 05:28本頁面
  

【正文】 組件,就位于這一層。 存儲設(shè)備的組織方式 ZFS 以存儲池的方式組織存儲設(shè)備,池中的文件系統(tǒng)不局限于單個設(shè)備,不同文件系統(tǒng)也可共享同一設(shè)備。池中所 有設(shè)備都抽象成為虛設(shè)備,組成三個層次的樹形結(jié)構(gòu)。如圖 31 所示,每個節(jié)點表示一個虛設(shè)備,每個虛設(shè)備的信息都存儲在對應(yīng)的 vdev 對象中。根節(jié)點稱為 root 節(jié)點或者 root 虛設(shè)備;內(nèi)部節(jié)點稱為 top 節(jié)點或者 top 虛設(shè)備;葉節(jié)點稱為 leaf 節(jié)點或者 leaf 虛設(shè)備。 root和 top 都是文件系統(tǒng)的邏輯虛設(shè)備;而 leaf 節(jié)點是物理虛設(shè)備,對應(yīng)物理存儲設(shè)備,可以是一個磁盤,或者是一個分區(qū)。容錯編碼應(yīng)用于 top 層次,即一個top 的多個孩子( leaf 設(shè)備)可組成一個磁盤陣列。 TopLeafRoot邏輯虛設(shè)備 圖 31: 存儲設(shè)備的組織方式 這里,用一個例子可以更清楚 地 表示這種樹形結(jié)構(gòu)。用戶可以執(zhí)行這樣一條命令“ zpool create –f tank raidz /dev/sda5 /dev/sdb5 /dev/sdc5 raidz /dev/sda6 /dev/sdb6 /dev/sdc6”。對應(yīng)的,生成兩個 top 虛設(shè)備,每個 top 虛設(shè)備的類型均是 raidz 類型,下面各有三個 leaf 虛設(shè)備: sda sdb sdc5 和 sda sdb sdc6,即該存儲池由兩個具有單容錯能力的磁盤陣列構(gòu)成。 raidz 組件剖析 17 在 ZFS 中,任何用戶 I/O 請求都被封裝成為 zio 對象。請求被 ZFS 系統(tǒng)映射到虛設(shè)備進行進行實際的讀寫操作。如果請求訪問的 top 節(jié)點的是 raidz 或者raidz2 類型,則由 raidz 組件負責(zé)請求映射。圖 32 顯示了數(shù)據(jù)流向和層次關(guān)系,圖 32 中是一個由 7 個物理虛設(shè)備組成的雙容錯磁盤陣列。當寫請求到達, raidz將數(shù)據(jù)劃分為數(shù)據(jù)單元,并采用某種雙容錯編碼方案計算出兩個校驗單元,然后將這些條紋單元(包括數(shù)據(jù)和校驗)寫入物理虛設(shè)備。對于讀請求,只需映射到正確的物理虛設(shè)備,讀取數(shù)據(jù)單元 即可。當發(fā)生磁盤故障,校驗單元被用來重構(gòu)出丟失的數(shù)據(jù)單元。 r a i d z _ m a pr a i d z _ c o lr a i d z _ c o l r a i d z _ c o l r a i d z _ c o lr a i d z _ c o lr a i d z _ c o l編 碼Z I Ov d e v v d e v v d e vv d e v v d e v v d e vr a i d z 組 件r a i d z _ c o lv d e v 圖 32: raidz請求處理數(shù)據(jù)流向和層次關(guān)系 ZFS 維護兩個數(shù)據(jù)結(jié)構(gòu)來完成磁盤陣列的讀寫: raidz_col 描述一個條紋單元的相關(guān)信息,包括條紋單元在條紋中的下標、I/O請求大小、 I/O數(shù)據(jù)的指針、條紋單元的狀態(tài)等。 raidz_map 描述一個條紋的信息,包括這個條紋中的條紋單元個數(shù)、狀態(tài)、第一塊數(shù)據(jù)盤在條紋中的下標,以及每個條紋單元的首址。 typedef struct raidz_col { uint64_t rc_devidx。 /* 孩子虛設(shè)備下標 */ uint64_t rc_offset。 uint64_t rc_size。 /* 條紋單元大小 */ void *rc_data。 /* 條紋單元存儲的數(shù)據(jù) */ int rc_error。 /* 發(fā)生的 I/O 錯誤數(shù) */ uint8_t rc_tried。 uint8_t rc_skipped。 } raidz_col_t。 18 typedef struct raidz_map { uint64_t rm_cols。 /* 條紋單元個數(shù) */ uint64_t rm_bigcols。 /* 比較大的條紋單元個數(shù) */ uint64_t rm_asize。 /* 條紋大小 */ uint64_t rm_missingdata。 /* 無效的存放數(shù)據(jù)字的條紋單元數(shù) */ uint64_t rm_missingparity。 /* 無效的存放校驗字的條紋單元數(shù) */ uint64_t rm_firstdatacol。 /* 存放數(shù)據(jù)字的條紋單元在條紋中的下標 */ raidz_col_t rm_col[1]。 /* 條紋單元的句柄 */ } raidz_map_t。 此外, raidz 組件對外提供 6 個接口,其中和編碼密切相關(guān)的接口如下: I/O 啟動( vdev_raidz_io_start)接口 :該接口生成一個 raidz_map 結(jié)構(gòu)的實例。 zio 將記錄的數(shù)據(jù)條紋化引用方式傳遞給此 raidz_map 對象。然后,對條紋中數(shù)據(jù)部分(而非校驗盤數(shù)據(jù))進行修改。如果是寫操作,將調(diào)用處理陣列編碼的函數(shù),將校驗單元寫請求發(fā)送給子設(shè)備。如果是讀操作,則從對應(yīng)數(shù)據(jù)單元所在 leaf 虛設(shè)備進行讀取。 I/O 完成( vdev_raidz_io_done)接口 :該接口根據(jù)當前狀態(tài)決定重構(gòu)的策略:如果僅僅是校驗盤損壞,調(diào)用編碼函數(shù)重新編碼即可;否則需要調(diào)用解碼函數(shù),對于雙容錯陣列,分為三種情況,即依靠 P 盤解碼( Q 和一個數(shù)據(jù)盤損壞的情況)、依靠 Q 盤解碼( P 和一個數(shù)據(jù)盤損壞的情況)、依靠 P/Q 盤解碼(兩個數(shù)據(jù)盤損壞的情況)。如果任何方法均無法完成重構(gòu),將返回錯誤信息。如果收到的請求是寫操作,或者發(fā)現(xiàn)需要重構(gòu),那么就調(diào)用底層函數(shù),將條紋單元中的數(shù)據(jù)實際寫入對應(yīng)的 leaf 虛設(shè)備上。 實現(xiàn)中需要注意的問題 問題由來 傳統(tǒng)磁盤陣列對小數(shù)據(jù)寫的處理方式為“讀-修改-寫”策略( ReadModifyWrite, RMW),即首先讀取要更新的數(shù)據(jù)單元的舊有內(nèi)容和校驗單元的舊有內(nèi)容,然后結(jié)合更新數(shù)據(jù)計算出校驗單元的新內(nèi)容,最后將更新數(shù)據(jù)和校驗單元的新內(nèi)容寫入磁盤。對于小數(shù)據(jù), RMW 策略明顯優(yōu)于重構(gòu)寫 19 策略( Reconstruct Write,讀取不更新的數(shù)據(jù)單元來和更新數(shù)據(jù)一起計算出校驗單元的新內(nèi)容),但仍然需要 4 次磁盤操作才能完成一次寫請求。而且當寫操作過程中發(fā)生系統(tǒng)崩潰,就有可能造成同一條紋中數(shù)據(jù)單元和校驗單元的 不一致。 針對傳統(tǒng)磁盤陣列的這些缺點, ZFS 采用了寫請求聚合策略。即推遲寫請求的處理,將多個寫請求組合在一起,形成整條紋寫入磁盤,這樣即可解決小寫性能缺陷。但這一策略需要解決兩個問題。首先,傳統(tǒng)的用戶地址到磁盤陣列地址的映射為固定映射方式,數(shù)據(jù)更新應(yīng)覆蓋固定地址的舊數(shù)據(jù)。這樣,多個寫請求的覆蓋地址可能是不連續(xù)的,則無法組合為整條紋。為此, ZFS 采取了追加寫方式。即新數(shù)據(jù)并不覆蓋舊數(shù)據(jù),而是寫入新分配的磁盤空間中,而舊數(shù)據(jù)占用的空間會適時回收。這樣,只要將多個寫請求分配到同一條紋的地址中,即可實現(xiàn)整條紋寫。此 外,追加寫還可有效解決寫操作中系統(tǒng)崩潰造成的不一致問題。另一個問題是,若系統(tǒng)負載較輕,可能較長時間也無法組合出足夠大小的寫數(shù)據(jù)量。為此, ZFS 采用了可變條紋設(shè)計。即條紋長度(條紋單元數(shù))與條紋單元大小均是可變的,根據(jù)寫請求聚合情況動態(tài)確定。 ZFS 在請求聚合之后,形成的條紋大?。]算上校驗字條紋)為磁盤扇區(qū)大小( 512B)的整數(shù)倍,在 512B~ 128KB 之間,并不一定能夠被存放數(shù)據(jù)字的虛設(shè)備個數(shù)整除。于是, ZFS 進行了如下的處理。 /* 數(shù)據(jù)以 1unit_shift 為單位大小分成單元進行散布 */ /* dcols:所屬 top 節(jié)點下面的 leaf 虛設(shè)備的個數(shù) */ s = zioio_size unit_shift。 /* I/O 數(shù)據(jù)的大?。▎挝? 1unit_shift) */ q = s / (dcols nparity)。 r = s q * (dcols nparity)。 bc = (r == 0 ? 0 : r + nparity)。 /* 較大條紋單元個數(shù) */ acols = (q == 0 ? bc : dcols)。 /* 條紋單元個數(shù) */ for (c = 0。 c acols。 c++) { …… rmrm_col[c].rc_size = (q + (c bc)) unit_shift。 …… } 20 一種很可能的分布如圖 33。部分條紋單元是較大的條紋,其他是較小的條紋,圖 33 中將較小的條紋的不足的部分用陰影區(qū)域補足。上面的源碼中沒有標記含義的變量在圖 33 中均已標出。可以看到,這個策略盡量均勻分布數(shù)據(jù),未將全部“不足”部分分布在最后一個數(shù)據(jù)盤,這樣可以使不同數(shù)據(jù)盤的讀寫負載更為均衡。對于校驗盤而言,顯然 應(yīng)該是完整條紋單元大小。 由上述的分析可以看出, ZFS 很可能無法滿足 EVENODD 和 RDP 陣列碼對條紋單元大小的需求。為了滿足上述處理策略的需求,需要在標準 EVENODD和 RDP 編碼結(jié)構(gòu)的基礎(chǔ)上加以變化。 P a r i t y P P a r i t y QD a t a 0 D a t a 1 D a t a 2D a t a 3D a t a . . .q u n i t _ s h i f t1 u n i t _ s h i f trb ca c o l s圖 33: ZFS中條紋數(shù)據(jù)分布情況示意圖 解決方案 首先,這兩種陣列碼要求條紋單元大小為控制參數(shù)減 1 的整數(shù)倍(其中控制參數(shù)為素數(shù)),而且每個條紋單元大小均相同。對此的解決辦法是,在編碼 /解碼運算中,陰影區(qū)域視為全 0,因為 0 對異或運算 的結(jié)果不會有任何影響。 然后,另一個需要解決的問題是,標準 EVENODD 編碼結(jié)構(gòu)要求條紋長度為 p+2,標準 RDP 編碼結(jié)構(gòu)要求條紋長度為 p+1, p 為素數(shù) 。而系統(tǒng)實際配置中,構(gòu)成一個磁盤陣列 top 節(jié)點的 leaf 節(jié)點數(shù)可能不是這樣的規(guī)模。而且, ZFS采用寫請求聚合整條紋寫的策略,實際條紋長度還可能小于 leaf 節(jié)點數(shù)。我們可以采取“編碼縮減”技術(shù),來使這兩種陣列碼適應(yīng)變化的、非素數(shù)的條紋長度。即,預(yù)先選定一個較大的控制參數(shù) p,使 p+2( EVENODD) 或 p+1( RDP)大于可能出現(xiàn)的實際條紋長度。對于 ZFS 確定的實 際條紋長度 g( EVENODD: 21 g=p+2; RDP: g=p+1),刪除 多出的 數(shù)據(jù)單元(假定為全 0),顯然,這樣不會影響編碼的容錯能力和編碼 /解碼算法。 第三,由于編碼上下文的實現(xiàn)要求,第一校驗盤需要作為整個條紋的第一個條紋單元,第二校驗盤需要作為整個條紋的第二個條紋單元。因此實現(xiàn)的時候,也需要在這方面對標準的 EVENODD、 RDP 碼編碼、解碼方式進行相應(yīng)的調(diào)整。 綜合考慮到本小節(jié)提到的實現(xiàn)中需要注意的若干問題,以及第二章第五節(jié)提到的編碼實現(xiàn)的技巧,本文將在本章的第四節(jié)和第五節(jié)給出在 ZFS 上EVENODD 和 RDP 兩種陣列碼(編碼和解碼)的具體實現(xiàn)。對于解碼計算,由于只有一個數(shù)據(jù)盤數(shù)據(jù)丟失、只有校驗盤數(shù)據(jù)丟失、一個數(shù)據(jù)盤和對角線校驗盤數(shù)據(jù)丟失這三種情況的解碼實現(xiàn)非常簡單,把類似 RAID5 的解碼和相應(yīng)的RAID6 編碼過程進行組合即可完成。因此解碼的部分,本文只具體給出一個數(shù)據(jù)盤行校驗盤數(shù)據(jù)丟失、兩個數(shù)據(jù)盤數(shù)據(jù)丟失這兩種情況的實現(xiàn)。 EVENODD碼在 ZFS 中的實現(xiàn) 編碼 對圖 21 所示的編碼方案,結(jié)合 ZFS 條紋情況,采用如下的實現(xiàn)策略。 圖 33 中每列數(shù)據(jù)從上到下分為三個部分:第一部分(參與標 記為 x ~ p2的校驗組)需要計算到行校驗列和對角線校驗列中,第二部分(參與標記為 p1的校驗組)需要計算到行校驗列和 S 中,第三部分(該列的剩余部分)需要計算到行校驗列和對角線校驗列中。并且,陰影區(qū)域不參加計算。 最終,再將 S 計算到對角線校驗列中。編碼完畢。 整個過程用偽代碼表示如下: /* 算法 31: EVENODD 編碼算法 */ packet_size ? 數(shù)據(jù)塊大小 rcount ? dcount ?校驗列條紋單元大小 r ? 行校驗列的數(shù)據(jù)首地址 d ? 對角線校驗列的數(shù)據(jù)首地址 22 ccount ? 第一塊數(shù)據(jù)列的條紋單元大小 src? 第一塊數(shù)據(jù)列的數(shù)據(jù)首地址 r [0..ccount] ? d[0..ccount] ?src[0..ccount] For c In 3 to 條紋單元個數(shù) 1 Do doffset ? (c 2) * packet_size ccount ? 當前條紋單元大小 src ? 當前條紋單元數(shù)據(jù)首地址 i ? 0 j ? doffset While i ccount And j dcount Do r[i] ? r[i] Xor src[i] d[j] ? d[j] Xor src[i] i ? i + 1 j? j + 1 j ? 0 While i ccount And j p
點擊復(fù)制文檔內(nèi)容
畢業(yè)設(shè)計相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1