亚洲狠狠干,亚洲国产福利精品一区二区,国产八区,激情文学亚洲色图

在用戶空間文件系統(tǒng)上實(shí)現(xiàn)聚合寫文件臟頁的方法和裝置的制作方法

文檔序號:6434912閱讀:164來源:國知局
專利名稱:在用戶空間文件系統(tǒng)上實(shí)現(xiàn)聚合寫文件臟頁的方法和裝置的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及Linux操作系統(tǒng)的文件訪問技術(shù),尤其涉及一種在用戶空間文件系統(tǒng) (fuse, filesystem in usese space)上實(shí)現(xiàn)聚合寫文件臟頁的方法和裝置。
背景技術(shù)
在基于Linux操作系統(tǒng)實(shí)現(xiàn)的用戶態(tài)分布式文件系統(tǒng)應(yīng)用中,需要向用戶提供通常的標(biāo)準(zhǔn)的文件訪問接口。用戶不需要知道底層是本地文件系統(tǒng)還是分布式文件系統(tǒng),都可以通過文件系統(tǒng)掛載點(diǎn)以統(tǒng)一的方式訪問。這通常是由用戶態(tài)文件系統(tǒng)模塊fuse來實(shí)現(xiàn)的。fuse駐留在Linux內(nèi)核,接收用戶進(jìn)程的文件訪問消息,封裝成fuse消息傳遞給用戶態(tài)文件系統(tǒng)的守護(hù)進(jìn)程。目前的fuse實(shí)現(xiàn)基本滿足了一般應(yīng)用的功能性需求,但難以滿足企業(yè)級、電信級分布式文件系統(tǒng)的性能需求,尤其在以內(nèi)存映射方式(mmap)大批量寫文件數(shù)據(jù)的時候。在用內(nèi)存映射方式寫文件數(shù)據(jù)時,用戶進(jìn)程首先打開一個文件,然后把文件空間映射到內(nèi)存地址空間,接著向內(nèi)存地址空間寫入數(shù)據(jù),最后解除映射和關(guān)閉文件。寫入的數(shù)據(jù)首先存儲在Linux內(nèi)核的頁緩存里。Linux系統(tǒng)會自動把更改過的數(shù)據(jù)頁標(biāo)記為臟頁。在解除內(nèi)存映射關(guān)閉文件時調(diào)用頁寫(writepage)函數(shù)把每個臟頁封裝成一個fuse消息傳送給用戶態(tài)文件系統(tǒng)守護(hù)進(jìn)程。在這種方式下,每一頁大小的數(shù)據(jù)就會產(chǎn)生一個fuse消息。在Linux上,一個頁一般是4KB大小。在寫幾十MB以上的大文件的時候,會產(chǎn)生非常多的fuse消息,增加了每次消息交互產(chǎn)生的附加代價,極大地消耗系統(tǒng)的中央處理器(CPU)資源,傳輸效率極為低下。

