这个问题是关于低级异步 I/O 系统调用,如 send + epoll/aio_read 等。我问的是网络 I/O 和磁盘 I/O。
实现这些异步调用的简单方法是为每个异步 I/O 请求创建一个线程,然后以同步方式执行请求。显然,这种幼稚的解决方案无法应对大量并行请求。即使使用了线程池,我们仍然需要为每个并行请求设置一个线程。
因此,我推测这是通过以下更有效的方式完成的:
对于写入/发送数据:
将发送请求附加到一些内核内部的异步 I/O 队列。
专用的“写入线程”以这样一种方式接收这些发送请求,从而充分利用目标硬件。为此,可能会使用特殊的 I/O 调度程序。
根据目标硬件,写入请求最终会被分派,例如通过直接内存访问 (DMA)。
对于读取/接收数据:
硬件引发一个 I/O 中断,该中断跳转到内核的 I/O 中断处理程序中。
中断处理程序将通知附加到读取队列并快速返回。
专用的“读取线程”接收读取队列的通知并执行两个任务:1) 如有必要,将读取的数据复制到目标缓冲区。2.) 必要时以某种方式通知目标进程(egepoll、signals、..)。
对于所有这一切,没有必要拥有比 CPU 内核数量更多的写入线程或读取线程。因此,并行请求可伸缩性问题将得到解决。
这是如何在真实的操作系统内核中实现的?这些猜测中哪些是正确的?