非阻塞系统调用和模式切换
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了非阻塞系统调用和模式切换相关的知识,希望对你有一定的参考价值。
假设我们调用异步IO的系统调用。在调用系统调用时,模式从用户模式更改为内核模式。调用之后,模式应立即更改回用户模式,以便用户应用程序可以继续进行(因为它是非阻塞的)。
现在,如果模式更改为用户模式,那么当模式从内核更改为用户模式时,内核将如何继续IO?内核会在用户模式下执行异步IO吗?
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中编码。
异步IO将代表进程执行,内核将在进程继续运行时几乎照常处理它。在阻止模式下,该过程暂停。
内核可以访问每个进程空间,因此无论进程当前在做什么,他都可以从进程用户空间填充/读取数据。
以上是关于非阻塞系统调用和模式切换的主要内容,如果未能解决你的问题,请参考以下文章