當前位置:首頁 » 服務存儲 » 存儲空間映射讀取數據
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

存儲空間映射讀取數據

發布時間: 2022-09-18 11:57:49

『壹』 如何將內存的一部分內容映射成一個文件

內存映射文件與虛擬內存有些類似,通過內存映射文件可以保留一個地址空間的區域,同時將物理存儲器提交給此區域,只是內存文件映射的物理存儲器來自一個已經存在於磁碟上的文件,而非系統的頁文件,而且在對該文件進行操作之前必須首先對文件進行映射,就如同將整個文件從磁碟載入到內存。由此可以看出,使用內存映射文件處理存儲於磁碟上的文件時,將不必再對文件執行I/O操作,這意味著在對文件進行處理時將不必再為文件申請並分配緩存,所有的文件緩存操作均由系統直接管理,由於取消了將文件數據載入到內存、數據從內存到文件的回寫以及釋放內存塊等步驟,使得內存映射文件在處理大數據量的文件時能起到相當重要的作用。另外,實際工程中的系統往往需要在多個進程之間共享數據,如果數據量小,處理方法是靈活多變的,如果共享數據容量巨大,那麼就需要藉助於內存映射文件來進行。實際上,內存映射文件正是解決本地多個進程間數據共享的最有效方法。
內存映射文件並不是簡單的文件I/O操作,實際用到了Windows的核心編程技術--內存管理。所以,如果想對內存映射文件有更深刻的認識,必須對Windows操作系統的內存管理機制有清楚的認識,下面給出使用內存映射文件的一般方法:
首先要通過CreateFile()函數來創建或打開一個文件內核對象,這個對象標識了磁碟上將要用作內存映射文件的文件。在用CreateFile()將文件映像在物理存儲器的位置通告給操作系統後,只指定了映像文件的路徑,映像的長度還沒有指定。為了指定文件映射對象需要多大的物理存儲空間還需要通過CreateFileMapping()函數來創建一個文件映射內核對象以告訴系統文件的尺寸以及訪問文件的方式。在創建了文件映射對象後,還必須為文件數據保留一個地址空間區域,並把文件數據作為映射到該區域的物理存儲器進行提交。由MapViewOfFile()函數負責通過系統的管理而將文件映射對象的全部或部分映射到進程地址空間。此時,對內存映射文件的使用和處理同通常載入到內存中的文件數據的處理方式基本一樣,在完成了對內存映射文件的使用時,還要通過一系列的操作完成對其的清除和使用過資源的釋放。這部分相對比較簡單,可以通過UnmapViewOfFile()完成從進程的地址空間撤消文件數據的映像、通過CloseHandle()關閉前面創建的文件映射對象和文件對象。

『貳』 求C語言內存數據讀取代碼

#include<stdlib.h>
#include<string.h>
int mem(void*souceptr,void*destptr,int infolen)
{
return memcpy(destptr,souceptr,infolen);// 復制源去目標地址,位數為Infolen
}

『叄』 cpu怎麼知道某個內存地址對應的哪個物理內存塊的另外,已知地址後,讀取數據的原理是什麼

你的問題挺有意思,說下我個人理解,交流一下。問題可以轉化為內存地址、內存空間、定址的問題。這些是從硬體的角度實現的,所以從硬體角度會比較好理解。
一、是否有個專門的硬體或機制來存儲內存的地址和實際物理內存單元的對應關系?
雖然說 內存地址一個編號,代表一個內存空間;內存的地址和空間是一一對應且永久綁定的;但內存有地址卻沒有目錄。為什麼沒有呢?因為劃不來。
一個內存地址代表一個位元組(8bit)的存儲空間,但存儲一個地址需要4個位元組(以32位為例),如果做個對應表那就是虧大了。那麼,怎麼告訴CPU去哪個地址取數據呢?這就是你說的另一個問題。
二、cpu怎麼知道某個內存地址對應的哪個物理內存塊的?
其實cpu是不知道的(呵呵,別拍我-_-!!),cpu是個只有夾娃娃機智商的快遞員。
假設cpu是個快遞員(指讀取數據部分),那內存就是個蜂巢櫃。內存就好像是一些格子,比如一個3行3列的櫃子,一共9格(0是起始位置,後面用到)。
0
123
456
789
我們想拿出2行2列的數據,那麼怎麼告訴cpu呢?重點來了,cpu是個只有夾娃娃機智商的快遞員。
方法一:我們告訴CPU快遞,請你拿出第2行第2列的數據,然兒CPU是個沒目錄的2貨,這超出了他理解的范圍,沒懂。
方法二:我們只好直接命令cpu(假設cpu手放起始位置0):右移2格,下移2格,拿出。這樣cpu就聽懂了,因為它就是個夾娃娃機的智商,只能用夾娃娃機的方式工作。

