>在同一个过程中
>两个进程之间
解决方法
>有问题的cpu
>即使在同一个系列中也可能有很大差异,例如为SSE / MMX操作添加的附加寄存器.
>操作系统,因为它控制在上下文切换中触发的处理程序,并决定是否使用cpu的硬件(如果有)来辅助上下文切换.
>例如Windows不使用可以为您做大量上下文切换存储的Intel硬件,因为它不存储浮点寄存器.
>程序启用的任何优化,意识到自己的要求,并能够通知操作系统
>也许是指示它不使用FP寄存器,所以不要打扰他们
>在具有大量RISC设计的大量寄存器文件的架构中,知道您只需要这些寄存器的较小子集就可以获得相当大的收益
至少使用通用寄存器和程序计数器寄存器将需要保存(假设大多数现有的CISC / RISC风格的通用cpu的通用设计).
注意,尝试仅对上下文切换进行最小的努力是topic of some academic interest
Linux显然在公共领域有更多的信息可用,尽管我的引用可能有点过时了.
这是一个task_struct,它包含与任务状态相关的大量字段以及任务所用的进程.
其中一个是thread_struct
/* cpu-specific state of this task */
– struct thread_struct thread;
holds information about cache TLS descriptors,debugging registers,
fault info,floating point,virtual 86 mode or IO permissions.
每个架构定义它自己的thread_struct,它标识保存在交换机上的寄存器和其他值.
这通过存在允许多个飞行指令(通过超标量或管道相关的架构设计)的重命名寄存器而进一步复杂化.上下文swicth的恢复阶段可能会依赖cpu的流水线恢复到初始的空状态,这样在管道中还没有退出的指令没有任何效果,因此可以忽略.这使得cpu的设计变得更加困难.
进程和线程之间的区别在于,进程切换(总是意味着所有主流操作系统中的线程切换)将需要更新内存转换信息,IO相关信息和权限相关的结构.
这些将主要是指向更丰富的数据结构的指针,因此与线程上下文切换相关的成本将不会很高.