假设我们调用异步IO的系统调用。在调用系统调用时,模式从用户模式更改为内核模式。调用之后,模式应立即更改回用户模式,以便用户应用程序可以继续进行(因为它是非阻塞的)。
现在,如果模式更改为用户模式,那么当模式从内核更改为用户模式时,内核将如何继续IO?内核会在用户模式下执行异步IO吗?
IO意味着两种不同的东西(在两个不同的抽象层次上):
进程的异步或同步IO意味着只调用一些合适的系统调用子集,因为系统调用是进程与内核交互的唯一方式,因为在用户模式下,没有直接可能的物理IO。
阅读Operating Systems: Three Easy Pieces(可免费下载)以更好地查看操作系统。
内核会在用户模式下执行异步IO吗?
这显示出一些混乱。实际上,在内核中,物理IO通常(并且可能总是)由interrupt handlers(可能配置一些DMA等)启动。硬件interrupt将处理器切换到“内核模式”(实际上是supervisor的ISA模式)。
阻塞系统调用(例如,当数据不在read(2)中时需要物理IO时为page cache)不会阻塞整个计算机:它只是调用进程被“阻塞”,因此被重新调度。内核将安排其他一些可运行的进程。很久以后,在内核处理了许多中断之后,被阻塞的进程将变为可运行的并且可以被重新安排以运行。
换句话说,在概念层面,内核scheduler在一些continuation-passing style中编码。
异步IO将代表进程执行,内核将在进程继续运行时几乎照常处理它。在阻止模式下,该过程暂停。
内核可以访问每个进程空间,因此无论进程当前在做什么,他都可以从进程用户空间填充/读取数据。