簡體   English   中英

Windows相當於Linux的readahead系統調用?

[英]Windows equivalent to Linux's readahead syscall?

是否有Windows等同於Linux的readahead系統調用?

編輯:

如果可能,我想要一個完整的函數簽名,顯示等效的偏移/計數參數(或更低/更高)。

例如:Linux函數簽名是:

ssize_t readahead(int fd, off64_t *offset, size_t count);

它的一個例子就是使用它

readahead(file, 100, 500);

其中“file”是先前由mmap等函數設置的文件描述符。 此調用在索引100處讀取500個字節。

編輯2:如果您不確定什么是預讀,請閱讀此內容: http//linux.die.net/man/2/readahead

是。 它是FileSystemControl FSCTL_FILE_PREFETCH

它在Windows Vista及更高版本中用於在應用程序啟動和啟動時預取。

它也被SuperFetch技術使用,該技術使用啟發式技術在您通常使用它們的大約一天中加載應用程序。

FSCTL_FILE_PREFETCH本身沒有在MSDN上記錄,但通過檢查在應用啟動時進行的DeviceIoControl調用很容易找出參數格式:只需在調試器中啟動一個已在c:\\Windows\\Prefetch有.pf文件的應用程序目錄並在DeviceIoControl中斷(或者如果您使用的是內核調試器,則在NTFS驅動程序收到其第一個FSCTL_FILE_PREFETCH時中斷)。 檢查傳入的緩沖區,並將其與.pf文件和稍后實際使用的范圍進行比較。 出於好奇,我做了一次,但沒有記錄細節。

如果您不熟悉DeviceIoControlIRP_MJ_FILESYSTEM_CONTROL ,請IRP_MJ_FILESYSTEM_CONTROL以下鏈接:

從Windows 8開始,存在或多或少直接等同於madvise(MADV_WILLNEED) ,這實際上是相同的(Windows具有統一的VM /緩存系統)。

假設您已對內存映射文件,則可以使用PrefetchVirtualMemory來預取它。

這仍然比你想要的要復雜一點,但不像DeviceIoControl那么苛刻。 另請注意,您可以輕松預取幾個獨立的不連續范圍。

我不確定我是否理解正確,你所說的' Where'文件“是一個先前由mmap這樣的函數設置的文件描述符。 這個調用在索引100處讀取500個字節。這聽起來像是在尋找偏移並讀取500個字節......但是你希望它能夠提前預取...

在C代碼中,它看起來像這樣:

fseek(fp, 100, SEEK_CUR);
fread(&data, 500, 1, fp);

但是,我想,預取它,你會想要使用等待句來掛鈎某些事件,當事件被引發時,數據會被存儲在緩沖區的某個地方......

說實話,我沒有遇到過預先獲取數據的事情......但Ray的回答令我感到驚訝,但是如果你想要保持兼容性,那么它只會對Vista提升...這是要保持的東西記住......但下面的鏈接可能會有所幫助......

好吧,有一個博客討論這個,一個用Delphi編寫的庫,源代碼在這里 ,在這里瀏覽代碼,好吧,它可能不是你想要的但是它可能會幫助你指明方向...對不起,如果它不是你想要的...

希望這會有所幫助,最好的問候,湯姆。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM