C++ 调用函数是否被视为上下文切换?

C++ 调用函数是否被视为上下文切换?,c++,c,function,context-switch,C++,C,Function,Context Switch,当我调用下面的函数时 void main(void){ Function(); } 它被认为是上下文切换,因为我在进入函数之前保存了寄存器吗?否,当内核交换进程时会发生上下文切换。调用用户空间函数将使您处于同一进程中,因此不会成为上下文切换。然而,调用内核函数需要来自内核的操作,因此它是到内核的上下文切换。上下文切换? 当我们同时进行多项任务时,我们真正做的是不断地从一项任务切换到另一项任务。这就是语境转换 这个术语起源于计算机科学。运行多线程进程的CPU会在运行另一个线程时暂时搁置给

当我调用下面的函数时

void main(void){
    Function();
}

它被认为是上下文切换,因为我在进入函数之前保存了寄存器吗?

否,当内核交换进程时会发生上下文切换。调用用户空间函数将使您处于同一进程中,因此不会成为上下文切换。然而,调用内核函数需要来自内核的操作,因此它是到内核的上下文切换。

上下文切换? 当我们同时进行多项任务时,我们真正做的是不断地从一项任务切换到另一项任务。这就是语境转换

这个术语起源于计算机科学。运行多线程进程的CPU会在运行另一个线程时暂时搁置给定线程的执行


<强调用>函数除了内核进程>/P>>P>不切换进程之前,我们问自己是否考虑了这个“上下文切换”,我们应该清理它的含义,或者更确切地说它意味着什么。 当我们谈论操作系统内核和进程时,我们可以在多种事物之间“切换”:

  • 权限级别/环/模式
  • CPU寄存器组
  • 虚拟内存区
  • 通常情况下,不止一种情况是单独发生的。模式切换非常频繁,主管调用/异常或硬件中断(例如,用于调度的计时器或外部设备)必然触发这些。在几乎每种情况下,我们都需要获得更高的特权才能真正“做点什么”

    当执行过程中出现某种异步中断时,需要存储所有CPU寄存器。主管调用不一定需要这样做,因为我们可以在调用者和被调用者之间定义调用约定,该约定在执行指令1之前注册负责备份的人。硬件中断根本不可能做到这一点,因为我们不知道它们将在何时触发:进程如何能够预见它将在接下来的t纳秒内中断,并且必须备份所有使用的寄存器

    当我们在进程之间(每个进程都有自己的地址空间)或进程与内核地址空间之间(内核也是如此)切换时,需要在虚拟内存区域之间切换。但是,管理器调用通常不需要它,因为这些调用通常映射到进程地址空间,因此只能以更高的权限(内核模式)执行,而不会“离开进程”(进程的地址空间)。2

    虽然特权级别之间的切换相当便宜(性能方面),但关闭完整的CPU寄存器集已经相当昂贵。但是,卸载完整的页面表、刷新TLB等是最昂贵的,我们会尽可能降低成本。这也是为什么线程的性能(通常)远远高于进程的原因:在线程之间切换只需要在CPU寄存器之间切换(根据具体实现,还需要短模式切换),而不需要在地址空间之间切换

    当我们阅读文献中的“语境转换”时,不幸的是,并不总是清楚这三者中的哪一个,或者哪一个组合,实际上被称为“语境转换”。据我所知,这个术语来自一个非常简化的机器模型,它不区分中断、异常/主管调用,也不区分切换CPU寄存器或地址空间。在这个模型中,我们只看到“内核[mode/space/…]”和“用户[mode/space/…]”,这两者之间的任何切换都被视为“上下文切换”

    幸运的是,您发布的场景不适合这些交换机中的任何一个,因为它是同一地址空间内的同步、无特权的函数调用,因此不需要任何交换机,只需要一个简单的调用约定,只保存那些需要保存的寄存器就足够了


    1但正如@BenVoigt正确指出的那样,这可能会带来安全隐患。这对于像
    gettimeofday()
    (cf.)这样的调用没有问题,但在其他情况下,这可能会导致机密数据泄漏到用户进程


    2一些微内核设计分派一个进程,该进程实际处理管理器调用实现,因此需要切换到此进程地址空间。

    调用函数时,一些寄存器保持原样,但其他寄存器复制到程序堆栈。从用户模式切换到内核模式并返回时,也会发生这种情况,与执行系统调用时一样,操作系统中的上下文通常指寄存器和程序堆栈,从更广泛的意义上讲,这也包括页表条目。调用另一个函数时,这些函数都不会与另一个上下文交换。在执行系统调用时,内核上下文会被引入,即使在线程之间切换时也会有上下文切换。线程是“迷你进程”,因此在这种情况下会有上下文切换(尽管它与调用函数无关)交换是完全不同的事情,甚至内核函数通常也不会留下进程地址空间。使用线程,您只需要在CPU寄存器之间切换,这可以被视为上下文切换,也可以不被视为上下文切换。这不应该被迁移,这是一个关于理论计算机科学讨论中使用的术语定义的问题,这不是一个关于行为的问题。作为一个开放性问题,这更有用:如果我将函数调用视为上下文切换,这意味着什么,以及通过这种方式思考可以收集到什么?上下文切换是一个标准化的术语。它指的是操作系统将焦点从一个进程切换到另一个进程,而不是其他进程。这与该过程的内部无关。@BenVoigt完全同意,并且从CS的角度来看,给出的答案相当不准确……关于:
    void main(void){
    只有两个有效的s