В чем дело с boost.asio и файловым вводом-выводом?
-
22-08-2019 - |
Вопрос
Я заметил, что в boost.asio есть много примеров, связанных с сокетами, последовательными портами и всевозможными примерами, не относящимися к файлам.Google на самом деле не нашел для меня много упоминаний о том, является ли asio хорошим или допустимым подходом для выполнения асинхронного ввода-вывода файлов.
У меня есть огромное количество данных, которые я хотел бы записать на диск асинхронно.Это можно сделать с помощью встроенного ввода-вывода с перекрытием в Windows (моя платформа), но я бы предпочел иметь независимое от платформы решение.
Мне любопытно, если
- boost.asio поддерживает любые файлы
- поддержка файлов boost.asio достаточно развита для повседневного ввода-вывода файлов
- Будет ли когда-нибудь добавлена поддержка файлов?Каковы перспективы этого?
Решение
Поддерживает ли boost.asio какие-либо файлы?
Начиная с (я думаю) Boost 1.36 (который содержит Asio 1.2.0), вы можете использовать [boost::asio::]windows::stream_handle или windows::random_access_handle для переноса дескриптора и выполнения в нем асинхронных методов чтения и записи, которые используют перекрывающуюся структуру внутри.
Пользователь Lazin также упоминает boost::asio::windows::random_access_handle, который может использоваться для асинхронных операций (напримерименованные каналы, но также и файлы).
Достаточно ли развита поддержка файлов boost.asio для повседневного ввода-вывода файлов?
Как Boost.Сам по себе Asio в настоящее время широко используется, и реализация использует перекрывающийся ввод-вывод внутри, я бы сказал, да.
Будет ли когда-нибудь добавлена поддержка файлов?Каковы перспективы этого?
Поскольку дорожная карта не найдена на Asio ( Азио ) веб-сайт, я бы сказал, что новых дополнений к Boost не будет.Asio для этой функции.Хотя всегда есть вероятность, что участники добавят код и классы в Boost.Asio.Может быть, вы даже сможете сами внести недостающие части!:-)
Другие советы
boost:: ввод-вывод файлов asio в Linux
В Linux asio использует epoll
механизм определения того, готов ли дескриптор сокета / файла к чтению / записи.Если вы попытаетесь использовать vanilla asio для обычного файла в Linux, вы получите исключение "операция не разрешена", потому что epoll не поддерживает обычные файлы в Linux.
Обходной путь заключается в настройке asio для использования select
механизм в Linux.Вы можете сделать это, определив BOOST_ASIO_DISABLE_EPOLL
.Компромисс здесь заключается в том, что select, как правило, работает медленнее, чем epoll если вы работаете с большим количеством открытых сокетов.Регулярно открывайте файл с помощью open()
а затем передайте файловый дескриптор в boost::asio::posix::stream_descriptor
.
boost:: ввод-вывод файлов asio в Windows
В Windows вы можете использовать boost::asio::windows::object_handle
чтобы обернуть Handle
это было создано в результате файловой операции.Видишь пример.
ASIO поддерживает перекрывающийся ввод-вывод в Windows, где поддержка хорошая.В Unix эта идея застопорилась из-за:
- Файлы часто находятся на одном и том же физическом устройстве, поэтому предпочтительнее получать к ним доступ последовательно.
- Запросы на файлы часто выполняются очень быстро, потому что они физически находятся рядом.
- Файлы часто имеют решающее значение для завершения основной работы программы (напримерчтение в его файле конфигурации должно быть выполнено перед дальнейшей инициализацией)
Единственным распространенным исключением является отправка файлов непосредственно в сокеты.Это такой распространенный особый случай, что Linux имеет функция ядра который справится с этим за вас.Опять же, отрицая причину использования асинхронного файлового ввода-вывода.
Короче говоря:ASIO, по-видимому, отражает основополагающую философию проектирования операционной системы, при этом дублированный ввод-вывод игнорируется большинством разработчиков Unix, поэтому он не поддерживается на этой платформе.
boost::asio::windows::random_access_handle - самый простой способ сделать это, если вам нужно что-то продвинутое, например, асинхронный LockFileEx или что-то еще, вы можете расширить asio, добавив свои собственные асинхронные события. пример
В Linux есть библиотека asio, которую использовать для этой работы не сложнее, чем Windows API (я использовал ее).Оба набора операционных систем реализуют одну и ту же концептуальную архитектуру.Они отличаются деталями, которые имеют отношение к написанию хорошей библиотеки, но не до такой степени, чтобы у вас не могло быть общего интерфейса для обеих платформ ОС (я использовал одну).
По сути, все варианты асинхронного файлового ввода-вывода соответствуют архитектуре "Fry Cook".Вот что я имею в виду в контексте операции чтения:Я (поток обработки) подхожу к стойке быстрого питания (OS) и прошу чизбургер (некоторые данные).Он выдает мне копию моего билета на заказ (некоторая структура данных) и выдает обратный билет повару (ядро и файловая система), чтобы приготовить мой бургер.Затем я сажусь или читаю свой телефон (занимаюсь другой работой).Позже кто-то объявляет, что мой бургер готов (сигнал потоку обработки), и я забираю свою еду (буфер чтения).