發(fā)明內(nèi)容
有鑒于此,本發(fā)明的主要目的在于提供一種在fuse上實(shí)現(xiàn)聚合寫文件臟頁的方法和裝置,減少fuse消息數(shù)量,節(jié)省系統(tǒng)的CPU資源,提高傳輸效率。為達(dá)到上述目的,本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的一種在用戶空間文件系統(tǒng)(fuse)上實(shí)現(xiàn)聚合寫文件臟頁的方法,包括fuse獲取臟頁數(shù)組;檢查臟頁數(shù)組中連續(xù)的臟頁,將連續(xù)的臟頁通過一個fuse消息傳遞給用戶態(tài)文件系統(tǒng)的守護(hù)進(jìn)程。所述fuse獲取臟頁數(shù)組為定義原型為頁寫函數(shù)(writ印ages)的函數(shù)fuse_ writepages,函數(shù)fuse_Writ印ages根據(jù)輸入?yún)?shù),確定文件寫的起始頁號和結(jié)束頁號;清除文件寫完成標(biāo)識,調(diào)用查找函數(shù)(pagevecjookupjag),并輸入起始頁號和結(jié)束頁號,將帶有臟頁標(biāo)志PAGEE_TAG_DCACHIRTY的頁,按頁號從小到大的順序組成臟頁數(shù)組存儲在臟頁存儲數(shù)組(pvec)中。所述檢查臟頁數(shù)組中連續(xù)的臟頁,將連續(xù)的臟頁通過一個fuse消息傳遞給用戶態(tài)文件系統(tǒng)的守護(hù)進(jìn)程為fuse依次檢查臟頁數(shù)組中的每一頁,根據(jù)臟頁數(shù)組中第一個臟頁的頁號設(shè)置連續(xù)號變量,并在將第一個臟頁的頁地址加入到fuse消息的頁數(shù)組中之后,通過連續(xù)號變量確定與第一個臟頁連續(xù)的臟頁,將確定的連續(xù)的臟頁也加入到所述fuse 消息的頁數(shù)組中,通過所述fuse消息將所述頁數(shù)組傳遞給用戶態(tài)文件系統(tǒng)的守護(hù)進(jìn)程。所述方法進(jìn)一步包括預(yù)先設(shè)置最大臟頁數(shù),當(dāng)fuse消息的頁數(shù)組中臟頁頁數(shù)達(dá)到最大臟頁數(shù)時,不再繼續(xù)確定連續(xù)臟頁,將該fuse消息傳遞給用戶態(tài)文件系統(tǒng)的守護(hù)進(jìn)程。一種在fuse上實(shí)現(xiàn)聚合 寫文件臟頁的裝置,包括獲取模塊、檢查模塊、傳遞模塊;其中,獲取模塊,用于獲取臟頁數(shù)組;檢查模塊,用于檢查臟頁數(shù)組中連續(xù)的臟頁,將連續(xù)的臟頁發(fā)送到傳遞模塊;傳遞模塊,用于將連續(xù)的臟頁通過一個fuse消息傳遞給用戶態(tài)文件系統(tǒng)的守護(hù)進(jìn)程。所述獲取模塊,具體用于定義原型為writ印ages的函數(shù)fuse_writ印ages,函數(shù)fuse_writepages根據(jù)輸入?yún)?shù)wbc,確定文件寫的起始頁號和結(jié)束頁號;清除文件寫完成標(biāo)識,調(diào)用pagevecjookupjag函數(shù),并輸入起始頁號和結(jié)束頁號,將帶有臟頁標(biāo)志 PAGEE_TAG_DCACHIRTY的頁,按頁號從小到大的順序組成臟頁數(shù)組存儲在pvec中。所述檢查模塊,具體用于依次檢查臟頁數(shù)組中的每一頁,根據(jù)臟頁數(shù)組中第一個臟頁的頁號設(shè)置連續(xù)號變量,并將第一個臟頁的頁地址通知傳遞模塊,通過連續(xù)號變量確定與第一個臟頁連續(xù)的臟頁,將確定的連續(xù)的臟頁的頁地址通知傳遞模塊。所述傳遞模塊,具體用于將所述檢查模塊通知的臟頁的頁地址加入到fuse消息的頁數(shù)組中,通過所述fuse消息將所述頁數(shù)組傳遞給用戶態(tài)文件系統(tǒng)的守護(hù)進(jìn)程。所述傳遞模塊,進(jìn)一步用于設(shè)置最大臟頁數(shù),當(dāng)fuse消息的頁數(shù)組中臟頁頁數(shù)達(dá)到最大臟頁數(shù)時,通知檢查模塊不再繼續(xù)確定連續(xù)臟頁,將所述fuse消息傳遞給用戶態(tài)文件系統(tǒng)的守護(hù)進(jìn)程。本發(fā)明提供了一種在fuse上實(shí)現(xiàn)聚合寫文件臟頁的方法和裝置,fuse獲取臟頁數(shù)組;檢查臟頁數(shù)組中連續(xù)的臟頁,將連續(xù)的臟頁通過一個fuse消息傳遞給用戶態(tài)文件系統(tǒng)的守護(hù)進(jìn)程;如此,能夠減少fuse消息數(shù)量,節(jié)省系統(tǒng)的CPU資源,提高傳輸效率。


