微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

解决方法

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


应用场景 C端用户提交工单、工单创建完成之后、会发布一条工单创建完成的消息事件(异步消息)、MQ消费者收到消息之后、会通知各处理器处理该消息、各处理器处理完后都会发布一条将该工单写入搜索引擎的消息、最终该工单出现在搜索引擎、被工单处理人检索和处理。 事故异常体现 1、异常体现 从工单的流转记录发现、
线程类,设置有一个公共资源 package cn.org.chris.concurrent; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @Descrip
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量
Java 9中JShell中的不同启动脚本是什么?
使用Java的位填充错误检测技术
java中string是什么
如何使用Java中的JSON-lib API将Map转换为JSON对象?