Linux kernel 如何在内核中高效地实现异步I/O
这个问题是关于低级异步I/O系统调用的,比如send+epoll/aio_read和其他调用。 我询问的是网络I/O和磁盘I/O 实现这些异步调用的简单方法是为每个异步I/O请求创建一个线程,然后以同步方式执行请求。 显然,这种幼稚的解决方案在大量并行请求的情况下伸缩性很差。 即使使用了线程池,我们仍然需要为每个并行请求使用一个线程 因此,我推测这是通过以下更有效的方式实现的: 对于写入/发送数据:Linux kernel 如何在内核中高效地实现异步I/O,linux-kernel,operating-system,kernel,low-level-io,Linux Kernel,Operating System,Kernel,Low Level Io,这个问题是关于低级异步I/O系统调用的,比如send+epoll/aio_read和其他调用。 我询问的是网络I/O和磁盘I/O 实现这些异步调用的简单方法是为每个异步I/O请求创建一个线程,然后以同步方式执行请求。 显然,这种幼稚的解决方案在大量并行请求的情况下伸缩性很差。 即使使用了线程池,我们仍然需要为每个并行请求使用一个线程 因此,我推测这是通过以下更有效的方式实现的: 对于写入/发送数据: 将发送请求附加到某个内核内部异步I/O队列 专用的“写线程”以这样一种方式接收这些发送请求,从
- 将发送请求附加到某个内核内部异步I/O队列
- 专用的“写线程”以这样一种方式接收这些发送请求,从而充分利用目标硬件。为此,可以使用特殊的I/O调度程序
- 根据目标硬件,写入请求最终被调度,例如通过直接内存访问(DMA)
- 硬件引发一个I/O中断,该中断跳转到内核的I/O中断处理程序中
- 中断处理程序向读取队列追加通知并快速返回
- 专用“读取线程”拾取读取队列的通知并执行两项任务:1)必要时将读取数据复制到目标缓冲区。2.)必要时以某种方式通知目标进程(如epoll、信号等)
这是如何在真正的操作系统内核中实现的?这些推测中哪一个是正确的?那些“异步”I/O内容是内核和驱动程序服务的另一个假象。我将以wifi驱动程序为例。(即网络)
“同步I/O”主要在上层应用层进行模拟。所以,若你们在内核中重新编写套接字层,你们可以做任何你们想做的事情,因为底层已经按照你们的要求工作了。“这在真正的操作系统内核中是如何实现的?”-对于堆栈溢出来说,这个话题太宽泛了。您使用了“linux内核”标记,您没有试着阅读linux内核中的I/O吗?例如,请参阅有关为块设备编写驱动程序的文档。