『肆』 DSP中有個映射文件的概念,那麼映射是什麼意思請詳細解答!!謝謝!!

dsp軟體開發的第一步是對可用存儲空間的分析,存儲空間分配好壞關繫到一個dsp程序員的水平。對於dsp,我們有兩種名稱的存儲空間,一種是物理空間,另一種是映射空間。物理空間是dsp上可以存放數據和程序的實際空間(包括外部存儲器),我們的數據和程序最終放到物理空間上,但我們並不能直接訪問它們。我們要訪問物理空間,必須藉助於映射空間才行!!但是映射空間本身是個「虛」空間,是個不存在的空間。所以,往往是映射空間遠遠大於實際的物理空間,有些映射空間,如io映射空間,它本身還代表了一種介面。只有那些物理空間映射到的映射空間才是我們真正可訪問(讀或寫)的存儲空間。

『伍』 數據存儲形式有哪幾種

【塊存儲】

典型設備:磁碟陣列,硬碟

塊存儲主要是將裸磁碟空間整個映射給主機使用的,就是說例如磁碟陣列裡面有5塊硬碟(為方便說明,假設每個硬碟1G),然後可以通過劃邏輯盤、做Raid、或者LVM(邏輯卷)等種種方式邏輯劃分出N個邏輯的硬碟。(假設劃分完的邏輯盤也是5個,每個也是1G,但是這5個1G的邏輯盤已經於原來的5個物理硬碟意義完全不同了。例如第一個邏輯硬碟A裡面,可能第一個200M是來自物理硬碟1,第二個200M是來自物理硬碟2,所以邏輯硬碟A是由多個物理硬碟邏輯虛構出來的硬碟。)

接著塊存儲會採用映射的方式將這幾個邏輯盤映射給主機,主機上面的操作系統會識別到有5塊硬碟,但是操作系統是區分不出到底是邏輯還是物理的,它一概就認為只是5塊裸的物理硬碟而已,跟直接拿一塊物理硬碟掛載到操作系統沒有區別的,至少操作系統感知上沒有區別。

此種方式下,操作系統還需要對掛載的裸硬碟進行分區、格式化後,才能使用,與平常主機內置硬碟的方式完全無異。

優點:

1、 這種方式的好處當然是因為通過了Raid與LVM等手段,對數據提供了保護。

2、 另外也可以將多塊廉價的硬碟組合起來,成為一個大容量的邏輯盤對外提供服務,提高了容量。

3、 寫入數據的時候,由於是多塊磁碟組合出來的邏輯盤,所以幾塊磁碟可以並行寫入的,提升了讀寫效率。

4、 很多時候塊存儲採用SAN架構組網,傳輸速率以及封裝協議的原因,使得傳輸速度與讀寫速率得到提升。

缺點:

1、採用SAN架構組網時,需要額外為主機購買光纖通道卡,還要買光纖交換機,造價成本高。

2、主機之間的數據無法共享,在伺服器不做集群的情況下,塊存儲裸盤映射給主機,再格式化使用後,對於主機來說相當於本地盤,那麼主機A的本地盤根本不能給主機B去使用,無法共享數據。

3、不利於不同操作系統主機間的數據共享:另外一個原因是因為操作系統使用不同的文件系統,格式化完之後,不同文件系統間的數據是共享不了的。例如一台裝了WIN7/XP,文件系統是FAT32/NTFS,而Linux是EXT4,EXT4是無法識別NTFS的文件系統的。就像一隻NTFS格式的U盤,插進Linux的筆記本,根本無法識別出來。所以不利於文件共享。


【文件存儲】

典型設備:FTP、NFS伺服器

為了克服上述文件無法共享的問題,所以有了文件存儲。

文件存儲也有軟硬一體化的設備,但是其實普通拿一台伺服器/筆記本,只要裝上合適的操作系統與軟體,就可以架設FTP與NFS服務了,架上該類服務之後的伺服器,就是文件存儲的一種了。

主機A可以直接對文件存儲進行文件的上傳下載,與塊存儲不同,主機A是不需要再對文件存儲進行格式化的,因為文件管理功能已經由文件存儲自己搞定了。

優點:

