一種基于嵌入式文件系統(tǒng)的流式數(shù)據(jù)寫(xiě)入方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及數(shù)據(jù)存儲(chǔ)技術(shù)領(lǐng)域,尤其涉及一種基于嵌入式文件系統(tǒng)的流式數(shù)據(jù)寫(xiě)入方法。
【背景技術(shù)】
[0002]隨著互聯(lián)網(wǎng)的迅速發(fā)展,存儲(chǔ)技術(shù)及各種存儲(chǔ)系統(tǒng)也得到了飛速發(fā)展,這些存儲(chǔ)系統(tǒng)為大量的互聯(lián)網(wǎng)信息及多媒體數(shù)據(jù)信息提供了方便、快速、高效的存儲(chǔ)及訪問(wèn)服務(wù)。
[0003]嵌入式系統(tǒng)是一種完全嵌入受控器件內(nèi)部,為特定應(yīng)用而設(shè)計(jì)的專(zhuān)用計(jì)算機(jī)系統(tǒng),嵌入式系統(tǒng)資源有限,結(jié)構(gòu)簡(jiǎn)單,鑒于其特殊性和專(zhuān)用性,很少在嵌入式系統(tǒng)中采用通用的操作系統(tǒng)和文件系統(tǒng),而是針對(duì)特定應(yīng)用場(chǎng)景為嵌入式系統(tǒng)定制文件系統(tǒng)。可嵌入式系統(tǒng)的應(yīng)用范圍非常廣泛,不可能有一種文件系統(tǒng)在所有嵌入式系統(tǒng)中一統(tǒng)天下,適用于大到嵌入式服務(wù)器,小到嵌入式機(jī)頂盒的所有情況,而是根據(jù)系統(tǒng)應(yīng)用環(huán)境和目標(biāo)等來(lái)選擇構(gòu)建合適的文件系統(tǒng)。
[0004]文件系統(tǒng)寫(xiě)入數(shù)據(jù)的速率一方面取決于底層寫(xiě)接口的1性能,另一方面取決于文件系統(tǒng)自身的緩存策略和內(nèi)部機(jī)制,而文件系統(tǒng)寫(xiě)入數(shù)據(jù)的并發(fā)能力則與其調(diào)度機(jī)制有關(guān)。
[0005]現(xiàn)有技術(shù)中,用戶調(diào)用通用文件系統(tǒng)的1接口寫(xiě)入數(shù)據(jù),而寫(xiě)入過(guò)程中文件系統(tǒng)的緩存策略和調(diào)度機(jī)制用戶無(wú)從知曉也不可控制,而文件系統(tǒng)寫(xiě)入數(shù)據(jù)時(shí)往往并沒(méi)有充分利用硬件資源,從而導(dǎo)致了數(shù)據(jù)寫(xiě)入磁盤(pán)的效率和吞吐不夠高、并發(fā)性能不夠強(qiáng)的問(wèn)題。
【發(fā)明內(nèi)容】
[0006]本發(fā)明實(shí)施例提供了一種基于嵌入式文件系統(tǒng)的流式數(shù)據(jù)寫(xiě)入方法,以解決現(xiàn)有技術(shù)中存在的數(shù)據(jù)寫(xiě)入效率低下、吞吐和并發(fā)性能不夠高的問(wèn)題。
[0007]為了實(shí)現(xiàn)上述目的,本申請(qǐng)實(shí)施例提供了一種基于嵌入式文件系統(tǒng)的流式數(shù)據(jù)寫(xiě)入方法,所述方法包括:
[0008]接收待寫(xiě)入磁盤(pán)的流式數(shù)據(jù);
[0009]將接收的流式數(shù)據(jù)以鏈表結(jié)構(gòu)進(jìn)行組織,并將所述流式數(shù)據(jù)緩存于存儲(chǔ)區(qū),當(dāng)緩存的流式數(shù)據(jù)的長(zhǎng)度達(dá)到設(shè)定的閾值時(shí),觸發(fā)將緩存的流式數(shù)據(jù)寫(xiě)入磁盤(pán)的寫(xiě)操作;
[0010]從緩存中分離流式數(shù)據(jù):
[0011]查詢所述文件的元數(shù)據(jù),獲取存儲(chǔ)文件內(nèi)容的磁盤(pán)位置信息,根據(jù)所述磁盤(pán)位置信息,計(jì)算本次欲寫(xiě)入磁盤(pán)的流式數(shù)據(jù)長(zhǎng)度,所述長(zhǎng)度須為磁盤(pán)扇區(qū)大小的整數(shù)倍,且對(duì)應(yīng)區(qū)段的數(shù)據(jù)在物理上和邏輯上均保持連續(xù);
[0012]從緩存中取出所述長(zhǎng)度的流式數(shù)據(jù),取出數(shù)據(jù)的操作實(shí)則從緩存數(shù)據(jù)的鏈表中分離出一個(gè)所述長(zhǎng)度的子鏈表:根據(jù)所述長(zhǎng)度找到分離節(jié)點(diǎn),從所述分離節(jié)點(diǎn)處截取流式數(shù)據(jù),分離后的子鏈表對(duì)應(yīng)的數(shù)據(jù)長(zhǎng)度應(yīng)與本次欲寫(xiě)入磁盤(pán)的流式數(shù)據(jù)長(zhǎng)度相等;
[0013]將分離出的流式數(shù)據(jù)寫(xiě)入磁盤(pán);
[0014]調(diào)用下層寫(xiě)接口將分離出的流式數(shù)據(jù)寫(xiě)入磁盤(pán),寫(xiě)入數(shù)據(jù)時(shí)采用異步非阻塞模式,而非阻塞在將數(shù)據(jù)寫(xiě)入磁盤(pán)的過(guò)程中,待文件系統(tǒng)收到數(shù)據(jù)寫(xiě)入磁盤(pán)成功的消息后,嘗試觸發(fā)下一次寫(xiě)操作。
[0015]優(yōu)選地,所述接收待寫(xiě)入磁盤(pán)的流式數(shù)據(jù)之前,所述方法還包括:
[0016]接收到一個(gè)新的流式數(shù)據(jù)寫(xiě)入請(qǐng)求后,判斷系統(tǒng)中是否存在所述文件;
[0017]如果不存在,則需要請(qǐng)求方手動(dòng)建立所述文件;
[0018]如果存在,則為所述請(qǐng)求新建一個(gè)寫(xiě)任務(wù),獲取所述文件的元數(shù)據(jù),并為所述任務(wù)分配存儲(chǔ)空間。
[0019]優(yōu)選地,所述寫(xiě)請(qǐng)求的參數(shù)包括文件名、寫(xiě)入文件的起始偏移和寫(xiě)入文件的結(jié)束偏移。
[0020]優(yōu)選地,所述方法還包括:
[0021]為所述寫(xiě)請(qǐng)求建立寫(xiě)任務(wù),為所述寫(xiě)任務(wù)分配任務(wù)空間,將所述文件名的哈希值、待寫(xiě)入數(shù)據(jù)的起始偏移和待寫(xiě)入數(shù)據(jù)的結(jié)束偏移存入所述任務(wù)空間。
[0022]優(yōu)選地,所述方法還包括對(duì)任務(wù)進(jìn)行預(yù)處理:
[0023]如果所述待寫(xiě)入流式數(shù)據(jù)的起始偏移對(duì)應(yīng)于磁盤(pán)扇區(qū)(頭扇區(qū))中的位置不在扇區(qū)頭,則從磁盤(pán)中讀出頭扇區(qū)數(shù)據(jù)并緩存;如果所述待寫(xiě)入流式數(shù)據(jù)的結(jié)束偏移對(duì)應(yīng)于磁盤(pán)扇區(qū)(尾扇區(qū))中的位置不在扇區(qū)尾,則從磁盤(pán)中讀出尾扇區(qū)數(shù)據(jù)并緩存。
[0024]優(yōu)選地,將分離出的流式數(shù)據(jù)寫(xiě)入磁盤(pán),所述方法還包括:
[0025]計(jì)算當(dāng)前寫(xiě)操作對(duì)應(yīng)的起始偏移和結(jié)束偏移;
[0026]如果所述當(dāng)前寫(xiě)操作對(duì)應(yīng)的起始偏移等于寫(xiě)任務(wù)的起始偏移,則所述當(dāng)前寫(xiě)操作為第一次寫(xiě)操作;如果所述當(dāng)前寫(xiě)操作對(duì)應(yīng)的結(jié)束偏移等于寫(xiě)任務(wù)的結(jié)束偏移,則當(dāng)前寫(xiě)操作為最后一次寫(xiě)操作。
[0027]優(yōu)選地,執(zhí)行第一次寫(xiě)操作時(shí),所述方法還包括:
[0028]當(dāng)?shù)谝淮螌?xiě)操作對(duì)應(yīng)的起始偏移對(duì)應(yīng)于磁盤(pán)扇區(qū)中的位置不為扇區(qū)頭時(shí),則將第一次寫(xiě)操作對(duì)應(yīng)的起始偏移與扇區(qū)頭對(duì)齊,并利用緩存的頭扇區(qū)數(shù)據(jù)填充第一次寫(xiě)操作中擴(kuò)充的數(shù)據(jù)。
[0029]優(yōu)選地,執(zhí)行最后一次寫(xiě)操作時(shí),所述方法還包括:
[0030]當(dāng)最后一次寫(xiě)操作對(duì)應(yīng)的結(jié)束偏移對(duì)應(yīng)于磁盤(pán)扇區(qū)中的位置不為扇區(qū)尾時(shí),則將最后一次寫(xiě)操作對(duì)應(yīng)的結(jié)束偏移與扇區(qū)尾對(duì)齊,并利用緩存的尾扇區(qū)數(shù)據(jù)填充最后一次寫(xiě)操作擴(kuò)充的數(shù)據(jù)。
[0031]優(yōu)選地,執(zhí)行寫(xiě)操作時(shí),從緩存的流式數(shù)據(jù)中取出指定長(zhǎng)度的待寫(xiě)數(shù)據(jù),具體包括:
[0032]根據(jù)當(dāng)次寫(xiě)操作欲寫(xiě)入磁盤(pán)的數(shù)據(jù)長(zhǎng)度,找到分離節(jié)點(diǎn),將緩存流式數(shù)據(jù)的鏈表從分離節(jié)點(diǎn)后截?cái)?,?fù)制所述分離點(diǎn),將復(fù)制的分離點(diǎn)作為剩余鏈表的頭結(jié)點(diǎn),調(diào)整原始分離節(jié)點(diǎn)和復(fù)制分離點(diǎn)中的數(shù)據(jù)起始偏移和數(shù)據(jù)長(zhǎng)度。
[0033]優(yōu)選地,文件系統(tǒng)收到上一批數(shù)據(jù)寫(xiě)入磁盤(pán)成功的消息后,所述方法還包括:
[0034]寫(xiě)操作既可在緩存的數(shù)據(jù)量達(dá)到設(shè)定閾值時(shí)被觸發(fā),也可由數(shù)據(jù)寫(xiě)入磁盤(pán)成功的消息觸發(fā),兩種觸發(fā)方式通過(guò)任務(wù)鎖進(jìn)行互斥,確保同一時(shí)間只有一個(gè)寫(xiě)任務(wù)被觸發(fā);
[0035]當(dāng)文件系統(tǒng)收到上一批數(shù)據(jù)寫(xiě)入磁盤(pán)成功的消息后,嘗試觸發(fā)下一次寫(xiě)操作,若任務(wù)鎖尚未被搶占,則下一次寫(xiě)任務(wù)觸發(fā)成功;否則,觸發(fā)失敗。
[0036]本發(fā)明實(shí)施例提供的基于嵌入式文件系統(tǒng)的流式數(shù)據(jù)寫(xiě)入方法,將接收的流式數(shù)據(jù)以鏈表結(jié)構(gòu)進(jìn)行組織,且每次寫(xiě)入磁盤(pán)的流式數(shù)據(jù)為一段邏輯和物理上均連續(xù)的數(shù)據(jù),確保了流式數(shù)據(jù)寫(xiě)入的時(shí)序正常,寫(xiě)入流式數(shù)據(jù)時(shí)采用異步1機(jī)制,還支持多核協(xié)作,提高了流式數(shù)據(jù)寫(xiě)入的效率。寫(xiě)入流式數(shù)據(jù)成功后,文件系統(tǒng)下層的寫(xiě)接口會(huì)發(fā)送寫(xiě)操作成功的通知消息,所述消息將觸發(fā)下一次寫(xiě)操作。
【附圖說(shuō)明】
[0037]圖1為本發(fā)明實(shí)施例一提供的基于嵌入式文件系統(tǒng)的流式數(shù)據(jù)寫(xiě)入方法流程圖;
[0038]圖2為本發(fā)明實(shí)施例一提供的基于嵌入式文件系統(tǒng)的流式數(shù)據(jù)寫(xiě)入方法的消息驅(qū)動(dòng)流程圖;
[0039]圖3為本發(fā)明實(shí)施例一提供的流式數(shù)據(jù)以鏈表的結(jié)構(gòu)緩存的示意圖;
[0040]圖4為本發(fā)明實(shí)施例一提供的寫(xiě)入流式數(shù)據(jù)的時(shí)序圖;
[0041]圖5為本發(fā)明實(shí)施例一提供的從緩存中取出數(shù)據(jù)時(shí)分離子鏈表的示意圖。
【具體實(shí)施方式】
[0042]為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面結(jié)合附圖對(duì)本發(fā)明具體實(shí)施例作進(jìn)一步的詳細(xì)描述。
[0043]實(shí)施例一
[0044]下面以圖1為例詳細(xì)說(shuō)明本發(fā)明實(shí)施例一提供的基于嵌入式文件系統(tǒng)的流式數(shù)據(jù)寫(xiě)入方法,圖1為本發(fā)明實(shí)施例提供的基于嵌入式文件系統(tǒng)的流式數(shù)據(jù)寫(xiě)入方法流程圖,在本發(fā)明實(shí)施例中實(shí)施主體可以為文件系統(tǒng)。圖2為本發(fā)明實(shí)施例提供的基于嵌入式文件系統(tǒng)的流式數(shù)據(jù)寫(xiě)入方法的消息驅(qū)動(dòng)流程圖。結(jié)合圖1和圖2所示,該方法包括如下步驟:
[0045]步驟101、接收待寫(xiě)入磁盤(pán)的流式數(shù)據(jù);
[0046]流式數(shù)據(jù)指將數(shù)據(jù)看作是數(shù)據(jù)流的形式來(lái)處理,數(shù)據(jù)塊是數(shù)據(jù)流的最小組成單元。這里接收的流式數(shù)據(jù)來(lái)自內(nèi)容分發(fā)網(wǎng)絡(luò)(Content Delivery Network, CDN)分發(fā)的流式數(shù)據(jù)。
[0047]具體地,在接收寫(xiě)入文件的流式數(shù)據(jù)之前,還包括以下步驟來(lái)為寫(xiě)請(qǐng)求創(chuàng)建一個(gè)新的與任務(wù):
[0048]步驟11,接收到一個(gè)新的流式數(shù)據(jù)寫(xiě)入請(qǐng)求后,判斷系統(tǒng)中是否存在所述文件;
[0049]寫(xiě)請(qǐng)求的參數(shù)包括文件名、寫(xiě)入文件的起始偏移和寫(xiě)入文件的結(jié)束偏移。
[0050]具體地,計(jì)算待寫(xiě)的所述文件的文件名的哈希