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

正文內(nèi)容

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

2025-06-07 05:28本頁面
  

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