欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種高效的數(shù)據(jù)組織與訪問方法與流程

文檔序號:11807567閱讀:252來源:國知局
一種高效的數(shù)據(jù)組織與訪問方法與流程

本發(fā)明涉及數(shù)據(jù)庫領(lǐng)域,特別是一種高效的數(shù)據(jù)組織與訪問方法。



背景技術(shù):

在計(jì)算機(jī)運(yùn)行過程中,用戶進(jìn)程需要對內(nèi)存中的數(shù)據(jù)進(jìn)行處理。數(shù)據(jù)在內(nèi)存中的管理將會直接影響到數(shù)據(jù)處理的效率,進(jìn)而影響程序的性能。實(shí)現(xiàn)有效的數(shù)據(jù)管理的關(guān)鍵在于數(shù)據(jù)存儲、組織的方式,不同的數(shù)據(jù)存儲、組織方式會直接影響數(shù)據(jù)處理的性能。常見的數(shù)據(jù)處理包括插入、刪除、查找、隨機(jī)訪問,數(shù)據(jù)統(tǒng)計(jì)等。通常,用戶希望以一種高效的數(shù)據(jù)存儲、組織方式,使得數(shù)據(jù)處理能在盡可能短的時間內(nèi)完成。如圖1所示,圖1為擁有NVM的計(jì)算機(jī)系統(tǒng)基本結(jié)構(gòu)。

近些年來,出現(xiàn)了一種新型的存儲器,即非易失性存儲器(NVM)。這種新型存儲器可以利用內(nèi)存總線和中央處理器直接交換數(shù)據(jù)。與當(dāng)前內(nèi)存使用的DRAM介質(zhì)不同,存儲在NVM上的數(shù)據(jù)即使斷電了之后也會保留下來,其存儲容量可接近磁盤,并且NVM具有接近DRAM的讀寫速度。但是,NVM的每個存儲單元的使用壽命是有限的,當(dāng)NVM的存儲單元的寫入次數(shù)超過一個范圍時,將可能會導(dǎo)致其無法正確的存儲數(shù)據(jù)。

NVM的出現(xiàn)使得傳統(tǒng)DRAM內(nèi)存的角色發(fā)生了變化,在傳統(tǒng)內(nèi)存的功能上增加了存儲數(shù)據(jù)的功能。內(nèi)存給內(nèi)存數(shù)據(jù)管理的方式提出了新的挑戰(zhàn),用戶需要一種新型的數(shù)據(jù)存儲組織方法,不僅要求能夠快速的進(jìn)行數(shù)據(jù)處理,同時能最大限度減少數(shù)據(jù)處理中的數(shù)據(jù)寫次數(shù),最大限度的保護(hù)NVM的壽命。

目前,將數(shù)據(jù)存儲在一個數(shù)組中,通常采用數(shù)組,數(shù)組是一種邏輯上相鄰的元素在物理存儲上也相鄰的結(jié)構(gòu),數(shù)據(jù)在內(nèi)存中的存儲空間只有一套虛擬地址。為了使用快速地查找算法(例如二分法)找到數(shù)據(jù),需要對數(shù)組中的元素進(jìn)行排序。圖2展示了一個簡單的數(shù)組結(jié)構(gòu)。圖2為有序數(shù)組,在圖2中,每一個方塊代表一個存儲單元,里面存儲了一些數(shù)據(jù)。這種數(shù)組組織方式,使用戶可以用二分法快速訪問其中任意一個位置上的數(shù)據(jù)。然而這種數(shù)據(jù)組織方式也存在巨大的問題,當(dāng)需要插入或刪除一個數(shù)據(jù)的時候,會產(chǎn)生較大的代價。拿插入操作來說,首先需要利用二分查找得到新數(shù)據(jù)應(yīng)該插入的位置P,然后將該位置及其之后所有的數(shù)據(jù)向后移動一個單位,再將新數(shù)據(jù)插入到位置P的存儲空間中。在此過程中,移動數(shù)據(jù)需要大量的時間??紤]一個長度N=104的數(shù)組,假設(shè)新數(shù)據(jù)的插入位置正好是P=1, 那么此時需要一共移動104個元素,這是極其耗時的。如果數(shù)據(jù)存放在NVM,這樣的移動操作會造成大量的NVM單元的擦寫。圖3為有序數(shù)組的插入,圖3中灰色的存儲單元表示為了在序列中插入數(shù)據(jù)“3”所擦寫的所有數(shù)據(jù)位置。

因此,現(xiàn)有的組織方法雖然利于二分法數(shù)據(jù)查找。但是,維護(hù)有序數(shù)據(jù)序列的時間開銷很大,更為嚴(yán)重的是在NVM上使用這樣的數(shù)據(jù)組織方式會造成大量的不必要的擦寫操作,不僅降低了數(shù)據(jù)維護(hù)的速度,而且縮短了NVM的使用壽命。

主要有以下幾個缺點(diǎn):數(shù)據(jù)的插入、刪除效率低;不適合高速的數(shù)據(jù)訪問,數(shù)據(jù)查找的效率低;數(shù)據(jù)的插入刪除會造成額外的數(shù)據(jù)寫入,影響NVM壽命;將數(shù)據(jù)組織在一個鏈表中,鏈表中的元素在邏輯上是相鄰的,但是其物理位置不一定相鄰,數(shù)據(jù)之間通過指針相互連接,在插入和刪除數(shù)據(jù)時,只需要更改相應(yīng)的指針即可。如圖4所示,圖4展示了一個簡單的鏈表結(jié)構(gòu)。使用的鏈表結(jié)構(gòu)降低了數(shù)組插入和刪除時的開銷,也降低了在NVM上數(shù)據(jù)移動和擦寫。但是鏈表結(jié)構(gòu)有明顯的局限性,就是每次數(shù)據(jù)查找必須從鏈表的頭指針開始。假如需要訪問圖4所示鏈表中數(shù)據(jù)“10”,那么從鏈表的頭指針開始找,由第一個節(jié)點(diǎn)找到第二個節(jié)點(diǎn),依次類推直到第5個節(jié)點(diǎn)才能找到數(shù)據(jù)“10”。因此,鏈表結(jié)構(gòu)下的數(shù)據(jù)查詢代價很高,有可能需要依次訪問整個鏈表的所有元素,這是非常耗時的。

因此,需要一種能夠充分適用于內(nèi)存的數(shù)據(jù)存儲與組織方式,利用內(nèi)存的特性解決內(nèi)存數(shù)據(jù)管理中的技術(shù)問題。



技術(shù)實(shí)現(xiàn)要素:

本發(fā)明的目的是提出一種高效的數(shù)據(jù)組織與訪問方法,該方法解決了傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)在內(nèi)存中面臨的兩難問題:連續(xù)地址空間的數(shù)據(jù)搜索迅速,但是數(shù)據(jù)插入和刪除代價大;不連續(xù)地址空間的數(shù)據(jù)搜索慢,但是數(shù)據(jù)插入和刪除的代價小。

本發(fā)明的目的是通過以下技術(shù)方案來實(shí)現(xiàn)的:

本發(fā)明提供的一種高效的數(shù)據(jù)組織與訪問方法,其特征在于:采用具有兩套虛擬地址進(jìn)行數(shù)據(jù)組織;具體步驟如下:

S11:用戶進(jìn)程發(fā)出組織數(shù)據(jù)的請求;

S12:將用戶數(shù)據(jù)有序依次的存入數(shù)據(jù)塊;

S13:利用鏈表將數(shù)據(jù)塊有序的鏈接在一起;

S14:為所有的數(shù)據(jù)塊映射連續(xù)的虛擬地址空間;

S15:返回用戶進(jìn)程。

進(jìn)一步,所述步驟S14中為所有的數(shù)據(jù)塊映射連續(xù)的虛擬地址空間,具體步驟如下:

S21:用戶進(jìn)程發(fā)出連續(xù)化數(shù)據(jù)的請求;

S22:內(nèi)核進(jìn)程收到用戶進(jìn)程發(fā)出的連續(xù)化數(shù)據(jù)的請求;

S23:內(nèi)核進(jìn)程根據(jù)進(jìn)程頁表得到相應(yīng)數(shù)據(jù)的物理地址;

S24:內(nèi)核進(jìn)程申請一段連續(xù)的虛擬地址空間;

S25:內(nèi)核進(jìn)程為數(shù)據(jù)創(chuàng)建連續(xù)虛擬地址空間對應(yīng)的頁表,與步驟S23中解析到的數(shù)據(jù)的物理地址進(jìn)行映射,并將該頁表插入到用戶進(jìn)程或內(nèi)核的頁表之中;

S26:返回連續(xù)虛擬地址空間的起始地址到用戶進(jìn)程。

進(jìn)一步,所述步驟S23中從內(nèi)核虛擬地址空間或者用戶虛擬地址空間分配連續(xù)的虛擬地址空間,且分配的空間大小大于或等于數(shù)據(jù)總量的大小。

進(jìn)一步,還包括數(shù)據(jù)插入的方法,具體步驟如下:

S31:用戶進(jìn)程請求插入數(shù)據(jù)D

S32:利用連續(xù)虛擬地址定位數(shù)據(jù)D應(yīng)插入的數(shù)據(jù)塊K

S33:若數(shù)據(jù)塊K已滿,創(chuàng)建一個同等大小的新數(shù)據(jù)塊,將數(shù)據(jù)放入新數(shù)據(jù)塊中;若未滿,將數(shù)據(jù)放入數(shù)據(jù)塊K,轉(zhuǎn)S36

S34:利用連續(xù)虛擬地址定位新數(shù)據(jù)塊應(yīng)插入的位置,按照鏈表插入的方式完成數(shù)據(jù)塊的插入

S35:維護(hù)數(shù)據(jù)的連續(xù)虛擬地址空間

S36:返回用戶進(jìn)程

進(jìn)一步,還包括數(shù)據(jù)刪除的方法,具體步驟如下:

S41:用戶進(jìn)程請求刪除數(shù)據(jù)D

S42:利用連續(xù)虛擬地址定位數(shù)據(jù)D存在數(shù)據(jù)塊K

S43:若數(shù)據(jù)塊K中存在D,將其刪除,若數(shù)據(jù)塊為空轉(zhuǎn)S44,否則轉(zhuǎn)S46

S44:在數(shù)據(jù)塊鏈表中刪除該數(shù)據(jù)塊

S45:對連續(xù)虛擬地址空間進(jìn)行維護(hù)

S46:返回用戶進(jìn)程

進(jìn)一步,還包括連續(xù)虛擬地址維護(hù)方法,具體步驟如下:

S51:若用戶進(jìn)程的數(shù)據(jù)已經(jīng)連續(xù)化,則根據(jù)連續(xù)虛擬空間的首地址,將該連續(xù)的虛擬地址空間釋放。

S52:用戶進(jìn)程發(fā)出組織連續(xù)化數(shù)據(jù)的請求。

S53:內(nèi)核進(jìn)程響應(yīng)用戶進(jìn)程的請求,完成數(shù)據(jù)的連續(xù)化。

S54:返回起始地址Saddr到用戶進(jìn)程。

進(jìn)一步,還包括連續(xù)虛擬地址維護(hù)方法,具體步驟如下:

S62:已知新數(shù)據(jù)塊插入的位置為K,若用戶進(jìn)程的數(shù)據(jù)尚未連續(xù)化,則發(fā)出連續(xù)化數(shù)據(jù)的請求。若已連續(xù)化,則轉(zhuǎn)S65

S63:內(nèi)核進(jìn)程響應(yīng)用戶進(jìn)程的請求,完成數(shù)據(jù)的連續(xù)化。

S64:返回起始地址Saddr到用戶進(jìn)程,用戶進(jìn)程得到起始地址Saddr且每個數(shù)據(jù)塊擁有兩套虛擬地址。

S65:計(jì)算第K個數(shù)據(jù)塊在連續(xù)虛擬地址空間的虛擬地址Vaddr。