1、造價交低:隨便一台機器就可以了,另外普通乙太網就可以,根本不需要專用的SAN網路,所以造價低。

2、方便文件共享:例如主機A(WIN7,NTFS文件系統),主機B(Linux,EXT4文件系統),想互拷一部電影,本來不行。加了個主機C(NFS伺服器),然後可以先A拷到C,再C拷到B就OK了。(例子比較膚淺,請見諒……)

缺點:

讀寫速率低,傳輸速率慢:乙太網,上傳下載速度較慢,另外所有讀寫都要1台伺服器裡面的硬碟來承擔,相比起磁碟陣列動不動就幾十上百塊硬碟同時讀寫,速率慢了許多。


【對象存儲】

典型設備:內置大容量硬碟的分布式伺服器

對象存儲最常用的方案,就是多台伺服器內置大容量硬碟,再裝上對象存儲軟體,然後再額外搞幾台服務作為管理節點,安裝上對象存儲管理軟體。管理節點可以管理其他伺服器對外提供讀寫訪問功能。

之所以出現了對象存儲這種東西,是為了克服塊存儲與文件存儲各自的缺點,發揚它倆各自的優點。簡單來說塊存儲讀寫快,不利於共享,文件存儲讀寫慢,利於共享。能否弄一個讀寫快,利 於共享的出來呢。於是就有了對象存儲。

首先,一個文件包含了了屬性(術語叫metadata,元數據,例如該文件的大小、修改時間、存儲路徑等)以及內容(以下簡稱數據)。

以往像FAT32這種文件系統,是直接將一份文件的數據與metadata一起存儲的,存儲過程先將文件按照文件系統的最小塊大小來打散(如4M的文件,假設文件系統要求一個塊4K,那麼就將文件打散成為1000個小塊),再寫進硬碟裡面,過程中沒有區分數據/metadata的。而每個塊最後會告知你下一個要讀取的塊的地址,然後一直這樣順序地按圖索驥,最後完成整份文件的所有塊的讀取。

這種情況下讀寫速率很慢,因為就算你有100個機械手臂在讀寫,但是由於你只有讀取到第一個塊,才能知道下一個塊在哪裡,其實相當於只能有1個機械手臂在實際工作。

而對象存儲則將元數據獨立了出來,控制節點叫元數據伺服器(伺服器+對象存儲管理軟體),裡面主要負責存儲對象的屬性(主要是對象的數據被打散存放到了那幾台分布式伺服器中的信息),而其他負責存儲數據的分布式伺服器叫做OSD,主要負責存儲文件的數據部分。當用戶訪問對象,會先訪問元數據伺服器,元數據伺服器只負責反饋對象存儲在哪些OSD,假設反饋文件A存儲在B、C、D三台OSD,那麼用戶就會再次直接訪問3台OSD伺服器去讀取數據。

這時候由於是3台OSD同時對外傳輸數據,所以傳輸的速度就加快了。當OSD伺服器數量越多,這種讀寫速度的提升就越大,通過此種方式,實現了讀寫快的目的。

另一方面,對象存儲軟體是有專門的文件系統的,所以OSD對外又相當於文件伺服器,那麼就不存在文件共享方面的困難了,也解決了文件共享方面的問題。

所以對象存儲的出現,很好地結合了塊存儲與文件存儲的優點。

最後為什麼對象存儲兼具塊存儲與文件存儲的好處,還要使用塊存儲或文件存儲呢?

1、有一類應用是需要存儲直接裸盤映射的,例如資料庫。因為資料庫需要存儲裸盤映射給自己後,再根據自己的資料庫文件系統來對裸盤進行格式化的,所以是不能夠採用其他已經被格式化為某種文件系統的存儲的。此類應用更適合使用塊存儲。

2、對象存儲的成本比起普通的文件存儲還是較高,需要購買專門的對象存儲軟體以及大容量硬碟。如果對數據量要求不是海量,只是為了做文件共享的時候,直接用文件存儲的形式好了,性價比高。

『陸』 計算機c盤是內存中的一個區域,c盤中的文件都存放在內存中嗎

不是,C盤只是硬碟的一個分區而已,家用硬碟一般分2-4個分區(C、D、E、F)並且常把C盤作為引導盤,在操作系統啟動時首先從C盤將必要的文件「讀取」(載入)到內存中,然後CPU直接從內存中讀取數據然後「指導」系統啟動。

