Maa*_*lis 12 c++ windows winapi
是否::GetWriteWatch总是给出修改过的页面的最新列表?还是由于处理器缓存而使某些页面仍被认为是未修改的,因为缓存的写入尚未刷新到主内存?
考虑以下C ++代码片段:
auto ptr = ::VirtualAlloc(NULL, 8192, MEM_COMMIT | MEM_RESERVE, MEM_WRITE_WATCH);
auto num = new (ptr) int{};
::ResetWriteWatch(ptr, 8192);
// ... calculations that involve writing to 'num' ...
::GetWriteWatch(/* ... */);
Run Code Online (Sandbox Code Playgroud)
这将保留并提交两页虚拟内存,修改第一页,最后请求所有已修改的页。
是否可以确保通过调用将首页列出为已修改::GetWriteWatch?
写监视以页面粒度运行并非偶然。这是因为这是通过MMU的页表在CPU级别处理的。我找不到权威来源,但是我知道这可以通过只读页面属性来实现。监视页面是只读的,但是通过将监视页面添加到已修改列表中来处理写入时的软页面错误。
这样,处理器高速缓存中的陈旧数据就无关紧要了。这是在MMU级别处理的,并且MMU无论如何都与缓存紧密耦合。
我会更担心竞争条件,因为这些条件出现在C ++级别。即使GetWriteWatch正在运行,也可能从另一个线程写入监视的页面。
| 归档时间: |
|
| 查看次数: |
166 次 |
| 最近记录: |