S66:通過進(jìn)程頁表,找到Vaddr對應(yīng)的頁表內(nèi)容并將其向后移動一個單位,將當(dāng)前頁表項(xiàng)的值設(shè)置為新數(shù)據(jù)塊的物理地址。

S67:由于起始虛擬地址未變,直接返回用戶進(jìn)程。

進(jìn)一步,還包括數(shù)據(jù)快的訪問方法,具體步驟如下:

S71:若用戶進(jìn)程的數(shù)據(jù)已經(jīng)連續(xù)化,則直接進(jìn)入S73;否則用戶進(jìn)程發(fā)出連續(xù)化數(shù)據(jù)的請求。

S72:內(nèi)核進(jìn)程響應(yīng)用戶進(jìn)程的請求,完成數(shù)據(jù)的連續(xù)化,返回連續(xù)虛擬地址空間的起始地址Saddr。

S73:根據(jù)數(shù)據(jù)塊的偏移以及每個數(shù)據(jù)塊的大小,得到相應(yīng)的虛擬地址空間偏移。例如用戶要訪問第10個數(shù)據(jù)塊,每個數(shù)據(jù)塊的大小為4096字節(jié),那么可以得到地址偏移offset=10*4096=40960字節(jié)。

S74:根據(jù)連續(xù)虛擬空間的起始地址Saddr以及相應(yīng)的地址偏移offset獲得指定數(shù)據(jù)快的虛擬地址。

S75:利用MMU獲得相應(yīng)的物理地址并通過該地址訪問整個數(shù)據(jù)塊的任意數(shù)據(jù)。

S76:返回相應(yīng)的數(shù)據(jù)到用戶進(jìn)程。

進(jìn)一步,還包括數(shù)據(jù)的查詢方法,具體步驟如下:

S81:若用戶進(jìn)程的數(shù)據(jù)已連續(xù)化,則直接進(jìn)入S83;否則用戶進(jìn)程發(fā)出連續(xù)化數(shù)據(jù)的請求。

S82:內(nèi)核進(jìn)程響應(yīng)用戶進(jìn)程的請求,完成數(shù)據(jù)的連續(xù)化,返回相應(yīng)的連續(xù)虛擬地址空間的起始地址Saddr

S83:根據(jù)數(shù)據(jù)塊的大小以及數(shù)據(jù)的數(shù)量,計(jì)算連續(xù)虛擬地址的結(jié)束地址。例如每個數(shù)據(jù)塊的大小為4096B,一共有200個數(shù)據(jù)塊,則可得到虛擬空間的結(jié)束地址為Eaddr=Saddr+200*4096

S84:根據(jù)用戶要查找的數(shù)據(jù)D,在連續(xù)虛擬空間的起始地址Saddr以及結(jié)束地址Eaddr之間進(jìn)行二分查找,得到相應(yīng)數(shù)據(jù)的虛擬地址。

S85:利用MMU獲得相應(yīng)的物理地址并通過該地址訪問該數(shù)據(jù)。

S86:返回相應(yīng)的數(shù)據(jù)到用戶進(jìn)程。

由于采用了上述技術(shù)方案,本發(fā)明具有如下的優(yōu)點(diǎn):

本發(fā)明提供的高效的數(shù)據(jù)組織與訪問方法,讓數(shù)據(jù)塊擁有兩套地址空間,一套連續(xù),一套不連續(xù)。利用不連續(xù)的虛擬地址進(jìn)行的數(shù)據(jù)的插入、刪除,無須移動已有數(shù)據(jù);利用連續(xù)的虛擬地址空間進(jìn)行數(shù)據(jù)的高效訪問;插入和刪除操作不會導(dǎo)致數(shù)據(jù)物理位置的變化,接近鏈表的操作速度。數(shù)據(jù)查找能夠利用二分查找等快速算法定位數(shù)據(jù)。其中,連續(xù)的用于高效的訪問,離散的可用于高效的組織。

由于通過連續(xù)的虛擬地址空間以及數(shù)據(jù)快的相對偏移,可以在常數(shù)的時間內(nèi)定位數(shù)據(jù)所在的虛擬空間地址,不需要通過指針進(jìn)行尋址,因此,具有更快的數(shù)據(jù)訪問速度;

由于數(shù)據(jù)擁有連續(xù)的虛擬地址空間,在起始地址和種終止之間使用二分查找,可以在對數(shù)時間內(nèi)定位數(shù)據(jù)的位置,因此,具有更快的查找速度;

由于數(shù)據(jù)塊的分布是離散的,在維護(hù)其結(jié)構(gòu)時不需要對真實(shí)數(shù)據(jù)進(jìn)行移動,并且修改進(jìn)程頁表產(chǎn)生的寫操作是在DRAM之中的,因此,延長了NVM的壽命;

由于數(shù)據(jù)連續(xù)的分布在一段虛擬地址空間之中,計(jì)算機(jī)的緩存策略會將訪問位置周圍的數(shù)據(jù)也載入進(jìn)緩存,加速數(shù)據(jù)的下一次訪問,因此,有效利用了緩存。

本發(fā)明的其他優(yōu)點(diǎn)、目標(biāo)和特征在某種程度上將在隨后的說明書中進(jìn)行闡述,并且在某種程度上,基于對下文的考察研究對本領(lǐng)域技術(shù)人員而言將是顯而易見的,或者可以從本發(fā)明的實(shí)踐中得到教導(dǎo)。本發(fā)明的目標(biāo)和其他優(yōu)點(diǎn)可以通過下面的說明書來實(shí)現(xiàn)和獲得。

附圖說明

本發(fā)明的附圖說明如下。

圖1為本發(fā)明的擁有NVM的計(jì)算機(jī)系統(tǒng)基本結(jié)構(gòu)。

圖2為本發(fā)明的有序數(shù)組。

圖3為本發(fā)明的有序數(shù)組的插入。

圖4為本發(fā)明的鏈表結(jié)構(gòu)。

圖5為本發(fā)明的含有NVM的計(jì)算機(jī)系統(tǒng)。

圖6為本發(fā)明的本發(fā)明的數(shù)據(jù)組織方式。