答疑:

  1. CPU問什麼不直接從硬碟中讀取數據呢?

    是這樣,CPU、內存、硬碟的運行速度排序是這樣:CPU核心>一級緩存>二級緩存>三級緩存>內存>硬碟,在硬碟暫不發達的現階段,如果不經過速度較高的RAM而直接從硬碟中讀取數據,那操作系統運行會慢的讓你難以忍受。

  2. C盤中的所有文件都被「放到」內存中嗎?

    不是。只是將必要的文件載入到內存中,如果在系統在內存中找不到所需的數據時才會到硬碟中去尋找

  3. 其他配置相同但一台內存大一台內存小,是內存越大系統相對越流暢嗎?

    是的,內存作為最大的緩存理論上大一些比較好。

『柒』 請教如何在vxworks上構建文件系統

Tornado之TrueFFS編程者指南(一)
seasoblue
按:這篇文章主要根據tornado2.0 for Arm的在線幫助寫成,前面大部分是翻譯過來的,後面將詳細介紹MTD驅動的編寫,並會給出實際的例子。TrueFFS對於作嵌入式系統來說非常有用,我希望這兒的每一個開發者都能掌握它。我對TrueFFS的研究還很淺薄,所以如果有信口開河的地方還請大方之家斧正。如果能對大家有所幫助,也就無枉此筆了。
一. 概述
1.簡介
Tornado的TrueFFS是和vxworks兼容的一種M-Systems Flite實現方式,版本為2.0。它為種類繁多的flash存儲設備提供了統一的塊設備介面,並且具有可重入、線程安全的特點,支持大多數流行的CPU構架。
有了Tornado的TrueFFS,應用程序對flash存儲設備的讀寫就好象它們對擁有MS-DOS文件系統的磁碟設備的操作一樣。這樣TrueFFS就屏蔽了下層存儲介質的差異,為開發者提供了統一的介面方式。然而,當你設計一個嵌入式系統的時候,了解flash存儲器和磁碟設備的不同之處還是很重要的。盡管flash存儲器不可能適用於所有的嵌入式系統,但由於flash存儲器具有體積小,耗電省,非易失存儲的特性,在許多的環境下尤其在移動設備和手持設備領域里它成為了理想的選擇。
Flash存儲器在擁有眾多優點的同時也有一些自身的缺點。首先,它在寫之前必須要進行擦除操作,而且不能一個位元組一個位元組的擦,它只能以一個扇區、一個塊或者整片的方式進行擦操作。它的寫和擦操作都需要較復雜的步驟才能完成,這就降低了它的易使用性。另外,Flash存儲器最大的一個缺點就是壽命有限,可擦除的次數因不同廠商而有所不同,一般都在1萬到10萬次左右。
一個運行在flash存儲器上性能良好的塊設備應該能針對可移動的媒體(如flash卡)處理各種復雜的情況。比如,完全有這樣的可能:當驅動程序正在進行寫操作時用戶卻把flash卡抽出來了。這有時會造成災難性的後果。幸運的是,TrueFFS在設計時已經仔細考慮了flash存儲器的各種特性,以及掉電和用戶由於不耐煩或好奇的原因而猛地拔出flash卡想看看發生了什麼事的情況。
2.TrueFFS和塊數據
Flash存儲器不能無限次重復使用。它的每個扇區的擦除次數雖然很大,但卻有限。因此,隨著使用次數的加長,它最終會變成只讀狀態。所以我們應該盡最大可能延長它的壽命。行之有效的方*就是平衡使用所有的存儲單元,而不讓某一單元過度使用。這種技術被稱之為wear leveling。TrueFFS使用一種基於一張動態維護表的block-to-flash(塊對應於flash)傳輸系統來實現wear leveling技術。當塊數據被修改、移動,或碎片回收後,這張維護表會自動調整。
就象塊設備驅動需要的那樣,TrueFFS把flash存儲空間映射到一個特殊的連續存儲塊隊列中,以便文件系統可以對它進行數據的讀寫。這些塊被從0開始連續編號。
從一個數據塊中讀取數據的操作非常直接。文件系統請求指定塊的內容,TrueFFS響應後將塊號傳送到flash存儲匹配器(flash memory coordinates)中,找到之上的數據,然後把數據返回給文件系統。向塊寫數據也一樣的直接,只要這個塊還沒有被寫過。TrueFFS要作的就是傳送塊號到flash存儲匹配器(flash memorycoordinates)中,並寫數據到所指定的地址。
但如果寫請求試圖修改一個已經寫過了的塊設備內容,情況就復雜了。TrueFFS先是找到flash空間中一個已經可寫的區域,然後把修改後的塊數據寫到那裡。當數據安全地寫完後,TrueFFS更新它的block-to-flash映射結構,以使塊現在映射的區域為放置修改後數據的區域。這就保證了一定程度上的wear leveling。然而,如果存儲在flash上的一些數據本質上是靜態的,只有在修改時wear leveling才會產生一種被稱為靜態文件鎖定的問題。
存儲這些靜態數據的區域根本不會被*循使用,這將降低flash期望的生命值。TrueFFS通過強制轉移靜態區域的方*成功克服了靜態文件鎖定的問題。因為block-to-flash映射表是動態的,TrueFFS能夠以對文件系統不可見的方式管理這些wear-leveling轉移。由於絕對強制wear-leveling方式會對性能產生一些負面的影響,所以TrueFFS採取了一種非絕對wear-leveling的算*。它保證了所有空間的使用近似平等。
最後,TrueFFS的wear-leveling算*更增強了突破被稱為死鎖這種模式的性能。
所謂死鎖就是一些簡單的wear-leveling算*只是兩個或多個單元長時間循環而忽略了其餘的單元的現象。
3.碎片回收
塊數據的修改使得flash的一些塊區域不再包含合*的數據,並且這些區域在擦除之前變得不可寫。如果沒有機制來回收這些區域,flash很快就會變成只讀的狀態了。不幸的是由於這些塊不可以單獨擦除,回收這些塊就有些復雜了。單次擦除被限制在一個叫作擦除單元(erase unit)的較大范圍內。如對於Intel的flash器件來說是64k位元組。
TrueFFS使用一種被稱為碎片回收(garbage collection)的機制來回收那些不再包含有效數據的塊。該機制從一個預擦除單元(source erase unit)內拷貝所有的有效數據塊到另一個新的被稱為轉移單元(transferunit)的擦除單元。TrueFFS然後更新block-to-flash映射表再擦除這個廢舊的預擦除單元。
這樣,原來的塊出現在外界時仍然包含了原來的數據,雖然這些數據現在已經存放在flash存儲器的其它空間。
怎樣觸發碎片回收功能呢?如果太頻繁,則會降低wear-leveling的效果,並影響整個flash的性能。因此在TrueFFS內部,碎片回收只是在塊分配算*需要的時候才會觸發。塊分配算*盡量保持在同一個擦除單元(erase unit)內有一段連續的自塊池。如果塊池變得太小,塊分配算*就會馬上採用碎片回收算*進行碎片回收。然後碎片回收算*就會找到並回收和下面標准最吻合的擦除單元(erase unit):
l 廢塊最多
l 擦除周期數據最少
l 最靜態的區域
另外,碎片回收算*也會採用隨機選擇的處理方*。這樣可以保證回收處理能夠均勻地覆蓋整修存儲空間,而不會由於應用程序使用數據的方式而偏差。

