在 Windows 应用程序中,我有一个包含文件名和缓冲区的类。您使用文件名构造它,您可以查询对象以查看缓冲区是否已填充,如果没有则返回 nullptr,如果是则返回缓冲区地址。当对象超出范围时,释放缓冲区:
class file_buffer
{
public:
file_buffer(const std::string& file_name);
~file_buffer();
void* buffer();
private:
...
}
我想将数据异步放入内存,据我所知,我有两个选择:要么创建缓冲区并通过 ReadFileEx 使用重叠 IO,要么使用 MapViewOfFile 并在另一个线程上触摸地址。
目前我正在使用 ReadFileEx 这会出现一些问题,因为大于约 16MB 的请求很容易失败:我可以尝试拆分请求,但随后会出现同步问题,并且如果对象在 IO 之前超出范围完成我有缓冲区清理问题。此外,如果类的多个实例被快速连续创建,事情会变得非常复杂。
在另一个线程上映射和触摸数据似乎要容易得多,因为我不会遇到上限问题:如果客户端现在绝对必须拥有数据,他们可以简单地取消引用地址,让操作系统担心页面错误并接受阻塞命中。
这个应用程序需要支持单核机器,所以我的问题是:另一个软件线程上的页面错误会比当前线程上的重叠 IO 更昂贵吗?他们会拖延这个过程吗?重叠的 IO 是否会以相同的方式停止进程,还是有一些我不明白的操作系统魔法?是否仍然使用重叠 IO 执行页面错误?
我已经很好地阅读了这些主题: http: //msdn.microsoft.com/en-us/library/aa365199 (v=vs.85).aspx(文件管理中的 IO 概念) http://msdn。 microsoft.com/en-us/library/windows/desktop/aa366556(v=vs.85).aspx(文件映射),但我似乎无法推断如何进行性能权衡。