什么是上下文切换?

上下文换指的是操作系统的核心,在CPU上对进程或者线程进行切换的意思。上下文切换过程中的信息被保存在进程控制块中的。

理解上下文切换

首先,大家不管在单核或多核处理器都支持多线程执行代码,然后CPU通过给每个线程分配CPU时间片来实现这个过程的。什么是时间片,时间片是CPU分配给各个线程的时间,时间片非常短。所以我们是平还是感觉不到,CPU不停切换线程执行,时间片一般就是几十毫秒,就那么一瞬间。

如何减少上下文切换

减少“上下文切换”常用有这种方法:无锁并发编程、CAS算法、使用最少线程和使用协程

  • 无锁并发编程:就是多线程竞争锁时,会引起上下文切换,多线程处理数据时,可以用一 些办法来避免使用锁,如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。
  • CAS算法:Java的Atomic包使用CAS算法来更新数据,就是它在没有锁的状态下,可以保证多个线程对一个值的更新。
  • 使用最少线程:避免创建不需要的线程。
  • 协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。

上下文切换的消耗

下文切换,它是需要相当可观的处理器时间的。当在每秒几十上百次的切换中,每次切换都需要纳秒量级的时间,所以时间是非常短,很多时候,我们是观察不到 变化的。因此,对于上下文切换,会给系统带来的是消耗大量的CPU时间。

上下文切换带来的问题

除了进程需要上下文切换,其实还有一种上下文切换,那就是操作系统检测到中断、异常、系统调用时发生的,以及包括IO设备引起的中断,应用程序主动发起系统调用(如文件读写)等等。如果操作系统检测到中断异常系统调用的信号后,会通过中断向量表找到对应的处理程序,然后切换成处理程序进程,处理完成后再切换回来。

其实在系统调用时候,可能还会有用户态到内核态的切换,这个过程更加为复杂。在普通上下文,它会的开销比普通上下文切换代价更大了。

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

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

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

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

    文章目录 导致原因 开销 如何减少上下文切换 即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制.时间片是CPU分配给各个线程的执行时间,因为事件片非常短,所有C ...

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

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

  4. Java多线程的上下文切换

    转载自 https://blog.csdn.net/fuyuwei2015/article/details/71860349 对于上下文切换不同的操作系统模式也不尽相同,这里我们只讨论Unix系统,在 ...

  5. java 优化线程_Java | 多线程调优(下):如何优化多线程上下文切换?

    通过上一讲的讲解,相信你对上下文切换已经有了一定的了解了.如果是单个线程,在 CPU 调用之后,那么它基本上是不会被调度出去的.如果可运行的线程数远大于 CPU 数量,那么操作系统最终会将某个正在运行 ...

  6. 关于线程上下文切换,你知道多少?

    点击关注公众号,实用技术文章及时了解 由于现在大多计算机都是多核CPU,多线程往往会比单线程更快,更能够提高并发,但提高并发并不意味着启动更多的线程来执行.更多的线程意味着线程创建销毁开销加大.上下文 ...

  7. 查看java上下文切换,七日打卡--java并发编程之上下文切换

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

  8. 多线程上下文切换优化与注意

    前言 本文来自方腾飞老师<Java并发编程的艺术>第一章. 并发编程的目的是为了让程序运行得更快,但是并不是启动更多的线程就能让程序最大限度地并发执行.在进行并发编程时,如果希望通过多线程 ...

  9. 并发编程合集(1)上下文切换详解、死锁及解决方案详解

    目录 <Java 并发编程的艺术>第1章--介绍Java并发编程的挑战 1.1 上下文切换 1.1.1 多线程一定快吗 1.1.2 测试上下文切换次数和时长 1.1.3 如何减少上下文切换 ...

最新文章

  1. 重设wordpress用户密码
  2. write solid code 零散(原文)
  3. outlook搜索不到历史邮件内容
  4. Android 布局以及优化资料汇总
  5. echart 动画 饼图_echarts构建关系图,节点可收缩和展开,可添加点击事件
  6. android.view.WindowManager$BadTokenException异常
  7. Head First设计模式读书笔记八 第九章下 组合模式
  8. 小米冲击高端,这次能否成功?
  9. Android截图-截屏与截长图(二)
  10. javascript 设为首页 | 加入收藏夹 JS代码
  11. XML编辑器oXygen XML Editor V19大版本更新 | 附下载
  12. 苹果手机如何分享wifi密码_怎样用手机改wifi密码
  13. Ubuntu如何更新显卡驱动
  14. Android平台上的PacketSender
  15. 已解决pandas创建DataFrame对象失败
  16. xcode没有Products的解决方法
  17. 阿里云服务器SSL不可用
  18. 广义似然比检验matlab,第5章 资产定价模型的时间序列估计与检验.pptx
  19. Git创建分支和查看分支命令
  20. 谷歌的新系统Fuchsia OS根本不能替代安卓

热门文章

  1. 逐梦....圈圈圈圈圈
  2. 北航程序设计决赛(虽然。。。。但是)补题。
  3. python语法基础语法_Python基本语法[二],python入门到精通[四]
  4. 使用SDL实现一个简单的YUV播放器
  5. linux医学软件,Schrodinger Suites 2015-2 Linux版简单安装经验分享
  6. 日益趋增的Linux勒索软件
  7. abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一)
  8. IoC容器篇(三)——依赖(二)
  9. GPG在PHP中的使用
  10. 【小猫爪】AUTOSAR学习笔记03-Communication Stack之CanIf模块