【问题标题】:Why is AIO better than select and multi-threaded IO processing? [closed]为什么 AIO 优于 select 和多线程 IO 处理? [关闭]
【发布时间】:2012-01-04 09:43:12
【问题描述】:

我读到选择和多线程编程是低性能的 IO 模型,例如 IBM developerworks article on high perfomance IO

我不明白同步/异步:阻塞/非阻塞如何提高性能。为什么 AIO 是这里的最佳选择?

【问题讨论】:

  • 我觉得这个问题很清楚。该链接包含各种 I/O 模型的比较,并说 AIOselect 更好,我也觉得这很可疑,特别是考虑到提供的一些包含忙碌等待的示例 while ( aio_error( &my_aiocb ) == EINPROGRESS ) ;
  • @avakar:您会说这里的性能与执行时间/响应能力有关吗?
  • @MatthieuM.,是的,我就是这么理解的。
  • @thiton 性能场景:假设 i)10 个线程正在使用 Unix 域套接字从 10 个客户端连续读取 4 kb 有效负载 ii) 10 个 Fd 在选择系统调用上(与上述相同的 Proto 有效负载)iii ) 10 fd 在链接中指定的 Aio 循环上..
  • @AnerudhanGopal:感谢您的问题编辑,链接和明确的问题更加清晰。 +1。

标签: c++ io


【解决方案1】:

如果从磁盘读取数据需要 x 毫秒,那么异步和/或非阻塞不会为系统内的单个 IO 操作提供任何固有的速度提升。

通过允许 IO 操作与执行的主线程有效地分开,这些方法的优势在多线程环境(或尽管延迟 IO 仍可继续操作的环境)中体现得淋漓尽致。感知到的性能提升是由于用于简单地等待 IO 返回或解除阻塞的资源数量减少。

thread 中提供了异步和非阻塞的良好比较。

【讨论】:

  • 可能有多个“执行主线程”,(参见 IOCP)。 AIO 也获胜,因为更多的工作被推入内核,因此减少了循环周期和可避免的复制。
【解决方案2】:

在等待单个 IO 完成时阻塞整个进程并不是 如果该过程可以做其他事情,则效率很高。 AIO 是 一种允许进程在系统运行时执行其他操作的方法 为它做 IO;多线程是另一个。和...之间的不同 使用多线程或使用 AIO 在很大程度上是一种设计;在一个 典型的服务器,例如,使用多线程要容易得多, 并且性能应该没有太大差异。对于他人 应用程序,AIO 可能更简单和/或提供更多性能。它是 另一个需要考虑的工具,但它并不适用于任何地方。

【讨论】:

    【解决方案3】:

    在线程环境中,单个线程阻塞的时间超过必要的时间是不好的,因为它会阻止其他线程工作。为了防止这种异步非阻塞 IO 被使用。一个通用的库是Boost.Asio

    【讨论】:

    • 当单个线程无限期阻塞以进行“读取”或“接收”时,其他线程不是让 CPU 来计算..??我认为(我仍然印象深刻)线程必须放弃 CPU,除非并且直到阻塞被从内核到该线程的某种信号移除..
    • 为什么一个线程阻塞会占用其他线程?它不能保存互斥锁等,否则你将无法使用 AIO 编写相同的代码。
    【解决方案4】:

    考虑一下:当你的程序到达需要等待用户输入一些文本的地步时,你有两个选择:等到他输入,而此时 CPU 什么都不做,或者你可以阻塞当前程序并使用 CPU做其他有用的计算。用户输入后,您可以取消阻止程序并继续。这样可以提高性能。

    【讨论】:

    • “你有两个选择:等到他做,而CPU同时什么都不做”..到那时不是会隐式调用其他线程吗??
    • @AnerudhanGopal,你是对的,这不是什么都没有,其他线程也会有机会,但是由于 IO 线程每次有机会时都不会阻塞它会浪费 CPU,直到用户输入一些东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2011-04-16
    • 1970-01-01
    相关资源
    最近更新 更多