圖7為本發(fā)明的數(shù)據(jù)塊鏈表結(jié)構(gòu)。

圖8為本發(fā)明的典型的Linux虛擬地址空間。

圖9為本發(fā)明的虛擬地址映射示意圖。

圖10為本發(fā)明的本發(fā)明數(shù)據(jù)組織空間結(jié)構(gòu)。

圖11為本發(fā)明的插入新數(shù)據(jù)塊后的組織結(jié)構(gòu)。

圖12為本發(fā)明的數(shù)據(jù)的組織流程。

圖13為本發(fā)明的高效的數(shù)據(jù)組織流程方法圖。

圖14為本發(fā)明的數(shù)據(jù)插入流程。

圖15為本發(fā)明的數(shù)據(jù)刪除流程。

圖16為本發(fā)明的連續(xù)虛擬地址空間的維護(hù)-重映射。

圖17為本發(fā)明的連續(xù)虛擬地址維護(hù)方法-部分重映射。

圖18為本發(fā)明的高速的數(shù)據(jù)訪問方法流程(訪問指定位置的數(shù)據(jù))。

圖19為本發(fā)明的高速的數(shù)據(jù)訪問方法流程(尋找數(shù)據(jù)的位置)。

具體實(shí)施方式

下面結(jié)合附圖和實(shí)施例對本發(fā)明作進(jìn)一步說明。

實(shí)施例1

以下是本實(shí)施例提及的縮寫具體含義:MMU為Memory Management Unit,存儲器管理單元;VAS為Virtual Address Space,虛擬地址空間;PT為Page Table,頁表;NVM為Non-Volatile Memory,非易失性存儲器;DRAM為Dynamic Random Access Memory,動態(tài)隨機(jī)存取存儲器。

如圖所示,本實(shí)施例提供的一種高效的數(shù)據(jù)組織與訪問方法,采用具有兩套虛擬地址進(jìn)行數(shù)據(jù)組織;具體步驟如下:

S11:用戶進(jìn)程發(fā)出組織數(shù)據(jù)的請求;

S12:將用戶數(shù)據(jù)有序依次的存入數(shù)據(jù)塊;

S13:利用鏈表將數(shù)據(jù)塊有序的鏈接在一起;

S14:為所有的數(shù)據(jù)塊映射連續(xù)的虛擬地址空間;

S15:返回用戶進(jìn)程。

所述步驟S11中的數(shù)據(jù)在RAM上或NVM上;所述步驟S12中的數(shù)據(jù)滿足以下條件:數(shù)據(jù)塊K的數(shù)據(jù)一定大于數(shù)據(jù)塊K-1的數(shù)據(jù)。

所述步驟S14中為所有的數(shù)據(jù)塊映射連續(xù)的虛擬地址空間,具體步驟如下:

S21:用戶進(jìn)程發(fā)出連續(xù)化數(shù)據(jù)的請求;

S22:內(nèi)核進(jìn)程收到用戶進(jìn)程發(fā)出的連續(xù)化數(shù)據(jù)的請求;

S23:內(nèi)核進(jìn)程根據(jù)進(jìn)程頁表得到相應(yīng)數(shù)據(jù)的物理地址;

S24:內(nèi)核進(jìn)程申請一段連續(xù)的虛擬地址空間;

S25:內(nèi)核進(jìn)程為數(shù)據(jù)創(chuàng)建連續(xù)虛擬地址空間對應(yīng)的頁表,與步驟S23中解析到的數(shù)據(jù)的物理地址進(jìn)行映射,并將該頁表插入到用戶進(jìn)程或內(nèi)核的頁表之中;

S26:返回連續(xù)虛擬地址空間的起始地址到用戶進(jìn)程。

所述步驟S23中從內(nèi)核虛擬地址空間或者用戶虛擬地址空間分配連續(xù)的虛擬地址空間,且分配的空間大小大于或等于數(shù)據(jù)總量的大小。

所述步驟S26中的離散數(shù)據(jù)設(shè)置有兩套虛擬地址,一套是連續(xù)的虛擬地址,另一套是不連續(xù)的虛擬地址。

還包括數(shù)據(jù)插入的方法,具體步驟如下:

S31:用戶進(jìn)程請求插入數(shù)據(jù)D

S32:利用連續(xù)虛擬地址定位數(shù)據(jù)D應(yīng)插入的數(shù)據(jù)塊K

S33:若數(shù)據(jù)塊K已滿,創(chuàng)建一個同等大小的新數(shù)據(jù)塊,將數(shù)據(jù)放入新數(shù)據(jù)塊中;若未滿,將數(shù)據(jù)放入數(shù)據(jù)塊K,轉(zhuǎn)S36

S34:利用連續(xù)虛擬地址定位新數(shù)據(jù)塊應(yīng)插入的位置,按照鏈表插入的方式完成數(shù)據(jù)塊的插入

S35:維護(hù)數(shù)據(jù)的連續(xù)虛擬地址空間

S36:返回用戶進(jìn)程

還包括數(shù)據(jù)刪除的方法,具體步驟如下:

S41:用戶進(jìn)程請求刪除數(shù)據(jù)D

S42:利用連續(xù)虛擬地址定位數(shù)據(jù)D存在數(shù)據(jù)塊K

S43:若數(shù)據(jù)塊K中存在D,將其刪除,若數(shù)據(jù)塊為空轉(zhuǎn)S44,否則轉(zhuǎn)S46

S44:在數(shù)據(jù)塊鏈表中刪除該數(shù)據(jù)塊

S45:對連續(xù)虛擬地址空間進(jìn)行維護(hù)

S46:返回用戶進(jìn)程

所述步驟S43中當(dāng)數(shù)據(jù)塊為空時采用立即刪除和延后刪除,或者當(dāng)做另一個新的數(shù)據(jù)塊使用。

還包括連續(xù)虛擬地址維護(hù)方法,具體步驟如下:

S51:若用戶進(jìn)程的數(shù)據(jù)已經(jīng)連續(xù)化,則根據(jù)連續(xù)虛擬空間的首地址,將該連續(xù)的虛擬地址空間釋放。

S52:用戶進(jìn)程發(fā)出組織連續(xù)化數(shù)據(jù)的請求。

S53:內(nèi)核進(jìn)程響應(yīng)用戶進(jìn)程的請求,完成數(shù)據(jù)的連續(xù)化。

S54:返回起始地址Saddr到用戶進(jìn)程。

還包括連續(xù)虛擬地址維護(hù)方法,具體步驟如下:

S62:已知新數(shù)據(jù)塊插入的位置為K,若用戶進(jìn)程的數(shù)據(jù)尚未連續(xù)化,則發(fā)出連續(xù)化數(shù)據(jù)的請求。若已連續(xù)化,則轉(zhuǎn)S65

S63:內(nèi)核進(jìn)程響應(yīng)用戶進(jìn)程的請求,完成數(shù)據(jù)的連續(xù)化。

S64:返回起始地址Saddr到用戶進(jìn)程,用戶進(jìn)程得到起始地址Saddr且每個數(shù)據(jù)塊擁有兩套虛擬地址。

S65:計(jì)算第K個數(shù)據(jù)塊在連續(xù)虛擬地址空間的虛擬地址Vaddr。

S66:通過進(jìn)程頁表,找到Vaddr對應(yīng)的頁表內(nèi)容并將其向后移動一個單位,將當(dāng)前頁表項(xiàng)的值設(shè)置為新數(shù)據(jù)塊的物理地址。

S67:由于起始虛擬地址未變,直接返回用戶進(jìn)程。

還包括數(shù)據(jù)快的訪問方法,具體步驟如下:

S71:若用戶進(jìn)程的數(shù)據(jù)已經(jīng)連續(xù)化,則直接進(jìn)入S73;否則用戶進(jìn)程發(fā)出連續(xù)化數(shù)據(jù)的請求。

S72:內(nèi)核進(jìn)程響應(yīng)用戶進(jìn)程的請求,完成數(shù)據(jù)的連續(xù)化,返回連續(xù)虛擬地址空間的起始地址Saddr。

S73:根據(jù)數(shù)據(jù)塊的偏移以及每個數(shù)據(jù)塊的大小,得到相應(yīng)的虛擬地址空間偏移。例如用戶要訪問第10個數(shù)據(jù)塊,每個數(shù)據(jù)塊的大小為4096字節(jié),那么可以得到地址偏移offset=10*4096=40960字節(jié)。

S74:根據(jù)連續(xù)虛擬空間的起始地址Saddr以及相應(yīng)的地址偏移offset獲得指定數(shù)據(jù)快的虛擬地址。

S75:利用MMU獲得相應(yīng)的物理地址并通過該地址訪問整個數(shù)據(jù)塊的任意數(shù)據(jù)。

S76:返回相應(yīng)的數(shù)據(jù)到用戶進(jìn)程。

還包括數(shù)據(jù)的查詢方法,具體步驟如下:

S81:若用戶進(jìn)程的數(shù)據(jù)已連續(xù)化,則直接進(jìn)入S83;否則用戶進(jìn)程發(fā)出連續(xù)化數(shù)據(jù)的請求。

S82:內(nèi)核進(jìn)程響應(yīng)用戶進(jìn)程的請求,完成數(shù)據(jù)的連續(xù)化,返回相應(yīng)的連續(xù)虛擬地址空間的起始地址Saddr

S83:根據(jù)數(shù)據(jù)塊的大小以及數(shù)據(jù)的數(shù)量,計(jì)算連續(xù)虛擬地址的結(jié)束地址。例如每個數(shù)據(jù)塊的大小為4096B,一共有200個數(shù)據(jù)塊,則可得到虛擬空間的結(jié)束地址為Eaddr=Saddr+200*4096

S84:根據(jù)用戶要查找的數(shù)據(jù)D,在連續(xù)虛擬空間的起始地址Saddr以及結(jié)束地址Eaddr之間進(jìn)行二分查找,得到相應(yīng)數(shù)據(jù)的虛擬地址。

S85:利用MMU獲得相應(yīng)的物理地址并通過該地址訪問該數(shù)據(jù)。

S86:返回相應(yīng)的數(shù)據(jù)到用戶進(jìn)程。

實(shí)施例2

本實(shí)施例提供的高效的數(shù)據(jù)組織與訪問方法,提高了在內(nèi)存數(shù)據(jù)管理及各類操作中最大程度的保護(hù)NVM的壽命。

在擁有NVM存儲介質(zhì)的計(jì)算機(jī)系統(tǒng)中,NVM與CPU通過內(nèi)存總線直接相連。用戶的計(jì)算 機(jī)中NVM存儲設(shè)備擁有大量的數(shù)據(jù),可能通過鏈表或數(shù)組等方式組織在了一起,用戶希望能夠?qū)崿F(xiàn)數(shù)據(jù)的快速插入,查找,刪除等數(shù)據(jù)處理操作,并盡可能延長NVM的壽命。

如圖5所示,圖5為含有NVM的計(jì)算機(jī)系統(tǒng),在該場景下,本實(shí)施例提出的方法組織數(shù)據(jù)的方式如圖6所示,圖6為數(shù)據(jù)組織方式,在圖6中,每一個數(shù)據(jù)塊表示一群數(shù)據(jù)的集合,其物理存儲空間相鄰,但可以無序存儲。數(shù)據(jù)塊的大小要求是4096字節(jié)的整數(shù)倍,數(shù)據(jù)塊之間以鏈表的形式組織在一起。因此,數(shù)據(jù)塊擁有一套不連續(xù)的虛擬地址空間,這便于數(shù)據(jù)的插入刪除等操作。本發(fā)明的新穎之處在于數(shù)據(jù)塊同時擁有兩套虛擬地址,除了上述的不連續(xù) 的虛擬地址以外,本發(fā)明方法還為其分配了一套連續(xù)的虛擬地址,能使數(shù)據(jù)塊具有隨機(jī)訪問以及高效查找的特性。

