[英]What's the deal with boost.asio and file i/o?
我注意到 boost.asio 有很多例子,涉及 sockets、串口和各种非文件示例。 谷歌并没有真正为我提供很多关于 asio 是否是执行异步文件 i/o 的好方法或有效方法的信息。
我有大量数据要异步写入磁盘。 这可以通过 Windows(我的平台)中的本机重叠 io 来完成,但我更希望有一个独立于平台的解决方案。
我很好奇如果
从(我认为)Boost 1.36(包含Asio 1.2.0)开始,您可以使用[boost :: asio ::] windows :: stream_handle或windows :: random_access_handle来包装HANDLE并对其执行异步读写方法在内部使用OVERLAPPED结构。
用户Lazin还提到了可以用于异步操作的boost :: asio :: windows :: random_access_handle(例如命名管道,还有文件)。
由于Boost.Asio本身现在被广泛使用,并且实现在内部使用重叠IO,我会说是的。
由于在Asio网站上找不到路线图,我会说Boost.Asio没有新增功能。 虽然贡献者总是有机会向Boost.Asio添加代码和类。 也许你甚至可以自己贡献缺失的部分! :-)
Linux上的boost :: asio文件i / o
在Linux上,asio使用epoll
机制来检测套接字/文件描述符是否已准备好进行读/写。 如果您尝试在Linux上的常规文件上使用vanilla asio,则会出现“不允许操作”异常,因为epoll不支持Linux上的常规文件 。
解决方法是配置asio以在Linux上使用select
机制。 您可以通过定义BOOST_ASIO_DISABLE_EPOLL
来完成此BOOST_ASIO_DISABLE_EPOLL
。 如果您正在使用大量开放套接字,那么选择此处的权衡往往比epoll慢 。 使用open()
定期打开文件,然后将文件描述符传递给boost::asio::posix::stream_descriptor
。
Windows上的boost :: asio文件i / o
在Windows上,您可以使用boost::asio::windows::object_handle
来包装从文件操作创建的Handle
。 见例子 。
ASIO支持Windows上支持良好的重叠I / O. 在Unix上,由于以下原因,这个想法停滞不前:
一个常见的例外是将文件直接提供给套接字。 这是一个常见的特殊情况,Linux有一个内核函数可以为你处理这个问题。 再次,否定使用异步文件I / O的原因。
简而言之:ASIO似乎反映了底层的OS设计理念,大多数Unix开发人员忽略了重叠的I / O,因此该平台不支持它。
boost :: asio :: windows :: random_access_handle是最简单的方法,如果你需要一些高级的东西,例如异步LockFileEx或其他东西,你可以扩展asio,添加你自己的异步事件。 例
Linux有一个asio库,这个作业并不比Windows API更难使用(我已经使用过了)。 两组操作系统都实现相同的概念架构。 它们与编写一个好的库相关的细节不同,但是不能为两个OS平台都设置一个通用接口(我已经使用了一个)。
基本上,所有类型的异步文件I / O都遵循“Fry Cook”架构。 这就是我在Read op的上下文中的意思:我(处理线程)进入快餐柜台(OS)并要求一个芝士汉堡(一些数据)。 它给了我一张我的订单(一些数据结构)的副本,然后在厨师(内核和文件系统)的后面发出一张票来煮我的汉堡。 然后我坐下来或看我的电话(做其他工作)。 后来,有人宣布我的汉堡已准备好(向处理线程发出信号)并收集食物(读取缓冲区)。
io_uring 改变了一切。
asio 现在支持异步文件读/写。
请参阅发行说明:
asio 1.21.0 发布说明
Asio 1.21 似乎添加了内置文件系统支持。
例如, asio::stream_file现在与您期望的所有异步方法一起存在。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.