gpt4 book ai didi

c - 为什么 `aio_write` 不允许并发缓冲区访问?

转载 作者:太空宇宙 更新时间:2023-11-04 07:55:08 24 4
gpt4 key购买 nike

Linux man-page for aio_write

The buffer area being written out must not be accessed during the operation or undefined results may occur.

我强调的是“访问”,严格解释它不仅是存储到缓冲区,而且是从缓冲区加载。

Mac OS X 上的手册页说

Modifications of the Asynchronous I/O Control Block structure or the buffer contents after the request has been enqueued, but before the request has completed, are not allowed.

这听起来更合理一些;可以读取缓冲区,但不能修改。不过,违规的后果仍然含糊不清。

考虑到这可能如何在操作系统中实现,我无法理解为什么读取访问会成为问题,而我可以从并发写入中想象的唯一问题是实际写入的数据可能是任意的混合初始缓冲区内容和并发存储到缓冲区。

然而,未定义的行为带来了很多可能性,考虑到这一点,我们可以在访问时获取 SIGSEGV(底层页面被锁定以防止并发访问?),或者读取可能返回垃圾数据(文件系统在-放置加密或压缩?),或者文件可能留下永久不可读的 block ( block 校验和,然后同时修改,然后写出?)。未定义的行为甚至不排除使存储设备固件或操作系统崩溃。

我的问题是,考虑到我们拥有的系统和硬件,实际上、合理地会发生什么?我假设语言是故意含糊不清的,以免限制 future 的实现。

最佳答案

Linux、BSD(MacOS 是一种 BSD 风格)、POSIX 有不同的说法。

POSIX 表示:

For any system action that changes the process memory space while an asynchronous I/O is outstanding to the address range being changed, the result of that action is undefined.

Linux 手册似乎更严格,有两种可能:

  1. 这是解释的问题。作者可能想过 write accesses 但只是写了 accesses,
  2. 它可能是任何访问,因为实现可以自由使用任何可能禁止任何访问的机制(IO 期间的严格锁定或保护)。

BSD 还说:

If the request is successfully enqueued, the value of iocb-_aio_offset can be modified during the request as context, so this value must not be referenced after the request is enqueued

因此明确禁止某些读访问(对控制结构)。

正如 Martin 在评论中所说:我不知道为什么有人想要在 I/O 完成通知之前访问结构/缓冲区。但它也太严格了:好吧,这对写访问来说是明确的,但是可以想象(虽然不常见)您希望在期间对缓冲区进行读访问的场景IO(在显示时写入帧缓冲区内容 - 或类似内容)。

无论如何,如果您违反限制,可能会发生任何不好的事情,所以请不要违反。

关于c - 为什么 `aio_write` 不允许并发缓冲区访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50680679/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com