本實(shí)施對內(nèi)存數(shù)據(jù)組織的方式進(jìn)行了改進(jìn),即數(shù)據(jù)擁有兩套虛擬地址,一套是不連續(xù)的,而另一套是連續(xù)的。不連續(xù)的虛擬地址便于數(shù)據(jù)的插入與刪除,連續(xù)的虛擬地址使數(shù)據(jù)具有隨機(jī)訪問及高效查找的特性。

本實(shí)施例還提供了一種新的數(shù)據(jù)訪問方式,利用連續(xù)虛擬地址空間和數(shù)據(jù)偏移進(jìn)行隨機(jī)訪問,利用離散的虛擬地址空間進(jìn)行數(shù)據(jù)的插入以及刪除。

如圖7所示,本實(shí)施例按數(shù)據(jù)塊為單位來組織數(shù)據(jù),每一個數(shù)據(jù)塊里面含有多個數(shù)據(jù)且記錄了這些數(shù)據(jù)所處范圍,即數(shù)據(jù)塊內(nèi)部數(shù)據(jù)的最大值以及最小值。整個數(shù)據(jù)塊的虛擬地址空間是連續(xù)的,內(nèi)部數(shù)據(jù)的存儲可以無序也可以有序,要求每個數(shù)據(jù)塊的大小是4096字節(jié)的整數(shù)倍。數(shù)據(jù)塊以鏈表的形式組織在一起,數(shù)據(jù)塊之間有序,即第K個數(shù)據(jù)塊的最大元素小于第K+1個數(shù)據(jù)塊的最小元素。數(shù)據(jù)塊雖然在邏輯上是相鄰的,但事實(shí)上其在虛擬地址空間里的地址是完全亂序的,圖7中展示了部分?jǐn)?shù)據(jù)塊的虛擬地址。圖7為數(shù)據(jù)塊鏈表結(jié)構(gòu),為了增強(qiáng)該數(shù)據(jù)的查詢性能,本實(shí)施例為數(shù)據(jù)塊創(chuàng)建了另一套連續(xù)的虛擬地址空間。在Linux操作系統(tǒng)中,每一個進(jìn)程都有自己的虛擬地址空間,而虛擬地址空間又劃分成了不同的部分,圖8即為一個典型的Linux進(jìn)程的虛擬地址空間。如圖8所示,圖8為一個典型的Linux虛擬地址空間,其中,內(nèi)核虛擬地址空間是由操作系統(tǒng)負(fù)責(zé)進(jìn)行管理,用戶虛擬地址空間可以由進(jìn)程運(yùn)行的時候進(jìn)行動態(tài)的管理。本發(fā)明為所需要管理的數(shù)據(jù)結(jié)構(gòu)在用戶虛擬地址空間中申請了一段連續(xù)的虛擬地址空間;如圖9所示,圖9為虛擬地址映射示意圖,為了使用戶進(jìn)程通過該連續(xù)虛擬地址空間也能訪問到相應(yīng)的數(shù)據(jù)塊數(shù)據(jù),需要建立虛擬地址與物理地址之間的關(guān)聯(lián)。如圖9所示,左邊是在用戶空間中申請的虛擬地址空間,右面是每個數(shù)據(jù)塊對應(yīng)的物理頁。中間部分是進(jìn)程頁表(省略了頁全局目錄),它是虛擬空間的具體表現(xiàn)形式。其中左邊的是頁上級目錄(Page Upper Directory),中間的是中級目錄(Page Middle Directory), 右邊的是頁面表(Page Table Entry)。頁面表中的每一項(xiàng)與一個物理頁進(jìn)行映射。本發(fā)明將每一個數(shù)據(jù)塊按鏈表順序與連續(xù)的虛擬地址進(jìn)行映射,也就是將數(shù)據(jù)塊的物理地址寫入相應(yīng)的PTE項(xiàng)目中,圖9中展示了部分?jǐn)?shù)據(jù)塊關(guān)聯(lián)后的結(jié)果,將該過程成為連續(xù)化數(shù)據(jù)。

如10所示,圖10為數(shù)據(jù)組織空間結(jié)構(gòu),本實(shí)施例為所有的數(shù)據(jù)塊分配了一組連續(xù)的虛擬地址空間,并保留了原有的離散虛擬地址。也就是說,上述每一個數(shù)據(jù)塊將擁有兩個地址,所有數(shù)據(jù)塊所構(gòu)成的數(shù)據(jù)空間也將有兩套虛擬地址,其中一套是離散的,使得數(shù)據(jù)塊具有鏈表的優(yōu)點(diǎn),另一套是連續(xù)的,使得數(shù)據(jù)塊具有數(shù)組的優(yōu)點(diǎn)。

事實(shí)上,從連續(xù)的虛擬地址空間的角度來說,上述由數(shù)據(jù)塊組成的鏈表就是一個數(shù)組,因此具有隨機(jī)訪問的特性,并且可以使用二分查找的方法快速定位數(shù)據(jù)塊。定位到一個具體的數(shù)據(jù)塊后,用戶可以利用自己的算法完成數(shù)據(jù)的快速訪問。由于數(shù)據(jù)都在一個數(shù)據(jù)塊內(nèi),因此可以充分利用到緩存加速訪問??偟膩碚f,本方法具有接近數(shù)組的查詢性能。

對于數(shù)據(jù)的插入與刪除,在大部分情況下,可將數(shù)據(jù)直接插入到已經(jīng)存在的數(shù)據(jù)塊中,在此過程中可以利用連續(xù)的虛擬地址進(jìn)行快速查找。

如11所示,圖11為插入新數(shù)據(jù)塊后的組織結(jié)構(gòu),在一些極少數(shù)的情況下,可能會需要插入一個新的數(shù)據(jù)塊(例如數(shù)據(jù)塊已滿)以容納更多的數(shù)據(jù)。此時可利用連續(xù)虛擬地址空間進(jìn)行二分查找,快速定位新數(shù)據(jù)塊應(yīng)該插入的位置,按照鏈表的方式插入該數(shù)據(jù)塊(利用了離散的虛擬地址)。由于連續(xù)虛擬地址空間尚未和新數(shù)據(jù)塊建立映射關(guān)系,因此需要對連續(xù)虛擬地址空間的映射關(guān)系進(jìn)行更新維護(hù),本發(fā)明提供了兩種方法,具體在本節(jié)之后分別介紹。需要說明的是,這種情況發(fā)生的情況發(fā)生很少,因此對平均每一次插入數(shù)據(jù)所需要的代價很小。此外,在插入時同樣不需要對已有的數(shù)據(jù)塊或數(shù)據(jù)進(jìn)行移動,減少了NVM的寫入。

如圖12所示,圖12為數(shù)據(jù)的組織流程,本實(shí)施例還提供了一種數(shù)據(jù)的組織方法,具體步驟如下:

組織的數(shù)據(jù)有用兩套虛擬地址,一套是不連續(xù)的,另一套是連續(xù)的,在數(shù)據(jù)的組織過程中需要建立兩套虛擬地址,具體的方法如下:

S1:用戶進(jìn)程發(fā)出組織數(shù)據(jù)的請求

S2:將用戶數(shù)據(jù)有序的依次放入數(shù)據(jù)塊

S3:利用鏈表將數(shù)據(jù)塊有序的鏈接在一起

S4:為所有的數(shù)據(jù)塊映射連續(xù)的虛擬地址空間

S5:返回用戶進(jìn)程

如圖13所示,圖13為高效的數(shù)據(jù)組織流程方法圖。

在映射連續(xù)虛擬地址空間過程中,使用了進(jìn)程頁表(Page Table)、NVM、內(nèi)存管理系統(tǒng)、MMU等系統(tǒng)組件。其中MMU是系統(tǒng)的硬件,頁表是系統(tǒng)虛擬地址空間的表現(xiàn)形式,在64位系統(tǒng)中通常分為4級,在32位系統(tǒng)中通常只使用兩級頁表。具體的步驟如下:

S1:用戶進(jìn)程發(fā)出組織數(shù)據(jù)的請求,這里的數(shù)據(jù)可以是在RAM上或者NVM上,具體取決于用戶進(jìn)程的需求。

S2:內(nèi)核進(jìn)程收到用戶進(jìn)程發(fā)出的連續(xù)化數(shù)據(jù)的請求

S3:內(nèi)核進(jìn)程根據(jù)進(jìn)程頁表對數(shù)據(jù)的虛擬地址空間進(jìn)行解析,得到相應(yīng)數(shù)據(jù)的物理地址(在此過程中利用了MMU)

S4:內(nèi)核進(jìn)程申請一段連續(xù)的虛擬地址空間。這里的空間可以是用戶虛擬地址空間或內(nèi)核虛擬地址空間。此外,申請的連續(xù)虛擬地址空間的大小可以剛好和數(shù)據(jù)的總大小一樣,也可以比數(shù)據(jù)大小的總和還要大。

S5:內(nèi)核進(jìn)程為數(shù)據(jù)創(chuàng)建連續(xù)虛擬地址空間對應(yīng)的頁表,與S3中解析到的數(shù)據(jù)的物理地址進(jìn)行映射,并將該頁表插入到用戶進(jìn)程或內(nèi)核的頁表之中。

S6:返回連續(xù)虛擬地址空間的起始地址到用戶進(jìn)程,此時用戶進(jìn)程的數(shù)據(jù)將擁有兩套虛擬地址,原本的一套是離散的,新申請的一套是連續(xù)的。我們稱當(dāng)前的數(shù)據(jù)已經(jīng)連續(xù)化。

圖14數(shù)據(jù)插入流程,本發(fā)明采用數(shù)據(jù)塊組織數(shù)據(jù)且擁有兩套虛擬地址,在極少數(shù)情況下,插入數(shù)據(jù)的時候可能需要新的數(shù)據(jù)塊插入,需要同時對兩套虛擬地址進(jìn)行維護(hù),所述的數(shù)據(jù)插入的方法,具體方法如下:

S1:用戶進(jìn)程請求插入數(shù)據(jù)D;

S2:利用連續(xù)虛擬地址定位數(shù)據(jù)D應(yīng)插入的數(shù)據(jù)塊K;

S3:若數(shù)據(jù)塊K已滿,創(chuàng)建一個同等大小的新數(shù)據(jù)塊,將數(shù)據(jù)放入新數(shù)據(jù)塊中;若未滿,將數(shù)據(jù)放入數(shù)據(jù)塊K,轉(zhuǎn)S6;

S4:利用連續(xù)虛擬地址定位新數(shù)據(jù)塊應(yīng)插入的位置P,按照鏈表插入的方式完成數(shù)據(jù)塊的插入;

S5:維護(hù)數(shù)據(jù)的連續(xù)虛擬地址空間;

S6:返回用戶進(jìn)程。

圖15為數(shù)據(jù)刪除流程,數(shù)據(jù)刪除的方法與數(shù)據(jù)插入方法不同的是,數(shù)據(jù)刪除時如果造成數(shù)據(jù)塊為空的時候可以不直接刪除該數(shù)據(jù)塊,可以將其用來存儲其他的數(shù)據(jù),或者延后一段時間在將其刪除。本發(fā)明以直接刪除數(shù)據(jù)塊為例,刪除數(shù)據(jù)的具體方式如下:

S1:用戶進(jìn)程請求刪除數(shù)據(jù)D;

S2:利用連續(xù)虛擬地址定位數(shù)據(jù)D存在數(shù)據(jù)塊K;

S3:若數(shù)據(jù)塊K中存在D,將其刪除,若數(shù)據(jù)塊為空轉(zhuǎn)S4,否則轉(zhuǎn)S6;

S4:在數(shù)據(jù)塊鏈表中刪除該數(shù)據(jù)塊;

S5:對連續(xù)虛擬地址空間進(jìn)行維護(hù);

S6:返回用戶進(jìn)程。

圖16連續(xù)虛擬地址空間的維護(hù)-重映射,連續(xù)虛擬地址維護(hù)方法(重映射),本實(shí)施例提供了兩種更新維護(hù)連續(xù)虛擬地址空間的方法,第一種方法是重映射連續(xù)虛擬地址空間,其具體步驟如下:

