有关异步IO调用的更多详细信息

时间:2016-01-31 06:18:22

标签: multithreading asynchronous reactive-programming

无论我如何看待异步性,我仍然想出某种并发性。

This guy here说异步性可以有两种形式:

  • 模拟异步性(让我这样称呼) - 一个线程被生成用于某些操作的异步执行。对我而言,这是一种假的异步性,它与并发性相似。我在这里看不到任何真正的好处。

  • 硬件支持asynch - 请求只是转发到硬件(如硬盘或网卡)和控制 执行立即返回CPU。当IO操作准备就绪时,将通知CPU并执行回调。 如果您考虑一个单独的IO请求,这似乎没问题,但如果我尝试扩展多个IO请求的示例,那么我仍然只能达到并发 已将相关内容转发给硬件。 这是两个异步IO调用的图表:

    1. CPU ----- io async req 1 ----->硬件
    2. CPU< ------返回控件(无数据)-------硬件
    3. CPU ----- io async req 2 ------>硬件
    4. CPU< ------返回控件(无数据)-------硬件
    5. CPU在硬件执行两个IO任务时执行其他操作
    6. CPU< ------- req 1的数据-------硬件
    7. CPU执行回调
    8. CPU执行其他操作
    9. CPU< -------- req 2的数据-------硬件
    10. CPU执行回调

如您所见,在第5行,硬件同时处理两个任务,因此并发性已传输到硬件。所以,正如我所说,无论我如何看待异步性,我仍然会提出某种并发性,当然这次不是处理它的CPU而是IO硬件。

我错了吗? IO硬件是否接受并发?
如果是的话,IO硬件提供的并发性是否比CPU的并发性好得多? 如果没有,那么硬件同步执行多个IO操作,在这种情况下,我没有看到异步性与并发性的好处。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

异步IO主要是在IO期间不必存在线程。想象一下服务器等待1000000个TCP连接以便数据到达。每个连接一个线程就会消耗大量内存。

相反,发布了无线程异步IO,它只是一个小型数据结构。它是操作系统的注册,上面写着“如果数据到达,请回电话”。

IO映射到硬件操作的方式各不相同。某些硬件可能内置并发。我的SSD肯定有,因为它上面有多个独立的闪存芯片。其他硬件可能无法同时处理多个IO。较旧的磁盘没有这样做。简单的NIC没有并发性。在这里,驱动程序或操作系统将序列化请求。

但这与启动IO的方式无关。对于基于线程和无线程的IO来说,它是一样的。驱动程序和硬件通常无法区分(或者不关心)。

异步IO是关于拥有更少的线程。这根本不是以不同方式驱动硬件。

答案 1 :(得分:1)

看起来您根本不了解异步I / O.以下是异步I / O可能如何工作的典型示例:

线程正在运行。它想通过网络发送一些数据。它执行异步网络读取操作。对操作系统的调用报告尚未准备好数据,但安排在某些数据准备就绪时通知。线程一直运行,直到数据到达网卡。网卡产生一个中断,中断处理程序调度到代码,该代码注意到有一个待处理的异步读取,它将一个事件信号表示读取已完成。之后,该线程完成了当时必须完成的所有工作,因此它会检查事件。它看到读取完成,获取数据,处理它,并进行另一次异步读取。

该线程可能在任何特定时间都有许多待处理的异步I / O操作。