在上下文切换中保存了什么?

时间:2009-06-29 10:57:33

标签: multithreading memory context-switch

在两个线程之间的上下文切换中准确保存和恢复的内容

  • 在同一过程中
  • 在两个进程之间

4 个答案:

答案 0 :(得分:11)

这是一个复杂的问题,因为答案取决于很多事情:

  1. 有问题的CPU
    • 即使在同一系列中,它也会有很大差异,例如为SSE ​​/ MMX操作添加的附加寄存器。
  2. 操作系统,因为它控制在上下文切换时触发的处理程序,并决定是否使用CPU的硬件(如果有)来辅助上下文切换。
    • 例如,Windows不使用可以为您执行大部分上下文切换存储的英特尔硬件,因为它不存储浮点寄存器。
  3. 程序启用的任何优化都可以识别它自己的要求,并能够通知操作系统
    • 也许是为了表明它没有使用FP寄存器,所以不要打扰它们
    • 在大多数RISC设计中具有相当大的寄存器文件的架构中,知道只需要这些寄存器的较小子集就有相当大的好处
  4. 至少需要保存使用中的通用寄存器和程序计数器寄存器(假设大多数当前CISC / RISC型通用CPU的通用设计)。

    请注意,尝试仅执行与上下文切换相关的最少工作量是topic of some academic interest

    Linux显然在公共领域有更多关于此的信息,尽管我的引用可能有点过时。

    有一个'task_struct',它包含大量与任务状态相关的字段以及该任务的过程。

    其中一个是'thread_struct'

      

    / *此任务的CPU特定状态* /
        - struct thread_struct thread;
           保存有关缓存TLS描述符,调试寄存器,
    的信息        故障信息,浮点,虚拟86模式或IO权限。

    每个体系结构都定义了它自己的thread_struct,它标识了保存在交换机上的寄存器和其他值。

    由于重命名寄存器的存在允许多个飞行指令(通过超标量或管道相关的架构设计),这进一步复杂化。上下文swicth的恢复阶段可能依赖于CPU的管道在初始空状态下被恢复,这样在管道中尚未退出的指令没有效果,因此可以被忽略。这使得CPU的设计更加困难。

    进程和线程之间的区别在于进程切换(总是表示所有主流操作系统中的线程切换)将需要更新内存转换信息,IO相关信息和权限相关结构。

    这些将主要指向更丰富的数据结构,因此与线程上下文切换相关的成本不会很高。

答案 1 :(得分:2)

当上下文切换在同一进程的线程之间时,保存当前线程的所有非易失性通用寄存器,并恢复新线程的那些;只有当前线程执行被中断中断时,才需要保存易失性寄存器。还应保存和恢复线程使用的任何协处理器的寄存器(例如浮点处理器) 如果切换在2个进程的线程之间,除了正常上下文切换所需的内容之外,还应该进行与内存和IO管理相关的更改;例如使用页表和页目录表实现进程所需的内存保护,每个进程都有一个唯一的页目录表地址,当进程发生变化时,必须对其进行更改。

答案 2 :(得分:1)

这取决于您正在使用的操作系统,但是您必须保存所有寄存器(包括指令计数器)的内容并加载您要切换到的线程的寄存器。

关于在同一进程中两个线程之间切换的唯一区别是,您不会丢失L1和MMU缓存的内容。

答案 3 :(得分:0)

我不确定,但如果我没记错的话,也会切换工作记忆集。