Zep*_*hyr 2 unix operating-system kernel asynchronous system-calls
假设我们调用异步 IO 的系统调用。调用系统调用时,模式从用户态转变为内核态。调用后,模式应立即更改回用户模式,以便用户应用程序可以进一步执行(因为它是非阻塞的)。
现在,如果模式更改为用户模式,那么当模式从内核更改为用户模式时,内核将如何处理 IO?内核会在用户模式下执行异步IO吗?
IO 意味着两个不同的事物(在两个不同的抽象级别):
从应用程序的角度来看,从在用户模式下运行的进程,调用与输入或输出相关的任何系统调用( Linux 的syscalls(2)中列出),例如read(2),...请注意aio_read( 3)未列为系统调用(它是使用其他系统调用的某些库函数,请参阅aio(7))。
在原始硬件上,任何向实际 IO 设备(例如 SATA 磁盘、USB 端口等)发送数据(或命令)的物理输入或输出操作
进程的异步或同步 IO 意味着只调用系统调用的一些合适的子集,因为系统调用是进程与内核交互的唯一方式,并且在用户模式下不可能直接进行物理 IO 。
阅读操作系统:三篇简单文章(可免费下载)以更好地了解操作系统。
内核会在用户模式下执行异步IO吗?
这显示出一些混乱。实际上,在内核内部,物理 IO 通常(并且可能总是)由中断处理程序(可能配置一些DMA等)启动。硬件中断将处理器切换到“内核模式”(实际上是ISA的管理模式)。
阻塞系统调用(例如,当需要物理IO时,因为数据不在页面缓存中,所以read(2))不会阻塞整个计算机:只是调用进程变得“阻塞”,因此被重新调度。内核将调度一些其他可运行的进程。很久以后,在让内核处理许多中断之后,被阻止的进程将变得可运行,并且可以重新安排运行。
进程本身(和文件)是应用程序代码的主要抽象(由内核提供)之一。
换句话说,在概念层面上,内核调度程序以某种连续传递风格进行编码。
另请参阅kernelnewbies和OSDEV。