OS實驗八:採用快取記憶體實現檔案讀寫

北詩ღ發表於2020-09-25

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,TCHAR
argv[],TCHAR
envp[])
{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_dst
INVALID_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);
}

相關文章