一種基于嵌入式文件系統(tǒng)的流式數(shù)據(jù)讀取方法
【專利摘要】本發(fā)明提出了一種基于嵌入式文件系統(tǒng)的流式數(shù)據(jù)讀取方法,該方法包括:接收一個(gè)讀取流式數(shù)據(jù)的請(qǐng)求,當(dāng)被請(qǐng)求的流式數(shù)據(jù)存在于磁盤時(shí),則為該請(qǐng)求新建一個(gè)讀任務(wù),并為新建的讀任務(wù)分配存儲(chǔ)空間并初始化相關(guān)參數(shù);將讀任務(wù)分解成多個(gè)子任務(wù),每個(gè)子任務(wù)負(fù)責(zé)讀取一段物理上連續(xù)的數(shù)據(jù),并進(jìn)行緩存;從子任務(wù)緩存中取出數(shù)據(jù),按流式數(shù)據(jù)格式進(jìn)行封裝,每封裝完一塊數(shù)據(jù)就提交給本次讀任務(wù)的調(diào)用方,提交完成后釋放本次子任務(wù)并觸發(fā)下一個(gè)子任務(wù);當(dāng)所有子任務(wù)都成功完成時(shí),向任務(wù)調(diào)用方報(bào)告任務(wù)正常完成,等待任務(wù)調(diào)用方結(jié)束當(dāng)前讀任務(wù)。本發(fā)明有利于流式數(shù)據(jù)的高吞吐和大并發(fā)讀取,有效地解決了在大量用戶訪問熱點(diǎn)數(shù)據(jù)時(shí)服務(wù)器并發(fā)性能低下的問題。
【專利說明】一種基于嵌入式文件系統(tǒng)的流式數(shù)據(jù)讀取方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及數(shù)據(jù)存儲(chǔ)【技術(shù)領(lǐng)域】,尤其涉及一種基于嵌入式文件系統(tǒng)的流式數(shù)據(jù)讀取方法。
【背景技術(shù)】
[0002]隨著互聯(lián)網(wǎng)及多媒體產(chǎn)業(yè)的迅猛發(fā)展,各種存儲(chǔ)技術(shù)及存儲(chǔ)系統(tǒng)也得到了飛速發(fā)展。這些存儲(chǔ)系統(tǒng)為海量的互聯(lián)網(wǎng)信息及多媒體數(shù)據(jù)信息提供了方便、快速、高效的存儲(chǔ)及訪問服務(wù)。
[0003]嵌入式系統(tǒng)資源有限,結(jié)構(gòu)簡(jiǎ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)等來選擇構(gòu)建合適的文件系統(tǒng)。不同文件系統(tǒng)管理磁盤的策略和讀寫數(shù)據(jù)的方法不一樣,現(xiàn)有技術(shù)最亟待解決的就是數(shù)據(jù)讀取的高吞吐、高并發(fā)問題。
[0004]文件系統(tǒng)讀取數(shù)據(jù)的速率一方面取決于底層接口的1性能,另一方面取決于文件系統(tǒng)自身的調(diào)度效率,文件系統(tǒng)讀取數(shù)據(jù)的并發(fā)能力則與內(nèi)部調(diào)度機(jī)制有關(guān)。
【發(fā)明內(nèi)容】
[0005]本發(fā)明的目的在于,為嵌入式流服務(wù)提供高吞吐、高并發(fā)的數(shù)據(jù)讀取服務(wù),從而提出了一種基于嵌入式文件系統(tǒng)的流式數(shù)據(jù)讀取方法。
[0006]為實(shí)現(xiàn)上述目的,本發(fā)明提出了一種基于嵌入式文件系統(tǒng)的流式數(shù)據(jù)讀取方法,該方法包括以下步驟:
[0007]接收一個(gè)讀取流式數(shù)據(jù)的請(qǐng)求,當(dāng)被請(qǐng)求的流式數(shù)據(jù)存在于磁盤時(shí),則為該請(qǐng)求新建一個(gè)讀任務(wù),并為新建的讀任務(wù)分配存儲(chǔ)空間并初始化相關(guān)參數(shù);
[0008]將讀任務(wù)分解成多個(gè)子任務(wù),每個(gè)子任務(wù)負(fù)責(zé)讀取一段物理上連續(xù)的數(shù)據(jù),并進(jìn)行緩存;
[0009]從子任務(wù)緩存中取出數(shù)據(jù),按流式數(shù)據(jù)格式進(jìn)行封裝,每封裝完一塊數(shù)據(jù)就提交給本次讀任務(wù)的調(diào)用方,提交完成后釋放本次子任務(wù)并觸發(fā)下一個(gè)子任務(wù);
[0010]當(dāng)所有子任務(wù)都成功完成時(shí),向任務(wù)調(diào)用方報(bào)告任務(wù)正常完成,等待任務(wù)調(diào)用方結(jié)束當(dāng)前讀任務(wù)。
[0011]優(yōu)選地,當(dāng)收到一個(gè)讀取流式數(shù)據(jù)的請(qǐng)求時(shí),計(jì)算請(qǐng)求文件名的哈希值,通過對(duì)哈希值進(jìn)行查找,進(jìn)而判斷被請(qǐng)求數(shù)據(jù)是否存在于磁盤。
[0012]優(yōu)選地,一個(gè)讀取流式數(shù)據(jù)的請(qǐng)求參數(shù)包括:文件名、讀取數(shù)據(jù)的起始偏移和結(jié)束偏移,在為該請(qǐng)求新建一個(gè)讀任務(wù)后,為讀任務(wù)分配存儲(chǔ)空間,將文件名哈希值、待讀取數(shù)據(jù)的起始偏移、結(jié)束偏移信息存入讀任務(wù)分配的存儲(chǔ)空間,從而完成讀任務(wù)初始化。
[0013]優(yōu)選地,根據(jù)讀任務(wù)的起始偏移和結(jié)束偏移,計(jì)算出任務(wù)長(zhǎng)度,結(jié)合待讀流式數(shù)據(jù)存放于磁盤中的位置信息,將所述讀任務(wù)分解成多個(gè)子任務(wù);所有子任務(wù)通過鏈表串聯(lián),按先后順序依次觸發(fā)子任務(wù)。
[0014]優(yōu)選地,在每個(gè)子任務(wù)開始后,首先獲取本次子任務(wù)欲讀取流式數(shù)據(jù)的起始扇區(qū)和長(zhǎng)度,根據(jù)欲讀取流式數(shù)據(jù)長(zhǎng)度為待讀取流式數(shù)據(jù)申請(qǐng)內(nèi)存空間,再根據(jù)起始扇區(qū)計(jì)算出將從哪一塊磁盤中讀流式數(shù)據(jù),最后調(diào)用下層接口從指定磁盤中讀取指定區(qū)段的流式數(shù)據(jù)。
[0015]優(yōu)選地,在每個(gè)子任務(wù)完成后,底層接口發(fā)送消息通知文件系統(tǒng)當(dāng)前子任務(wù)執(zhí)行成功或失敗,文件系統(tǒng)在收到子任務(wù)成功完成的消息后,從當(dāng)前子任務(wù)緩存中取出數(shù)據(jù)。
[0016]優(yōu)選地,在執(zhí)行每個(gè)子任務(wù)時(shí)會(huì)為待讀流式數(shù)據(jù)預(yù)分配內(nèi)存空間,用于緩存從磁盤中讀出的數(shù)據(jù);每個(gè)子任務(wù)標(biāo)識(shí)的待讀流式數(shù)據(jù)長(zhǎng)度須為磁盤扇區(qū)大小的整數(shù)倍,且子任務(wù)從磁盤中讀取數(shù)據(jù)時(shí)采用異步非阻塞1模式。
[0017]優(yōu)選地,在上一次子任務(wù)成功結(jié)束后向文件系統(tǒng)發(fā)送消息,文件系統(tǒng)收到消息后從子任務(wù)的數(shù)據(jù)緩存區(qū)將數(shù)據(jù)拷貝到新申請(qǐng)的內(nèi)存中,并按流式數(shù)據(jù)格式進(jìn)行封裝,封裝好后提交給本次讀取任務(wù)的調(diào)用方,進(jìn)而觸發(fā)下一個(gè)子任務(wù),直到所有子任務(wù)均已結(jié)束。
[0018]優(yōu)選地,對(duì)于尚未完成的讀任務(wù),通過向前調(diào)整任務(wù)結(jié)束位置提前結(jié)束任務(wù),對(duì)于已經(jīng)讀取完成的任務(wù),通過向后調(diào)整任務(wù)結(jié)束位置追加讀取數(shù)據(jù)。
[0019]優(yōu)選地,在每個(gè)子任務(wù)進(jìn)行過程中,根據(jù)需要更改讀任務(wù)結(jié)束偏移,當(dāng)新任務(wù)結(jié)束偏移比當(dāng)前子任務(wù)結(jié)束偏移小,則忽略本次更新;否則,用新任務(wù)結(jié)束偏移替換任務(wù)參數(shù)中的讀數(shù)據(jù)結(jié)束偏移,并根據(jù)新任務(wù)結(jié)束偏移重新生成子任務(wù)。
[0020]與現(xiàn)有技術(shù)相比,本發(fā)明的優(yōu)勢(shì)在于:
[0021 ] 1、高效性一本發(fā)明通過對(duì)任務(wù)進(jìn)行分解,保障了每個(gè)子任務(wù)讀取一段邏輯和物理上均連續(xù)的數(shù)據(jù),同時(shí)限制單個(gè)子任務(wù)讀取的數(shù)據(jù)長(zhǎng)度,提高了讀取數(shù)據(jù)的效率;
[0022]2、高并發(fā)——采用異步讀機(jī)制,調(diào)用下層讀接口后立即返回,無需阻塞在讀數(shù)據(jù)過程中;還支持多核協(xié)作,子任務(wù)成功執(zhí)行后下層接口發(fā)送消息報(bào)告子任務(wù)成功執(zhí)行,此消息再去驅(qū)動(dòng)下一子任務(wù),下一子任務(wù)則可能由另一個(gè)核執(zhí)行,這兩點(diǎn)為流式數(shù)據(jù)讀取的高并發(fā)性能提供了保障。
[0023]此外,本發(fā)明還允許用戶在讀取數(shù)據(jù)的過程中更改結(jié)束偏移,豐富了用戶的操作方式,在流服務(wù)應(yīng)用場(chǎng)景中具有較大優(yōu)勢(shì)。
【專利附圖】
【附圖說明】
[0024]圖1是本發(fā)明實(shí)施例提供的一種基于嵌入式文件系統(tǒng)的流式數(shù)據(jù)讀取方法流程示意圖;
[0025]圖2是圖1所示發(fā)明實(shí)施例消息驅(qū)動(dòng)流程圖;
[0026]圖3是圖1所不發(fā)明實(shí)施例讀任務(wù)流程圖;
[0027]圖4是圖1所示發(fā)明實(shí)施例子任務(wù)鏈表示意圖。
【具體實(shí)施方式】
[0028]下面結(jié)合附圖和實(shí)例對(duì)本發(fā)明進(jìn)行詳細(xì)說明,使得本發(fā)明的上述優(yōu)點(diǎn)更加明確:
[0029]本發(fā)明實(shí)施例針對(duì)現(xiàn)有嵌入式流服務(wù)中存在的數(shù)據(jù)讀取效率和并發(fā)能力不夠高的問題,提出了一種基于嵌入式文件系統(tǒng)的流式數(shù)據(jù)讀取方法,該方法通過對(duì)任務(wù)進(jìn)行分解,提高了讀取數(shù)據(jù)的效率,采用異步讀機(jī)制保障了流式數(shù)據(jù)的高并發(fā)讀取,還允許用戶在讀取數(shù)據(jù)的過程中更改結(jié)束偏移,豐富了用戶的操作方式,在流服務(wù)應(yīng)用場(chǎng)景中具有較大優(yōu)勢(shì)。
[0030]圖1是本發(fā)明實(shí)施例提供的一種基于嵌入式文件系統(tǒng)的流式數(shù)據(jù)讀取方法流程示意圖,圖2是消息驅(qū)動(dòng)流程圖,本發(fā)明實(shí)施例采用事件驅(qū)動(dòng)機(jī)制,所有事件以消息為載體進(jìn)行驅(qū)動(dòng),有關(guān)啟動(dòng)任務(wù)、更新任務(wù)、處理讀出數(shù)據(jù)和結(jié)束任務(wù)都是由消息驅(qū)動(dòng)。以下結(jié)合圖1和圖2對(duì)本發(fā)明實(shí)施例進(jìn)行詳細(xì)說明,如圖1所示,該方法包括步驟101-104:
[0031]在步驟101,接收一個(gè)讀取流式數(shù)據(jù)的請(qǐng)求,當(dāng)被請(qǐng)求的流式數(shù)據(jù)存在磁盤時(shí),貝U為該請(qǐng)求新建一個(gè)讀任務(wù),并為新建的讀任務(wù)分配存儲(chǔ)空間并初始化相關(guān)參數(shù)。
[0032]具體地,消息接收器負(fù)責(zé)接收所有消息,對(duì)收到的消息進(jìn)行判斷,根據(jù)消息類型進(jìn)行響應(yīng),消息類型包括啟動(dòng)任務(wù)、更新任務(wù)、處理讀出數(shù)據(jù)和結(jié)束任務(wù)。當(dāng)用戶調(diào)用文件系統(tǒng)提供的接口請(qǐng)求讀取數(shù)據(jù)成功后,文件系統(tǒng)會(huì)發(fā)出一個(gè)啟動(dòng)消息,消息接收器收到啟動(dòng)消息后,由文件系統(tǒng)執(zhí)行圖2的第一個(gè)分支“啟動(dòng)任務(wù)”,啟動(dòng)任務(wù)即為新請(qǐng)求創(chuàng)建一個(gè)讀任務(wù)。
[0033]優(yōu)選地,當(dāng)收到一個(gè)讀取流式數(shù)據(jù)的請(qǐng)求時(shí),首先判斷被請(qǐng)求的流式數(shù)據(jù)是否存在,判斷方法是:計(jì)算請(qǐng)求文件名的哈希值,對(duì)哈希值進(jìn)行查找,若能找到,即被請(qǐng)求的流式數(shù)據(jù)存在于磁盤中,則立即為該請(qǐng)求新建一個(gè)讀任務(wù),為新任務(wù)分配存儲(chǔ)空間并初始化相關(guān)參數(shù);若被請(qǐng)求的流式數(shù)據(jù)不存在于磁盤中,則通知用戶讀請(qǐng)求失敗。
[0034]一個(gè)流式數(shù)據(jù)讀取請(qǐng)求參數(shù)包括文件名、讀取數(shù)據(jù)的起始偏移和結(jié)束偏移等,新建一個(gè)讀任務(wù)后,為新任務(wù)分配內(nèi)存空間,將文件名哈希值、待讀取數(shù)據(jù)的起始偏移、結(jié)束偏移等信息存入任務(wù)空間,從而完成任務(wù)初始化。
[0035]在步驟102,將讀任務(wù)分解成多個(gè)子任務(wù),每個(gè)子任務(wù)負(fù)責(zé)讀取一段物理上連續(xù)的數(shù)據(jù),并進(jìn)行緩存;
[0036]具體地,在讀任務(wù)創(chuàng)建成功后,文件系統(tǒng)獲取被請(qǐng)求文件的元數(shù)據(jù)信息,結(jié)合被請(qǐng)求的流式數(shù)據(jù)存儲(chǔ)在磁盤的的位置信息,依據(jù)待讀流式數(shù)據(jù)的起始偏移和待讀數(shù)據(jù)長(zhǎng)度對(duì)讀任務(wù)進(jìn)行劃分,劃分后的子任務(wù)在邏輯上具有連續(xù)性,每個(gè)子任務(wù)負(fù)責(zé)讀取一段邏輯上和物理上均連續(xù)的數(shù)據(jù),而相鄰子任務(wù)讀出的數(shù)據(jù)在物理上不一定連續(xù)。
[0037]優(yōu)選地,在讀任務(wù)新建成功后,提取本次讀任務(wù)的起始偏移和任務(wù)長(zhǎng)度,查詢待讀流式數(shù)據(jù)對(duì)應(yīng)的文件索引信息,可獲取存放流式數(shù)據(jù)的磁盤位置信息,對(duì)任務(wù)長(zhǎng)度和起始偏移進(jìn)行計(jì)算,結(jié)合存放流式數(shù)據(jù)的磁盤位置信息,將該讀任務(wù)分解成若干個(gè)子任務(wù),每個(gè)子任務(wù)負(fù)責(zé)讀取一段邏輯上和物理上均連續(xù)的數(shù)據(jù),數(shù)據(jù)長(zhǎng)度為扇區(qū)大小的整數(shù)倍;相鄰子任務(wù)讀出的數(shù)據(jù)在邏輯上具有連續(xù)性,但物理上卻可能不連續(xù),因?yàn)橐粋€(gè)流式數(shù)據(jù)往往并非是連續(xù)存儲(chǔ)在磁盤中,劃分子任務(wù)的目的就是為了保證每次從磁盤中讀出一段物理上連續(xù)的數(shù)據(jù),同時(shí),為了保障讀取流式數(shù)據(jù)的效率,對(duì)子任務(wù)的數(shù)據(jù)長(zhǎng)度進(jìn)行限制,單個(gè)子任務(wù)讀取的數(shù)據(jù)長(zhǎng)度不宜太長(zhǎng)。子任務(wù)信息以鏈表的方式存儲(chǔ),鏈表中每個(gè)節(jié)點(diǎn)中包含本次子任務(wù)讀取數(shù)據(jù)的起始扇區(qū)和本次子任務(wù)讀取數(shù)據(jù)的長(zhǎng)度,該長(zhǎng)度用扇區(qū)數(shù)表示。待任務(wù)分解結(jié)束后,主動(dòng)觸發(fā)第一個(gè)子任務(wù)。
[0038]在觸發(fā)一個(gè)子任務(wù)后,首先獲取本次子任務(wù)欲讀取數(shù)據(jù)的起始扇區(qū)和欲讀數(shù)據(jù)長(zhǎng)度,其中,本次子任務(wù)欲讀數(shù)據(jù)長(zhǎng)度由扇區(qū)數(shù)和扇區(qū)大小算出,根據(jù)算出的長(zhǎng)度為本次子任務(wù)申請(qǐng)內(nèi)存空間,用于緩存從磁盤中讀出的數(shù)據(jù),再根據(jù)起始扇區(qū)編號(hào)找到存儲(chǔ)本次子任務(wù)待讀流式數(shù)據(jù)的磁盤,調(diào)用下層接口并傳入磁盤編號(hào)、起始扇區(qū)編號(hào)、扇區(qū)數(shù)、待讀流式數(shù)據(jù)的緩存地址等參數(shù),便可從指定磁盤中讀取指定數(shù)據(jù)。
[0039]在步驟103,從子任務(wù)緩存中取出數(shù)據(jù),按流式數(shù)據(jù)格式進(jìn)行封裝,每封裝完一塊數(shù)據(jù)就提交給本次讀任務(wù)的調(diào)用方,提交完成后釋放本次子任務(wù)并觸發(fā)下一個(gè)子任務(wù);
[0040]具體地,在生成子任務(wù)后,由文件系統(tǒng)主動(dòng)觸發(fā)第一個(gè)子任務(wù),開啟子任務(wù)后,文件系統(tǒng)先獲取子任務(wù)參數(shù),包括讀取數(shù)據(jù)的起始扇區(qū)號(hào)和本次待讀扇區(qū)數(shù)目,通過扇區(qū)大小和待讀扇區(qū)數(shù)計(jì)算出本次子任務(wù)待讀數(shù)據(jù)量,根據(jù)此數(shù)據(jù)量申請(qǐng)內(nèi)存空間,用于緩存待讀數(shù)據(jù),再通過計(jì)算得出本次子任務(wù)待讀起始扇區(qū)所在磁盤編號(hào),最后調(diào)用下層讀接口從指定磁盤中讀出數(shù)據(jù),傳入磁盤編號(hào)、起始扇區(qū)號(hào)、扇區(qū)數(shù)等參數(shù),調(diào)用后立即返回而不是等數(shù)據(jù)完全讀出后再返回,待數(shù)據(jù)完全讀出子任務(wù)緩存后,下層接口會(huì)發(fā)送消息報(bào)告子任務(wù)成功完成,消息接收器收到消息后判斷消息類型為子任務(wù)完成通知消息,文件系統(tǒng)則執(zhí)行圖1中第三個(gè)分支“處理讀出數(shù)據(jù)”,該流程為整個(gè)讀任務(wù)中最主要流程,每當(dāng)收到上一子任務(wù)成功完成的消息后,即由此消息觸發(fā)下一子任務(wù),循環(huán)進(jìn)行此流程直至所有子任務(wù)全部執(zhí)行或某個(gè)子任務(wù)執(zhí)行失敗。
[0041]優(yōu)選地,子任務(wù)從磁盤中讀取數(shù)據(jù)時(shí)采用異步非阻塞1模式,調(diào)用下層接口后立即返回而無需阻塞在1過程中,該機(jī)制適用于多核協(xié)作,利于多任務(wù)的高并發(fā)實(shí)現(xiàn)和流式數(shù)據(jù)的高效讀取。當(dāng)本次子任務(wù)對(duì)應(yīng)的數(shù)據(jù)被完全讀出后,底層接口會(huì)發(fā)送消息報(bào)告子任務(wù)是否成功完成,文件系統(tǒng)收到子任務(wù)成功完成的消息后,從子任務(wù)緩存中取出數(shù)據(jù),按流式數(shù)據(jù)格式進(jìn)行封裝,每封裝完一塊數(shù)據(jù)就提交給本次讀任務(wù)的調(diào)用方,直到本次子任務(wù)讀出的數(shù)據(jù)已全部提交或剩余數(shù)據(jù)暫不足提交,對(duì)于不足提交的剩余數(shù)據(jù),將其暫時(shí)緩存,待下一子任務(wù)從磁盤讀出數(shù)據(jù)后,再取出緩存數(shù)據(jù)進(jìn)行封裝并提交。
[0042]圖3是圖1所示發(fā)明實(shí)施例的讀任務(wù)流程圖,該流程對(duì)讀出數(shù)據(jù)進(jìn)行處理,即按流式數(shù)據(jù)格式對(duì)數(shù)據(jù)進(jìn)行封裝,封裝后每塊數(shù)據(jù)中的內(nèi)容長(zhǎng)度為某一固定值,此值與具體流服務(wù)應(yīng)用場(chǎng)景有關(guān),子任務(wù)讀出的數(shù)據(jù)按流式數(shù)據(jù)根式封裝后可能有剩余,剩余數(shù)據(jù)不足以封裝成一塊流式數(shù)據(jù)提交給用戶,則將子任務(wù)剩余數(shù)據(jù)緩存,待下一子任務(wù)完成后再對(duì)數(shù)據(jù)進(jìn)行封裝,循環(huán)進(jìn)行此流程直至所有子任務(wù)均已完成,當(dāng)所有子任務(wù)均已完成后,按流式數(shù)據(jù)格式封裝數(shù)據(jù)后剩余數(shù)據(jù)仍可能不足以封裝成最后一塊標(biāo)準(zhǔn)數(shù)據(jù),由于此段數(shù)據(jù)是整個(gè)讀任務(wù)的最后一段數(shù)據(jù),已無后續(xù)數(shù)據(jù)存在,所以最后一塊數(shù)據(jù)不足以封裝成一塊標(biāo)準(zhǔn)數(shù)據(jù)但仍然提交給用戶。
[0043]讀任務(wù)進(jìn)行過程中,用戶可以根據(jù)需要更改讀任務(wù)結(jié)束偏移,如用戶發(fā)現(xiàn)自己只需要讀一部分?jǐn)?shù)據(jù)而非整個(gè)文件,則可以向前調(diào)整任務(wù)結(jié)束偏移,則可以調(diào)用嵌入式文件系統(tǒng)為用戶提供的更新任務(wù)參數(shù)的接口,調(diào)用接口后文件系統(tǒng)會(huì)發(fā)送一條更新任務(wù)的消息,消息接收器收到此消息后,文件系統(tǒng)執(zhí)行圖2中第二個(gè)分支“更新任務(wù)”,
[0044]比較原始任務(wù)結(jié)束偏移和新任務(wù)結(jié)束偏移的大小關(guān)系,若新任務(wù)結(jié)束偏移小于原始任務(wù)結(jié)束偏移則為向前更新,即提前結(jié)束任務(wù)。文件系統(tǒng)獲取當(dāng)前子任務(wù)讀取的數(shù)據(jù)偏移,若新任務(wù)結(jié)束偏移比當(dāng)前子任務(wù)讀取的數(shù)據(jù)偏移小則更新不可能完成,直接忽略本次更新請(qǐng)求;若新任務(wù)結(jié)束偏移比當(dāng)前子任務(wù)讀取偏移大,則用新的任務(wù)結(jié)束偏移替換任務(wù)參數(shù)中的讀數(shù)據(jù)結(jié)束偏移,并根據(jù)新的結(jié)束偏移重新生成子任務(wù),更新子任務(wù)鏈表。
[0045]在步驟104,當(dāng)所有子任務(wù)都成功完成時(shí),向任務(wù)調(diào)用方報(bào)告任務(wù)正常完成,等待任務(wù)調(diào)用方結(jié)束當(dāng)前讀任務(wù)。
[0046]具體地,當(dāng)子任務(wù)執(zhí)行失敗、處理讀出數(shù)據(jù)出錯(cuò)或更新任務(wù)出錯(cuò)時(shí),文件系統(tǒng)會(huì)主動(dòng)向用戶報(bào)告異常,當(dāng)所有子任務(wù)都成功完成且處理讀出數(shù)據(jù)正常時(shí),文件系統(tǒng)會(huì)向用戶報(bào)告讀任務(wù)正常完成,用戶收到文件系統(tǒng)的異?;蛲瓿蓤?bào)告后,主動(dòng)結(jié)束任務(wù),結(jié)束任務(wù)的接口也由文件系統(tǒng)實(shí)現(xiàn),供用戶調(diào)用。原則上,用戶可以在任何時(shí)候主動(dòng)結(jié)束一個(gè)讀任務(wù)。
[0047]優(yōu)選地,將讀出的數(shù)據(jù)封裝并提交完成后子任務(wù)才算結(jié)束,子任務(wù)結(jié)束時(shí)釋放任務(wù)空間和數(shù)據(jù)空間,釋放任務(wù)空間即刪除子任務(wù)鏈表中的當(dāng)前頭結(jié)點(diǎn),數(shù)據(jù)空間指的是子任務(wù)開始時(shí)申請(qǐng)的用于緩存讀出數(shù)據(jù)的內(nèi)存空間。只有當(dāng)上一個(gè)子任務(wù)成功完成后,才能觸發(fā)下一個(gè)子任務(wù),若某個(gè)子任務(wù)執(zhí)行失敗,當(dāng)文件系統(tǒng)收到失敗消息時(shí),會(huì)主動(dòng)向任務(wù)調(diào)用方報(bào)告任務(wù)異常,當(dāng)所有子任務(wù)都已成功完成時(shí),文件系統(tǒng)也會(huì)向任務(wù)調(diào)用方報(bào)告任務(wù)正常完成,等待任務(wù)調(diào)用方結(jié)束當(dāng)前讀任務(wù)。
[0048]任務(wù)調(diào)用方收到文件系統(tǒng)報(bào)告異?;蛉蝿?wù)結(jié)束后可調(diào)用文件系統(tǒng)提供的接口函數(shù)主動(dòng)結(jié)束任務(wù),甚至在任務(wù)進(jìn)行過程中任務(wù)調(diào)用方也可主動(dòng)結(jié)束該任務(wù),除此之外,本發(fā)明實(shí)施例還支持中途更新任務(wù)參數(shù),對(duì)于尚未完成的任務(wù),可以通過向前調(diào)整任務(wù)結(jié)束偏移來提前結(jié)束任務(wù),對(duì)于已經(jīng)讀取完成的任務(wù),還可以向后調(diào)整任務(wù)結(jié)束偏移來追加讀取數(shù)據(jù),該方法為用戶提供了靈活多變的操作方式,適合于流式數(shù)據(jù)的多種應(yīng)用場(chǎng)景中。
[0049]圖4是圖1所示本發(fā)明實(shí)施例子任務(wù)鏈表示意圖,如圖4所示,鏈表中每個(gè)節(jié)點(diǎn)表示一個(gè)子任務(wù),節(jié)點(diǎn)中包含子任務(wù)參數(shù),如起始扇區(qū)號(hào)、扇區(qū)數(shù)目、磁盤編號(hào)等,該任務(wù)鏈表在啟動(dòng)任務(wù)時(shí)生成,每當(dāng)一個(gè)子任務(wù)執(zhí)行完成后則釋放鏈表頭結(jié)點(diǎn),將“當(dāng)前子任務(wù)”指向下一子任務(wù),圖4中虛線框中節(jié)點(diǎn)即表示已經(jīng)執(zhí)行完成的子任務(wù),每次觸發(fā)一個(gè)子任務(wù)則通過“當(dāng)前子任務(wù)”獲取任務(wù)參數(shù),“當(dāng)前子任務(wù)”始終指向任務(wù)鏈表的頭結(jié)點(diǎn)。當(dāng)更新任務(wù)結(jié)束偏移后,先刪除更新參數(shù)前的任務(wù)鏈表,再通過新任務(wù)結(jié)束偏移和當(dāng)前任務(wù)狀態(tài)重新計(jì)算并生成新的任務(wù)鏈表。
[0050]本發(fā)明實(shí)施例通過對(duì)讀任務(wù)進(jìn)行分解,保障了每個(gè)子任務(wù)讀取一段邏輯和物理上均連續(xù)的數(shù)據(jù),同時(shí)限制單個(gè)子任務(wù)讀取的數(shù)據(jù)長(zhǎng)度,提高了讀取數(shù)據(jù)的效率;采用異步讀機(jī)制,調(diào)用下層讀接口后立即返回,無需阻塞在讀數(shù)據(jù)過程中;還支持多核協(xié)作,子任務(wù)成功執(zhí)行后下層接口發(fā)送消息報(bào)告子任務(wù)成功執(zhí)行,此消息再去驅(qū)動(dòng)下一子任務(wù),下一子任務(wù)則可能由另一個(gè)核執(zhí)行,這兩點(diǎn)為流式數(shù)據(jù)讀取的高并發(fā)性能提供了保障。
[0051]需要說明的是,以上實(shí)施例僅用以說明本發(fā)明的技術(shù)方案而非限制。盡管參照實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解,對(duì)本發(fā)明的技術(shù)方案進(jìn)行修改或者等同替換,都不脫離本發(fā)明技術(shù)方案的精神和范圍,其均應(yīng)涵蓋在本發(fā)明的權(quán)利要求范圍當(dāng)中。
【權(quán)利要求】
1.一種基于嵌入式文件系統(tǒng)的流式數(shù)據(jù)讀取方法,其特征在于: 接收一個(gè)讀取流式數(shù)據(jù)的請(qǐng)求,當(dāng)被請(qǐng)求的流式數(shù)據(jù)存在于磁盤時(shí),則為該請(qǐng)求新建一個(gè)讀任務(wù),并為新建的讀任務(wù)分配存儲(chǔ)空間并初始化相關(guān)參數(shù); 將所述讀任務(wù)分解成多個(gè)子任務(wù),每個(gè)子任務(wù)負(fù)責(zé)讀取一段物理上連續(xù)的數(shù)據(jù),并進(jìn)行緩存; 從子任務(wù)緩存中取出數(shù)據(jù),按流式數(shù)據(jù)格式進(jìn)行封裝,每封裝完一塊數(shù)據(jù)就提交給本次讀任務(wù)的調(diào)用方,提交完成后釋放本次子任務(wù)并觸發(fā)下一個(gè)子任務(wù); 當(dāng)所有子任務(wù)都成功完成時(shí),向任務(wù)調(diào)用方報(bào)告任務(wù)正常完成,等待任務(wù)調(diào)用方結(jié)束當(dāng)前讀任務(wù)。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于:通過以下步驟判斷所述被請(qǐng)求的流式數(shù)據(jù)是否存在磁盤: 當(dāng)收到一個(gè)讀取流式數(shù)據(jù)的請(qǐng)求時(shí),計(jì)算請(qǐng)求文件名的哈希值,通過在文件系統(tǒng)元數(shù)據(jù)中對(duì)所述哈希值進(jìn)行查找,進(jìn)而判斷被請(qǐng)求數(shù)據(jù)是否存在于磁盤。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于:所述一個(gè)讀取流式數(shù)據(jù)的請(qǐng)求參數(shù)包括:文件名、讀取數(shù)據(jù)的起始偏移和結(jié)束偏移,在為該請(qǐng)求新建一個(gè)讀任務(wù)后,為讀任務(wù)分配存儲(chǔ)空間,將文件名哈希值、待讀流式取數(shù)據(jù)的起始偏移、結(jié)束偏移信息存入讀任務(wù)分配的存儲(chǔ)空間,從而完成讀任務(wù)初始化。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于:將所述讀任務(wù)分解成多個(gè)子任務(wù)的步驟包括: 根據(jù)讀任務(wù)的起始偏移和結(jié)束偏移,計(jì)算出任務(wù)長(zhǎng)度,結(jié)合待讀流式數(shù)據(jù)存放于磁盤中的位置信息,將所述讀任務(wù)分解成多個(gè)子任務(wù); 所有子任務(wù)通過鏈表串聯(lián),按先后順序依次觸發(fā)子任務(wù)。
5.根據(jù)權(quán)利要求1所述的方法,其特征在于:在所述每個(gè)子任務(wù)開始后,首先獲取本次子任務(wù)欲讀取流式數(shù)據(jù)的起始扇區(qū)和長(zhǎng)度,根據(jù)欲讀取流式數(shù)據(jù)長(zhǎng)度為待讀取流式數(shù)據(jù)申請(qǐng)內(nèi)存空間,再根據(jù)起始扇區(qū)計(jì)算出將從哪一塊磁盤讀出流式數(shù)據(jù),最后調(diào)用下層接口從指定磁盤中讀取指定區(qū)段的流式數(shù)據(jù)。
6.根據(jù)權(quán)利要求1所述的方法,其特征在于:在執(zhí)行每個(gè)子任務(wù)時(shí)會(huì)為待讀流式數(shù)據(jù)預(yù)分配內(nèi)存空間,用于緩存從磁盤中讀出的數(shù)據(jù);每個(gè)子任務(wù)標(biāo)識(shí)的待讀流式數(shù)據(jù)長(zhǎng)度須為磁盤扇區(qū)大小的整數(shù)倍,且子任務(wù)從磁盤中讀取數(shù)據(jù)時(shí)采用異步非阻塞1模式。
7.根據(jù)權(quán)利要求1所述的方法,其特征在于:在所述每個(gè)子任務(wù)完成后,底層接口發(fā)送消息通知文件系統(tǒng)當(dāng)前子任務(wù)執(zhí)行成功或失敗,文件系統(tǒng)在收到子任務(wù)成功完成的消息后,從當(dāng)前子任務(wù)緩存中取出數(shù)據(jù)。
8.根據(jù)權(quán)利要求1所述的方法,其特征在于:在上一次子任務(wù)成功結(jié)束后向文件系統(tǒng)發(fā)送消息,文件系統(tǒng)在收到消息后從子任務(wù)的數(shù)據(jù)緩存區(qū)將數(shù)據(jù)拷貝到新申請(qǐng)的內(nèi)存中,并按流式數(shù)據(jù)格式進(jìn)行封裝,封裝好后提交給本次讀取任務(wù)的調(diào)用方,進(jìn)而觸發(fā)下一個(gè)子任務(wù),直到所有子任務(wù)均已結(jié)束。
9.根據(jù)權(quán)利要求1所述的方法,其特征在于,對(duì)于尚未完成的讀任務(wù),通過向前調(diào)整任務(wù)結(jié)束位置提前結(jié)束任務(wù);對(duì)于已經(jīng)讀取完成的任務(wù),通過向后調(diào)整任務(wù)結(jié)束位置追加讀取數(shù)據(jù)。
10.根據(jù)權(quán)利要求1所述的方法,其特征在于:在所述每個(gè)子任務(wù)進(jìn)行過程中,可根據(jù)需要更改讀任務(wù)結(jié)束偏移,當(dāng)新任務(wù)結(jié)束偏移比當(dāng)前子任務(wù)結(jié)束偏移小,則忽略本次更新;否則,用新任務(wù)結(jié)束偏移替換任務(wù)參數(shù)中的讀數(shù)據(jù)結(jié)束偏移,并根據(jù)新任務(wù)結(jié)束偏移重新生成子任務(wù)。
【文檔編號(hào)】G06F12/02GK104331255SQ201410653260
【公開日】2015年2月4日 申請(qǐng)日期:2014年11月17日 優(yōu)先權(quán)日:2014年11月17日
【發(fā)明者】陳君, 吳京洪, 李明哲, 樊皓, 葉曉舟 申請(qǐng)人:中國(guó)科學(xué)院聲學(xué)研究所, 北京中科智網(wǎng)科技有限公司