圖1為本發(fā)明在fuse上實(shí)現(xiàn)聚合寫文件臟頁的方法的流程示意圖;圖2為本發(fā)明在fuse上實(shí)現(xiàn)聚合寫文件臟頁的方法中,步驟102的實(shí)例示意圖;圖3為本發(fā)明在fuse上實(shí)現(xiàn)聚合寫文件臟頁的裝置的結(jié)構(gòu)示意圖。
具體實(shí)施例方式本發(fā)明的基本思想是fUSe獲取臟頁數(shù)組;檢查臟頁數(shù)組中連續(xù)的臟頁,將連續(xù)的臟頁通過一個fuse消息傳遞給用戶態(tài)文件系統(tǒng)的守護(hù)進(jìn)程。下面通過附圖及具體實(shí)施例對本發(fā)明做進(jìn)一步的詳細(xì)說明。本發(fā)明實(shí)現(xiàn)一種在fuse上實(shí)現(xiàn)聚合寫文件臟頁的方法,如圖1所示,該方法包括以下幾個步驟步驟101 :fuse獲取臟頁數(shù)組;
具體的,在類型為 address_space_operations 的結(jié)構(gòu)體 fuse_file_aops 添加成員賦值語句.writepages = fuse_writepages ;定義原型為writ印ages的函數(shù)fuse_writ印ages,其輸入?yún)?shù)為mapping 要操作的文件的地址空間結(jié)構(gòu)address_space ;wbc 寫回控制結(jié)構(gòu) writeback_control ; 函數(shù)fuse_Writ印ages根據(jù)輸入?yún)?shù)wbc,確定文件寫的起始頁號index和結(jié)束頁號end ;清除文件寫完成標(biāo)識,調(diào)用查找函數(shù)(pagevecjookupjag),并輸入起始頁號 index和結(jié)束頁號end,將帶有臟頁標(biāo)志PAGEE_TAG_DCACHIRTY的頁,按頁號從小到大的順序組成臟頁數(shù)組存儲在臟頁存儲數(shù)組(pvec,dirty page vector)中。步驟102 :fuse檢查臟頁數(shù)組中連續(xù)的臟頁,將連續(xù)的臟頁通過一個fuse消息傳遞給用戶態(tài)文件系統(tǒng)的守護(hù)進(jìn)程;具體的,fuse根據(jù)臟頁數(shù)組中第一個臟頁的頁號設(shè)置連續(xù)號變量,并在將第一個臟頁的頁地址加入到fuse消息的頁數(shù)組中之后,通過連續(xù)號變量確定與第一個臟頁連續(xù)的臟頁,將確定的連續(xù)的臟頁也加入到fuse消息的頁數(shù)組中,通過所述fuse消息將所述頁數(shù)組傳遞給用戶態(tài)文件系統(tǒng)的守護(hù)進(jìn)程;下面對本步驟的流程進(jìn)行詳細(xì)描述fuse調(diào)用fuse_get_req函數(shù)申請一個req消息對象,設(shè)置其屬性in. argpages =l,page_offset = 0 ;設(shè)置連續(xù)號變量 seq 為 pvec. pages
- > indexf-l,其中 indexf 為臟頁數(shù)組中的第一個臟頁的頁號,臟頁數(shù)組中最后一頁的頁號用endf表示;從pvec. pages
開始依次檢查pvec中臟頁數(shù)組的每一頁,對檢查的當(dāng)前頁做下列操作a、判斷頁號是否大于endf,如果大于endf,則設(shè)置文件寫完成標(biāo)識,執(zhí)行步驟h ; 否則執(zhí)行步驟b ;b、調(diào)用loCk_page鎖住當(dāng)前頁,根據(jù)是否有臟頁標(biāo)志PAGEE_TAG_DCACHIRTY判斷當(dāng)前頁是否已不是臟頁,如果已不是臟頁,解除鎖定當(dāng)前頁并執(zhí)行步驟h ;否則執(zhí)行步驟c ;C、判斷當(dāng)前頁指向的地址空間是否是當(dāng)前地址空間,如果不是,則解除鎖定當(dāng)前頁并執(zhí)行步驟h ;否則執(zhí)行步驟d ;d、判斷當(dāng)前頁是否處于寫回狀態(tài),如果是,則解除鎖定當(dāng)前頁并執(zhí)行步驟h;否則執(zhí)行步驟e ;e、判斷當(dāng)前頁的頁號是否等于連續(xù)號變量seq+Ι,如果不等于,則解除鎖定當(dāng)前頁并執(zhí)行步驟h;否則執(zhí)行步驟f; f、調(diào)用clear_page_dirty_for_io函數(shù)清除當(dāng)前頁的臟頁標(biāo)志PAGEE_TAG_ DCACHIRTY ;如果清除失敗,則解除鎖定當(dāng)前頁并執(zhí)行步驟h ;否則執(zhí)行步驟g ;g、調(diào)用page_cache_get增加當(dāng)前頁的緩存計數(shù),調(diào)用set_page_writeback函數(shù)為當(dāng)前頁設(shè)置頁寫回狀態(tài),并填寫頁地址到req的頁數(shù)組,增加req的頁數(shù),獲取臟頁數(shù)組中的下一頁,執(zhí)行步驟a;h、判斷req的頁數(shù)是否大于0,如果大于0,則調(diào)用fuse_send_writ印ages函數(shù)將 req的頁數(shù)組中的臟頁通過req消息傳遞給用戶態(tài)文件系統(tǒng)的守護(hù)進(jìn)程,執(zhí)行步驟i ;否則直接執(zhí)行步驟i ;步驟h中,在req的頁數(shù)大于1時,說明req的頁數(shù)組中的一個以上臟頁是連續(xù)的,這樣就能夠通過一個req消息傳遞多個臟頁。i、調(diào)用pagevec_releasse函數(shù)釋放pvec,調(diào)用cond_resched函數(shù),重新執(zhí)行步驟 101。步 驟102中,進(jìn)一步包括預(yù)先設(shè)置最大臟頁數(shù),用于限制一個fuse消息傳遞的連續(xù)臟頁的數(shù)量,即當(dāng)fuse消息的頁數(shù)組中臟頁頁數(shù)達(dá)到最大臟頁數(shù)時,不再繼續(xù)確定連續(xù)臟頁,將該fuse消息傳遞給用戶態(tài)文件系統(tǒng)的守護(hù)進(jìn)程,如在步驟g中所述增加req的頁數(shù)之后,判斷req的頁數(shù)是否等于最大臟頁數(shù),如果的等于,則執(zhí)行步驟h,如果不等于,再獲取臟頁數(shù)組中的下一頁,執(zhí)行步驟a。下面通過一個具體實(shí)例來說明本步驟。如圖2所示,文件的地址空間(addressspace)的當(dāng)前臟頁數(shù)組中有6個臟頁,頁號分別為1、2、3、6、9、10。如果用現(xiàn)有的方法,當(dāng)寫回該文件時,會對每個臟頁生成一個req 消息,共6個req消息。應(yīng)用步驟102的方法,能夠確定出頁號為1、2、3的臟頁連續(xù),可以生成一個req消息Reql,將頁號為1、2、3的臟頁的頁地址加入到Reql的頁數(shù)組中;通過獲取臟頁數(shù)組后, 臟頁數(shù)組中有3個臟頁,頁號分別為6、9、10,確定出頁號為6的臟頁沒有連續(xù)的臟頁,生成一個req消息Req2,將頁號為6的臟頁的頁地址加入到Req2的頁數(shù)組中;通過獲取臟頁數(shù)組后,臟頁數(shù)組中有2個臟頁,頁號分別為9、10,確定出頁號為9和10的臟頁連續(xù),生成一個req消息Req3,將頁號為9、10的臟頁的頁地址加入到Req3的頁數(shù)組中,這樣,一共只需生成3個req消息,消息數(shù)可以減少一半。為了實(shí)現(xiàn)上述方法,本發(fā)明還提供一種在fuse上實(shí)現(xiàn)聚合寫文件臟頁的裝置,如圖3所示,該裝置包括獲取模塊31、檢查模塊32、傳遞模塊33 ;其中,獲取模塊31,用于獲取臟頁數(shù)組;檢查模塊32,用于檢查臟頁數(shù)組中連續(xù)的臟頁,將連續(xù)的臟頁發(fā)送到傳遞模塊 33 ;傳遞模塊33,用于將連續(xù)的臟頁通過一個fuse消息傳遞給用戶態(tài)文件系統(tǒng)的守護(hù)進(jìn)程;所述獲取模塊31,具體用于定義原型為writ印ages的函數(shù)fuse_writ印ages,函數(shù)fuse_Writ印ages根據(jù)輸入?yún)?shù)wbc,確定文件寫的起始頁號index和結(jié)束頁號end ;清除文件寫完成標(biāo)識,調(diào)用pageveC_l00kup_tag函數(shù),并輸入起始頁號index和結(jié)束頁號 end,將帶有臟頁標(biāo)志PAGEE_TAG_DCACHIRTY的頁,按頁號從小到大的順序組成臟頁數(shù)組存儲在pvec中;所述檢查模塊32,具體用于依次檢查臟頁數(shù)組中的每一頁,根據(jù)臟頁數(shù)組中第一個臟頁的頁號設(shè)置連續(xù)號變量,并將第一個臟頁的頁地址通知傳遞模塊33,通過連續(xù)號變量確定與第一個臟頁連續(xù)的臟頁,將確定的連續(xù)的臟頁的頁地址通知傳遞模塊33 ;所述傳遞模塊33,具體用于將所述檢查模塊32通知的臟頁的頁地址加入到fuse 消息的頁數(shù)組中,通過所述fuse消息將所述頁數(shù)組傳遞給用戶態(tài)文件系統(tǒng)的守護(hù)進(jìn)程;所述傳遞模塊33,進(jìn)一步用于設(shè)置最大臟頁數(shù),當(dāng)fuse消息的頁數(shù)組中臟頁頁數(shù)達(dá)到最大臟頁數(shù)時,通知檢查模塊32不再繼續(xù)確定連續(xù)臟頁,將所述fuse消息傳遞給用戶態(tài)文件系統(tǒng)的守護(hù)進(jìn)程。
以 上所述,僅為本發(fā)明的較佳實(shí)施例而已,并非用于限定本發(fā)明的保護(hù)范圍。
權(quán)利要求
1.一種在用戶空間文件系統(tǒng)(fuse)上實(shí)現(xiàn)聚合寫文件臟頁的方法,其特征在于,該方法包括fuse獲取臟頁數(shù)組;檢查臟頁數(shù)組中連續(xù)的臟頁,將連續(xù)的臟頁通過一個fuse消息傳遞給用戶態(tài)文件系統(tǒng)的守護(hù)進(jìn)程。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述fuse獲取臟頁數(shù)組為定義原型為頁寫函數(shù)(writepages)的函數(shù) fuse_writepages,函數(shù) fuse_writepages 根據(jù)輸入?yún)?shù),確定文件寫的起始頁號和結(jié)束頁號;清除文件寫完成標(biāo)識,調(diào)用查找函數(shù)(pagevec_l00kup_tag),并輸入起始頁號和結(jié)束頁號,將帶有臟頁標(biāo)志PAGEE_TAG_ DCACHIRTY的頁,按頁號從小到大的順序組成臟頁數(shù)組存儲在臟頁存儲數(shù)組(pvec)中。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述檢查臟頁數(shù)組中連續(xù)的臟頁,將連續(xù)的臟頁通過一個fuse消息傳遞給用戶態(tài)文件系統(tǒng)的守護(hù)進(jìn)程為fuse依次檢查臟頁數(shù)組中的每一頁,根據(jù)臟頁數(shù)組中第一個臟頁的頁號設(shè)置連續(xù)號變量,并在將第一個臟頁的頁地址加入到fuse消息的頁數(shù)組中之后,通過連續(xù)號變量確定與第一個臟頁連續(xù)的臟頁,將確定的連續(xù)的臟頁也加入到所述fuse消息的頁數(shù)組中,通過所述fuse消息將所述頁數(shù)組傳遞給用戶態(tài)文件系統(tǒng)的守護(hù)進(jìn)程。
4.根據(jù)權(quán)利要求3所述的方法,其特征在于,該方法進(jìn)一步包括預(yù)先設(shè)置最大臟頁數(shù),當(dāng)fuse消息的頁數(shù)組中臟頁頁數(shù)達(dá)到最大臟頁數(shù)時,不再繼續(xù)確定連續(xù)臟頁,將該 fuse消息傳遞給用戶態(tài)文件系統(tǒng)的守護(hù)進(jìn)程。
5.一種在fuse上實(shí)現(xiàn)聚合寫文件臟頁的裝置,其特征在于,該裝置包括獲取模塊、檢查模塊、傳遞模塊;其中,獲取模塊,用于獲取臟頁數(shù)組;檢查模塊,用于檢查臟頁數(shù)組中連續(xù)的臟頁,將連續(xù)的臟頁發(fā)送到傳遞模塊;傳遞模塊,用于將連續(xù)的臟頁通過一個fuse消息傳遞給用戶態(tài)文件系統(tǒng)的守護(hù)進(jìn)程。
6.根據(jù)權(quán)利要求5所述的裝置,其特征在于,所述獲取模塊,具體用于定義原型為 writepages的函數(shù)fuse_writepages,函數(shù)fuse_writepages根據(jù)輸入?yún)?shù)wbc,石角定文件寫的起始頁號和結(jié)束頁號;清除文件寫完成標(biāo)識,調(diào)用pagevecjookupjag函數(shù),并輸入起始頁號和結(jié)束頁號,將帶有臟頁標(biāo)志PAGEE_TAG_DCACHIRTY的頁,按頁號從小到大的順序組成臟頁數(shù)組存儲在pvec中。
7.根據(jù)權(quán)利要求6所述的裝置,其特征在于,所述檢查模塊,具體用于依次檢查臟頁數(shù)組中的每一頁,根據(jù)臟頁數(shù)組中第一個臟頁的頁號設(shè)置連續(xù)號變量,并將第一個臟頁的頁地址通知傳遞模塊,通過連續(xù)號變量確定與第一個臟頁連續(xù)的臟頁,將確定的連續(xù)的臟頁的頁地址通知傳遞模塊。
8.根據(jù)權(quán)利要求7所述的裝置,其特征在于,所述傳遞模塊,具體用于將所述檢查模塊通知的臟頁的頁地址加入到fuse消息的頁數(shù)組中,通過所述fuse消息將所述頁數(shù)組傳遞給用戶態(tài)文件系統(tǒng)的守護(hù)進(jìn)程。
9.根據(jù)權(quán)利要求8所述的裝置,其特征在于,所述傳遞模塊,進(jìn)一步用于設(shè)置最大臟頁數(shù),當(dāng)fuse消息的頁數(shù)組中臟頁頁數(shù)達(dá)到最大臟頁數(shù)時,通知檢查模塊不再繼續(xù)確定連續(xù)臟頁,將所述fuse消息傳遞給用戶態(tài)文件系統(tǒng)的守護(hù)進(jìn)程。
全文摘要
本發(fā)明公開了一種在用戶空間文件系統(tǒng)(fuse)上實(shí)現(xiàn)聚合寫文件臟頁的方法,fuse獲取臟頁數(shù)組;檢查臟頁數(shù)組中連續(xù)的臟頁,將連續(xù)的臟頁通過一個fuse消息傳遞給用戶態(tài)文件系統(tǒng)的守護(hù)進(jìn)程;本發(fā)明同時還公開了一種在fuse上實(shí)現(xiàn)聚合寫文件臟頁的裝置,通過本發(fā)明的方案,能夠減少fuse消息數(shù)量,節(jié)省系統(tǒng)的CPU資源,提高傳輸效率。
文檔編號G06F17/30GK102360369SQ201110302148
公開日2012年2月22日 申請日期2011年9月28日 優(yōu)先權(quán)日2011年9月28日
發(fā)明者何抗洪, 朱鵬, 程寧 申請人:中興通訊股份有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1