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

问题描述 投票:1回答:2

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

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

unix asynchronous operating-system kernel system-calls
2个回答
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将处理器切换到“内核模式”(实际上是supervisorISA模式)。

阻塞系统调用(例如,当数据不在read(2)中时需要物理IO时为page cache)不会阻塞整个计算机:它只是调用进程被“阻塞”,因此被重新调度。内核将安排其他一些可运行的进程。很久以后,在内核处理了许多中断之后,被阻塞的进程将变为可运行的并且可以被重新安排以运行。

换句话说,在概念层面,内核scheduler在一些continuation-passing style中编码。

另见kernelnewbiesOSDEV


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.