S1:若用戶進(jìn)程的數(shù)據(jù)已經(jīng)連續(xù)化,則根據(jù)連續(xù)虛擬空間的首地址,將該連續(xù)的虛擬地址空間釋放。

S2:用戶進(jìn)程發(fā)出組織連續(xù)化數(shù)據(jù)的請求。

S3:內(nèi)核進(jìn)程響應(yīng)用戶進(jìn)程的請求,完成數(shù)據(jù)的連續(xù)化。

S4:返回起始地址Saddr到用戶進(jìn)程。

圖17為連續(xù)虛擬地址維護(hù)方法-部分重映射,同時,還包括連續(xù)虛擬地址維護(hù)方法即部分重映射,第二種方法是只重映射部分虛擬地址空間,該方法僅適用于1中S4申請了比數(shù)據(jù)總量還要大的虛擬空間地址的情況,其具體的方法如下:

S2:已知新數(shù)據(jù)塊插入的位置為K,若用戶進(jìn)程的數(shù)據(jù)尚未連續(xù)化,則發(fā)出連續(xù)化數(shù)據(jù)的請求。若已連續(xù)化,則轉(zhuǎn)S5

S3:內(nèi)核進(jìn)程響應(yīng)用戶進(jìn)程的請求,完成數(shù)據(jù)的連續(xù)化。

S4:返回起始地址Saddr到用戶進(jìn)程,用戶進(jìn)程得到起始地址Saddr且每個數(shù)據(jù)塊擁有兩套虛擬地址。

S5:計(jì)算第K個數(shù)據(jù)塊在連續(xù)虛擬地址空間的虛擬地址Vaddr。

S6:通過進(jìn)程頁表,找到Vaddr對應(yīng)的頁表內(nèi)容并將其向后移動一個單位,將當(dāng)前頁表項(xiàng)的值設(shè)置為新數(shù)據(jù)塊的物理地址。

S7:由于起始虛擬地址未變,直接返回用戶進(jìn)程即可。

如圖18所示,圖18為高速的數(shù)據(jù)訪問方法流程(訪問指定位置的數(shù)據(jù)),數(shù)據(jù)快的訪問方法(隨機(jī)訪問)

S1:若用戶進(jìn)程的數(shù)據(jù)已經(jīng)連續(xù)化,則直接進(jìn)入S3;否則用戶進(jìn)程發(fā)出連續(xù)化數(shù)據(jù)的請求。

S2:內(nèi)核進(jìn)程響應(yīng)用戶進(jìn)程的請求,完成數(shù)據(jù)的連續(xù)化,返回連續(xù)虛擬地址空間的起始地址Saddr。

S3:根據(jù)數(shù)據(jù)塊的偏移以及每個數(shù)據(jù)塊的大小,得到相應(yīng)的虛擬地址空間偏移。例如用戶要訪問第10個數(shù)據(jù)塊,每個數(shù)據(jù)塊的大小為4096字節(jié),那么可以得到地址偏移offset=10*4096=40960字節(jié)。

S4:根據(jù)連續(xù)虛擬空間的起始地址Saddr以及相應(yīng)的地址偏移offset獲得指定數(shù)據(jù)快的虛擬地址。

S5:利用MMU獲得相應(yīng)的物理地址并通過該地址訪問整個數(shù)據(jù)塊的任意數(shù)據(jù)。

S6:返回相應(yīng)的數(shù)據(jù)到用戶進(jìn)程。

圖19高速的數(shù)據(jù)訪問方法流程(尋找數(shù)據(jù)的位置),數(shù)據(jù)的查詢方法具體如下:

S1:若用戶進(jìn)程的數(shù)據(jù)已連續(xù)化,則直接進(jìn)入S3;否則用戶進(jìn)程發(fā)出連續(xù)化數(shù)據(jù)的請求。

S2:內(nèi)核進(jìn)程響應(yīng)用戶進(jìn)程的請求,完成數(shù)據(jù)的連續(xù)化,返回相應(yīng)的連續(xù)虛擬地址空間的起始地址Saddr

S3:根據(jù)數(shù)據(jù)塊的大小以及數(shù)據(jù)的數(shù)量,計(jì)算連續(xù)虛擬地址的結(jié)束地址。例如每個數(shù)據(jù)塊的大小為4096B,一共有200個數(shù)據(jù)塊,則可得到虛擬空間的結(jié)束地址為Eaddr=Saddr+200*4096

S4:根據(jù)用戶要查找的數(shù)據(jù)D,在連續(xù)虛擬空間的起始地址Saddr以及結(jié)束地址Eaddr之間進(jìn)行二分查找,得到相應(yīng)數(shù)據(jù)的虛擬地址。

S5:利用MMU獲得相應(yīng)的物理地址并通過該地址訪問該數(shù)據(jù)。

S6:返回相應(yīng)的數(shù)據(jù)到用戶進(jìn)程。

最后說明的是,以上實(shí)施例僅用以說明本發(fā)明的技術(shù)方案而非限制,盡管參照較佳實(shí)施例對本發(fā)明進(jìn)行了詳細(xì)說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解,可以對本發(fā)明的技術(shù)方案進(jìn)行修改或者等同替換,而不脫離本技術(shù)方案的宗旨和范圍,其均應(yīng)涵蓋在本發(fā)明的權(quán)利要求 范圍當(dāng)中。

當(dāng)前第1頁1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
临邑县| 军事| 金川县| 眉山市| 璧山县| 沙湾县| 韶关市| 大安市| 隆安县| 泗洪县| 普兰县| 霍林郭勒市| 阳朔县| 莱州市| 英超| 玉溪市| 嵩明县| 敦煌市| 江华| 静宁县| 涟源市| 城市| 仙桃市| 锡林浩特市| 乌拉特后旗| 登封市| 陵川县| 葫芦岛市| 玉溪市| 固镇县| 临澧县| 巨野县| 林口县| 根河市| 贺兰县| 英山县| 浦县| 丹巴县| 遂平县| 黎川县| 峨眉山市|