我一直在阅读为什么异步 IO 比同步 IO 更好,这是因为在异步 IO 中,你的程序可以继续运行,而在同步 IO 中,你会被阻塞,直到操作完成。
我不明白这句话,因为使用同步IO(例如write())内核将数据写入磁盘 - 它本身不会发生。内核确实需要 CPU 时间才能完成此操作。
因此,在 a-sync IO 中,它也需要它,这可能会导致上下文从我的应用程序切换到内核。所以它并不是真正的阻塞,但是确实需要 cpu 周期来运行这个操作。
同步IO示例:
异步IO的例子:
我不明白这句话,因为使用同步 IO(例如 write())内核将数据写入磁盘 - 它本身不会发生。内核确实需要 CPU 时间才能完成此操作。
不会。大多数现代设备都能够自行将数据传输到 RAM 或从 RAM 传输数据(使用 DMA 或总线主控)。
举个例子;CPU 可能会告诉磁盘控制器“将 4 个扇区读入地址 0x12345000 处的 RAM”,然后 CPU 可以在磁盘控制器执行传输时执行任何其他操作(并且当磁盘控制器执行传输时,将被来自磁盘控制器的 IRQ 中断)已完成数据传输)。
然而; 对于现代系统(其中可以有任意数量的进程都希望同时使用同一设备),设备驱动程序必须维护挂起操作的列表。在这种情况下(负载下);当设备生成一个 IRQ 来表明它完成了一个操作时,设备驱动程序会通过告诉设备开始下一个“挂起的操作”来进行响应。这样,设备几乎不会花费任何时间空闲等待被要求开始下一个操作(设备利用率更高),并且 CPU 几乎将所有时间都花在做其他事情(在 IRQ 之间)。
当然,通常硬件更先进(例如,本身有一个内部操作队列,因此驱动程序可以告诉它做多个事情,并且它可以在完成前一个操作后立即开始下一个操作);而且驱动程序通常更先进(例如,具有“IO 优先级”以确保首先完成更重要的事情,而不仅仅是具有一个简单的待处理操作的 FIFO 队列)。
假设我有一个应用程序,它所做的只是获取信息并将其写入文件。使用异步 IO 代替同步 IO 有什么好处吗?
假设您从设备 A 获取信息(当 CPU 和设备 B 空闲时);然后稍微处理该信息(当设备A和设备B空闲时);然后将结果写入deviceB(当deviceA和CPU空闲时)。您可以看到大多数硬件在大部分时间里什么都不做(利用率低)。
具有异步IO;当设备A正在获取下一条信息时,CPU可以处理当前的信息,而设备B正在写入上一条信息。在理想条件下(没有速度不匹配),您可以实现 100% 的利用率(deviceA、CPU 和 deviceB 永远不会空闲);即使存在速度不匹配(例如,deviceB 需要等待 CPU 完成当前片段的处理),任何空闲时间都将被最小化(并且利用率会尽可能最大化)。
另一种选择是使用多个任务 - 例如,一个任务同步从 deviceA 获取数据,并在读取数据时通知另一个任务;第二个任务等待数据到达并对其进行处理,并在数据处理完毕后通知另一个任务;然后第三个任务等待数据处理完毕并将其同步写入 deviceB。供利用;这实际上与使用异步 IO 相同(事实上,它可以被视为“异步 IO 的模拟”)。问题在于,您增加了管理和同步多个任务的大量额外开销(更多 RAM 花费在状态和堆栈、任务切换、锁争用等上);并使代码变得更加复杂和难以维护。
| 归档时间: |
|
| 查看次数: |
2145 次 |
| 最近记录: |