В приложении Windows у меня есть класс, который оборачивает имя файла и буфер. Вы создаете его с именем файла, и вы можете запросить объект, чтобы увидеть, заполнен ли буфер, возвращая nullptr, если нет, и адрес буфера, если это так. Когда объект выходит из области видимости, буфер освобождается:
class file_buffer
{
public:
file_buffer(const std::string& file_name);
~file_buffer();
void* buffer();
private:
...
}
Я хочу поместить данные в память асинхронно, и, насколько я понимаю, у меня есть два варианта: либо создать буфер и использовать перекрывающийся ввод-вывод через ReadFileEx, либо использовать MapViewOfFile и коснуться адреса в другом потоке.
В настоящее время я использую ReadFileEx, который создает некоторые проблемы, поскольку запросы размером более 16 МБ склонны к сбою: я могу попытаться разделить запрос, но тогда у меня возникнут проблемы с синхронизацией, и если объект выйдет за пределы до того, как IO будет завершено У меня проблемы с очисткой буфера. Кроме того, если несколько экземпляров класса создаются в быстрой последовательности, все становится очень запутанным.
Сопоставление и касание данных в другом потоке, казалось бы, значительно проще, поскольку у меня не будет проблем с верхним пределом: также, если клиенту абсолютно необходимо иметь данные прямо сейчас, они могут просто разыменовать адрес, пусть ОС позаботится об этом. ошибки страницы и принять блокировку.
Это приложение должно поддерживать одноядерные машины, поэтому мой вопрос: будут ли ошибки страницы в другом программном потоке дороже, чем перекрывающийся ввод-вывод в текущем потоке? Не затормозят ли они процесс? Задерживает ли перекрывающийся ввод-вывод процесс таким же образом или есть какая-то магия ОС, которую я не понимаю? Выполняются ли отказы страниц с использованием перекрывающихся операций ввода-вывода?
Я хорошо изучил следующие темы: http://msdn.microsoft.com/en-us/library/aa365199(v=vs.85).aspx (концепции ввода-вывода в управлении файлами) http://msdn.microsoft.com/en-us/library/windows/desktop/aa366556(v=vs.85).aspx (сопоставление файлов), но я не могу понять, как добиться компромисса в производительности.