假设我们调用异步IO的系统调用。在调用系统调用时,模式从用户模式更改为内核模式。调用后,模式应立即更改回用户模式,以便用户应用程序可以继续进行(因为它是非阻塞的)。
现在,如果模式更改为用户模式,那么当模式从内核更改为用户模式时,内核将如何继续IO?内核会在用户模式下执行异步IO吗?
答案 0 :(得分:1)
IO意味着两种不同的东西(在两个不同的抽象层次上):
从应用程序的角度来看,来自process中运行的user-mode,调用与输入相关的任何system call(在syscalls(2)中列出的Linux)输出,例如read(2),....请注意,aio_read(3)未列为系统调用(使用其他系统调用的某些库函数,请参阅aio(7))。
在原始硬件上,将数据(或订单)发送到实际IO设备(例如SATA磁盘,USB端口等等)的任何物理输入或输出操作
进程的异步或同步IO意味着只调用一些合适的系统调用子集,因为系统调用只是 方式,进程可以与内核交互,因为在用户模式下没有物理IO 直接可能。
阅读Operating Systems: Three Easy Pieces (免费下载)以更好地了解操作系统。
内核是否会在用户模式下执行异步IO?
这显示出一些混乱。实际上,在内核中,物理IO通常(并且可能总是)由interrupt handlers启动(可能会配置一些DMA等...)。硬件interrupt将处理器切换到“内核模式”(supervisor的实际ISA模式)。
阻塞系统调用(例如read(2)当需要物理IO时,因为数据不在page cache中)不会阻塞整个计算机:它只是调用进程“被阻塞“所以重新安排。内核将安排其他一些可运行的进程。很久以后,在内核处理了许多中断之后,被阻塞的进程将变为可运行的,并且可以重新安排运行。
换句话说,在概念层面,内核scheduler在一些continuation-passing style中编码。
另请参阅kernelnewbies和OSDEV。
答案 1 :(得分:0)
异步IO将代表进程执行,内核将在进程继续运行时几乎照常处理它。在阻止模式下,该过程暂停。
内核可以访问每个进程空间,因此无论进程当前在做什么,他都可以从进程用户空间填充/读取数据。