繁体   English   中英

boost.asio 和文件 i/o 有什么关系?

[英]What's the deal with boost.asio and file i/o?

我注意到 boost.asio 有很多例子,涉及 sockets、串口和各种非文件示例。 谷歌并没有真正为我提供很多关于 asio 是否是执行异步文件 i/o 的好方法或有效方法的信息。

我有大量数据要异步写入磁盘。 这可以通过 Windows(我的平台)中的本机重叠 io 来完成,但我更希望有一个独立于平台的解决方案。

我很好奇如果

  1. boost.asio 有任何类型的文件支持
  2. boost.asio 文件支持对于日常文件 i/o 来说已经足够成熟了
  3. 是否会添加文件支持? outlook 是什么?

boost.asio有什么样的文件支持吗?

从(我认为)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文件是否支持日常文件i / o足够成熟?

由于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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM