加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

多线程 – 上下文切换中保存的内容?

发布时间:2020-12-15 00:03:01 所属栏目:Java 来源:网络整理
导读:在两个线程之间的上下文切换中精确保存和恢复的内容 在同一个过程中 两个进程之间 解决方法 这是一个相当复杂的问题,因为答案取决于许多事情: 有问题的CPU 即使在同一个系列中也可能有很大差异,例如为SSE ??/ MMX操作添加的附加寄存器. 操作系统,因为它控制
在两个线程之间的上下文切换中精确保存和恢复的内容

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

解决方法

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

>有问题的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相关信息和权限相关的结构.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读