『捌』 內存映射是怎麼回事

內存映射文件是由一個文件到一塊內存的映射,使進程虛擬地址空間的某個區域與磁碟上某個文件的部分或全部內容的建立映射。
建立映射後,通過該區域可以直接對被映射的磁碟文件進行訪問.而不必執行文件I/O操作也無需對文件內容進行緩沖處理。
就好像整個被映射的文件都載入到了內存一樣,因此內存文件映射非常適合於用來管理大文件。

內存映射文件對程序的提速,只在處理大文件或非常頻繁的文件讀寫操作時效果才明顯。
通過內存映射,相當於將磁碟上的文件所在空間建立成一塊虛擬內存,程序訪問時可按內存的方式進行,省去了普通io方式的一些環節,其實真正要讀寫操作時,會進行換頁,將這些個「虛擬內存」讀到物理內存中。
總之,內存映射文件是應用虛擬內存的技術來達到加速處理的

『玖』 嵌入式系統中的存儲器映射是怎麼回事,為什麼要映射

我是這樣理解的:
存儲器空間是和硬體相關聯的,可以對某些地址上寫數據來控制硬體,為了方便使用(總不可能都用地址來直接控制,那樣就工作量就太大了),將這些地址賦予了一些變數名,通過變數名來控制硬體(也就是寄存器的概念)。

『拾』 內存里的數據和顯存里的數據關系是映射嗎

不是映射關系,因為內存空間里有一塊空間是固定作為向顯卡轉移數據用的,數據轉移至顯卡的顯存後,內存數據就被丟棄,因此不存在映射關系,只是單純的轉移。