在两个线程之间的上下文切换中准确保存和恢复的内容
答案 0 :(得分:11)
这是一个复杂的问题,因为答案取决于很多事情:
至少需要保存使用中的通用寄存器和程序计数器寄存器(假设大多数当前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)
我不确定,但如果我没记错的话,也会切换工作记忆集。