文章目录

  • 导致原因
  • 开销
  • 如何减少上下文切换

即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的执行时间,因为事件片非常短,所有CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行,时间片一般 几十毫秒 (ms)。

CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切回这个任务时,可以再加载这个任务的状态。所以任务 从保存到再加载的过程就是一次上下文切换。

这就像我们同时读两本书,当我们在读一本英文的技术书时,发现某个单词不认识,于是便打开中英文字典,但是在放下英文技术书之前,大脑必须先记住这本书读到了多少页的第多少行,等查完单词之后,能够继续读这本书。这样的切换是会影响读书效率的,同样上下文
切换也会影响多线程的执行速度。

导致原因

1.自发性切换

线程由于自身原因切出。

  • Thread.sleep
  • wait
  • Thread.yield
  • Thread.join
  • LockSupport.park
  • 发起了IO操作如读文件
  • 等待其他线程持有的锁
  1. 非自发性切换

线程由于调度器的原因被迫切出

  • 被切出的时间片用完
  • 比被切出线程的优先级更高的线程需要被运行

开销

  1. 直接开销
  • 操作系统保存和恢复上下文所需的开销
  • 线程调度器 进行线程调度的开销: 比如按照一定的规则决定哪个线程会占用处理器运行
  1. 间接开销
  • 处理器高速缓存重新加载的开销
  • 上下文切换也可能导致一级高速缓存中的内容被冲刷

如何减少上下文切换

  1. 无锁并发编程
    多线程竞争时,会一起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,如将数据的ID按照Hash的算法取模分段,不同的线程处理不同段的数据。

  2. CAS
    java的Atomic包 使用CAS算法来更新数据,而不需要加锁

  3. 使用最少线程
    避免创建不需要的线程,比如人物很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态。

  4. 协程

在单线程里实现多任务调度,并在单线程里维持多个任务间的切换

什么是上下文切换?如何减少上下文切换?相关推荐

  1. 减少上下文切换和避免死锁简述

    title: 减少上下文切换和避免死锁简述 date: 2021/8/13 线程有创建和上下文切换的开销: 如何减少上下文切换? 无锁并发编程.多线程竞争锁时,会引起上下文切换,所以多线程切换数据时, ...

  2. 如何减少上下文切换?

    什么是上下文切换? 上下文换指的是操作系统的核心,在CPU上对进程或者线程进行切换的意思.上下文切换过程中的信息被保存在进程控制块中的. 理解上下文切换 首先,大家不管在单核或多核处理器都支持多线程执 ...

  3. Linux中断与进程切换,结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程...

    @ 实验环境 OS Linux cj-virtual-machine 5.3.0-51-generic 虚拟机 QEMU 内核版本 5.3.4 调式方法 GDB PS:调试环境安装请看上一篇博客汇编级 ...

  4. mysql上下文切换_进程上下文切换开销

    进程是我们开发同学非常熟悉的概念,我们可能也听说过进程上下文切换开销.那么今天让我们来思考一个问题,究竟一次进程上下文切换会吃掉多少CPU时间呢?线程据说比进程轻量,它的上下文切换会比进程切换节约很多 ...

  5. 查看java上下文切换,线程的上下文切换,多线程频繁上下文切换

    线程的上下文切换,多线程频繁上下文切换 利用时间片轮转的方式,CPU给每个任务都服务一定的时间,然后把当前任务的状态保存下来,在加载下一个任务后,继续服务下一个任务,这个过程叫做上下文切换. 时间片轮 ...

  6. linux 上下文切换时间,CPU上下文切换的次数和时间(context switch)

    什么是CPU上下文切换?css 如今linux是大多基于抢占式,CPU给每一个任务必定的服务时间,当时间片轮转的时候,须要把当前状态保存下来,同时加载下一个任务,这个过程叫作上下文切换.时间片轮转的方 ...

  7. linux进程上下文切换的具体过程,Linux实验三 结合中断上下文切换和进程上下文切换分析Linux内核一般执行过程...

    fork系统调?创建?进程,也就?个进程变成了两个进程,两个进程执?相同的代码,只是fork系统调?在?进程和?进程中的返回值不同. 打开linux-5.4.34/arch/x86/entry/sys ...

  8. mysql 上下文切换_线程上下文切换

    今天为了获取一张图片,用了一段代码: ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateV ...

  9. 如何减少CPU上下文切换

    1.减少上下文切换的方法有 1.无锁并发编程 多线程竞争时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,将数据Id按hash算法取模来分段,不同的线程处理不同时端的数据 2.C ...

最新文章

  1. spark+openfire即时通讯工具二次开发参考文档
  2. hdu 5512 Pagodas
  3. 吴裕雄 python 神经网络——TensorFlow 图、张量及会话
  4. android png转灰度,Android提高之使用NDK把彩图转换灰度图的方法
  5. shell获取文件扩展名(前缀,后缀)
  6. python输入时间_一文搞懂python日期时间处理
  7. Oracle正确迁移数据文件,Oracle数据文件迁移知多少?
  8. Springboot+CAS下Session过期无效,页面请求302问题解决
  9. mac黑白打印和彩色打印
  10. 【数据结构与算法分析】——java语言描述(1)
  11. 美化字体 css3,美化你空间的文字:20种CSS字体镜像特效
  12. chrome F12开发者工具 (二)preview 与response的区别
  13. “一键GHOST”系统备份与恢复 一键GHOST使用方法 - 绿色软件联盟 - 绿色免费共享
  14. 2021年网络规划设计师论文真题
  15. 628 小媛在努力【水题】
  16. 【完整项目搭建】基于vue-cli实现vue前端搭建考试系统——①创建vue-cli实现项目搭建
  17. 职教云python题和答案_智慧职教云课堂Python程序设计试题及答案
  18. 小米官网导航栏的实现
  19. django+xadmin 在线教育网站(三)
  20. 爱立信携手KDDI加速蜂窝物联网发展:成功验证LPWA技术

热门文章

  1. 自动驾驶系统进阶与项目实战(十)基于PointPillars的点云三维目标检测和TensorRT实战(1)
  2. 天地图 添加遮罩层效果
  3. PAT乙级题库踩坑实录
  4. Linux 下安装 Tomcat 6(zhuang)
  5. Android通过OMA获得ESE的CPLC
  6. SpringCloud Alibaba Sentinel实现熔断与断流
  7. QMT量化交易软件使用攻略(二)-策略编写
  8. Python基础教程(第2版)读书笔记
  9. 职业梦想是计算机的英语作文,我梦想的职业高中英语作文
  10. mysql1064错误_Mysql1064错误