非阻塞系统调用和模式切换

时间:2017-12-27 06:46:03

标签: unix asynchronous operating-system kernel system-calls

假设我们调用异步IO的系统调用。在调用系统调用时,模式从用户模式更改为内核模式。调用后,模式应立即更改回用户模式,以便用户应用程序可以继续进行(因为它是非阻塞的)。

现在,如果模式更改为用户模式,那么当模式从内核更改为用户模式时,内核将如何继续IO?内核会在用户模式下执行异步IO吗?

2 个答案:

答案 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中编码。

另请参阅kernelnewbiesOSDEV

答案 1 :(得分:0)

异步IO将代表进程执行,内核将在进程继续运行时几乎照常处理它。在阻止模式下,该过程暂停。

内核可以访问每个进程空间,因此无论进程当前在做什么,他都可以从进程用户空间填充/读取数据。