OS實驗八:採用快取記憶體實現檔案讀寫
08 採用快取記憶體實現檔案讀寫
4.2.1 實驗目的
(1)瞭解windows系統檔案快取記憶體的概念。
(2)熟悉windows系統檔案讀寫相關API。
(3)掌握採用緩衝方式實現檔案讀寫相關引數的設定。
4.2.2 實驗準備知識 快取記憶體
訪問快取必將訪問磁碟,而磁碟的訪問速度遠遠低於記憶體的訪問速度,快取記憶體就是利用記憶體中的儲存空間,來再存磁碟傳輸資料,因此快取記憶體不是真正的物理裝置,而是一隻核心及記憶體映像機制。由於它被設定在記憶體中,因此速度非常快,可以在一定程度上解決CPU與磁碟速度不匹配的問題。
快取記憶體的原理是:假設一個程式讀檔案的第一塊資料,它常常會按順序讀取第二個資料,第三塊資料等等,直到讀出所有需要的資料。利用這個規律可以進行檔案的預先讀,即在程式沒有讀第二塊資料,第三塊資料之前,作業系統提前把這些資料讀入記憶體的快取記憶體。當程式請求訪問這些資料時,就可以快速的將這些資料從快取記憶體中讀出交給程式使用。另外,由於檔案可能會被多次讀出,在第一次讀出後,將檔案儲存在快取記憶體中, 以後再讀時就不用去磁碟中去讀而直接從快取記憶體中讀取即可。利用LRU(最少使用頁面置換演算法)原則,可以將不使用的檔案資料從快取記憶體中刪除以節約快取記憶體空間。
寫檔案可使用延遲寫機制,具體地說,如果一個程式要求寫檔案,它首先把要寫的內容交給快取記憶體。而快取記憶體並不立即把它寫回磁碟,而是在CPU空閒時在完成寫操作。這樣,要寫磁碟的程式就可以不必等待寫操作完畢在繼續工作,從而節省了整個程式的執行時間。此外,如果另外一個程式要訪問還沒有寫回磁碟的資料,在作業系統的管理下,就可以從快取記憶體中得到剛剛更新的資料,而不是磁碟上的舊資料,從而保障了檔案內容的一致性。
4.2.3 實驗內容
建立一個函式,使用該函式將原始檔source.txt中的內容讀出,在寫到目標檔案sequence.txt去。
4.2.4 實驗要求
使用快取記憶體方式完成檔案的讀寫。
4.2.5 實驗指導
由於要採用快取記憶體進行檔案操作,在使用函式Createfile()建立檔案時,其引數dwFlagsAndAttiibutes應選用FILE_FLAG_SEQUENT_SCAN。
4.2.6 實驗總結
該實驗完成緩衝方式的檔案讀寫操作。先建立兩個檔案,即source.txt和sequential.txt,然後反覆從檔案source.txt中讀出資料塊,並寫到檔案sequential.txt中去,直到檔案尾為止。
4.2.7 原始檔
//File_Overlapped.cpp:Defines the entry point for the console application,
//
#include “stadfx.h”
#include “File_Overlapped.h”
#ifdef+DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
Static char THIS_FILE[]=FILE;
#endif
DWORD BufferSize=1024;
Char buf[1024];
//The one and only application object
CWinApp theApp;
Using namespace std;
Void FileReadWrite_Overlapped(char source,char destination);
Int_tmain(int argc,TCHARargv[],TCHARenvp[])
{int nRetCode=0;
Printf(“Call FileReadWrite_Overlapped!\n”);
FileReadWrite_Overlapped(“source.txt”,”nobuffer.txt”);
Return nRetCode;
}
Void FileReadWrite_Overlapped(char *source,char *destination)
{ HANDLE handle_src,handle_dst;
DWORD NumberOfByteRead,NumberOfByteWrite,Error;
BOOL cycle;
Char *buffer;
buffer=buf;
OVERLAPPED overlapped;
//建立檔案
handle_src=CreateFile(spurce,
GEBERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE-FLAG_NO_BUFFERING| FILE-FLAG_OVERLAPPED,
NULL);
Handle_dst=CreateFile(destination,
GENERIC_WRITE,
NULL,
CREATE_ALWAYS,
NULL,
NULL);
If (handl_srcINVALID_HANDLE+VALUE||
Handle_dstINVALID_HANDLE+VALUE)
{printf(“File Create Fail!\n”);
exit(1);
}
cycle=TURE;
while (cycle)
NumberOfByteRead=BufferSize;
//讀檔案
if (!ReadFile(handle-src,
buffer,
NumberOfByteRead,
& NumberOfByteRead,
NULL)
{printf(“read File Error!%d\n,GetLastError());
Exit(1);
}
If(NumberOfByteRead<BufferSize) cycle=FALSE;
//寫檔案
if(!WriteFile(handle_dst,buffer,NumberOfByteRead,&NumberOfByteWrite,NULL))
{printf(“Write File Error!%d\n”,GetLastError());
exit(1);
}
}
//關閉檔案控制程式碼
CloseHandle(handle_src);
CloseHandle(handle_dst);
}
相關文章
- 7.7 實現程式記憶體讀寫記憶體
- 在 Go 專案中基於本地記憶體快取的實現及應用Go記憶體快取
- Go實踐:用Sync.Map實現簡易記憶體快取系統Go記憶體快取
- Go實戰 | 基於本地記憶體的快取的應用及實現Go記憶體快取
- Ehcache介紹及整合Spring實現快取記憶體Spring快取記憶體
- 使用Go實現健壯的記憶體型快取Go記憶體快取
- Python讀取大檔案的"坑“與記憶體佔用檢測Python記憶體
- Java中讀取檔案6種記憶體安全方式Java記憶體
- 2.3.1 (下)WebView 檔案下載、快取、記憶體洩露WebView快取記憶體洩露
- PHP超低記憶體遍歷目錄檔案和讀取超大檔案PHP記憶體
- 記憶(快取)函式返回值:Python 實現快取函式Python
- Vue專案全域性配置頁面快取,實現按需讀取快取Vue快取
- Spring Boot整合Hazelcast實現叢集與分散式記憶體快取Spring BootAST分散式記憶體快取
- laravel redirect快閃記憶體blade讀取不到Laravel記憶體
- Python實用方法之讀取本地檔案Python
- @PropertySource 註解實現讀取 yml 檔案
- CPU快取記憶體快取記憶體
- 關於dataWithContentsOfFile 讀取大檔案的記憶體問題記憶體
- 淺談快取寫法(三):記憶體快取該如何設計快取記憶體
- python中xlrd庫如何實現檔案讀取?Python
- 如何在Java中讀取超過記憶體大小的檔案Java記憶體
- 教你如何運用python實現簡單檔案讀寫函式Python函式
- 多核cpu、cpu快取記憶體、快取一致性協議、快取行、記憶體快取記憶體協議
- 記憶體快取選型記憶體快取
- C++檔案操作實戰:建立、寫入、讀取、修改檔案一應俱全C++
- CPU快取和記憶體屏障快取記憶體
- docker部署redis快取記憶體DockerRedis快取記憶體
- 談談CPU快取記憶體快取記憶體
- django 快取表格到記憶體Django快取記憶體
- Java記憶體快取-通過Google Guava建立快取Java記憶體快取GoGuava
- laravel利用Redis來實現網站快取讀取LaravelRedis網站快取
- ios端app讀取iphone檔案(通過itunes實現)iOSAPPiPhone
- Java實時讀取日誌檔案Java
- 讀取檔案流並寫入檔案流
- MRAM快取記憶體的組成快取記憶體
- 高效能記憶體快取 ristretto記憶體快取
- 用Node.js實現檔案迴圈覆寫Node.js
- python能讀寫記憶體嗎Python記憶體