2

次のコードは、結果のポインターへのアクセスがスレッドをブロックしないように、ファイルからシステム メモリにデータをロードしますか?

auto ptr = VirtualLock(MapViewOfFile(file_map, FILE_MAP_READ, high, low, size), size); // Map file to memory and wait for DMA transfer to finish.
int val0 = reinterpret_cast<int*>(ptr)[0]; // Will not block thread?
int val1 = reinterpret_cast<int*>(ptr)[size-4]; // Will not block thread?

VirtualUnlock(ptr);
UnmapViewOfFile(ptr);

編集:

ダモンズの回答後に更新。

auto ptr = MapViewOfFile(file_map, FILE_MAP_READ, high, low, size);

#pragma optimize("", off)
char dummy;
for(int n = 0; n < size; n += 4096)
    dummy = reinterpret_cast<char*>(ptr)[n];
#pragma optimize("", on)

int val0 = reinterpret_cast<int*>(ptr)[0]; // Will not block thread?
int val1 = reinterpret_cast<int*>(ptr)[size-4]; // Will not block thread?

UnmapViewOfFile(ptr);
4

1 に答える 1

2

ファイルのサイズが途方もなく小さい最大ワーキング セット サイズよりも小さい場合 (または、それに応じてワーキング セット サイズを変更した場合) は、理論上はイエスです。ワーキング セットの最大サイズを超えた場合、VirtualLockは何もしません (つまり、失敗します)。

(VirtualLock実際には、少なくとも Windows XP では、実際の動作とは対照的に、実際に行うべきことを解釈する際に、どちらかというと... リベラルであることがわかりました。より新しいバージョンでは異なる可能性があります)

私は過去に同様のことを試みてきましたが、現在は単純なforループ (1 バイトの読み取り) で RAM に必要なすべてのページに触れています。これは、ページが触れられた後に理論的に再びスワップアウトされる可能性があるという唯一の例外を除いて、未解決の問題を残さずに機能します. 実際には、これは決して起こりません (マシンの RAM が非常に少なく、発生しても問題ない場合を除きます)。

于 2012-08-15T12:10:54.463 に答える