如何减少上下文切换?
什么是上下文切换?
上下文换指的是操作系统的核心,在CPU上对进程或者线程进行切换的意思。上下文切换过程中的信息被保存在进程控制块中的。
理解上下文切换
首先,大家不管在单核或多核处理器都支持多线程执行代码,然后CPU通过给每个线程分配CPU时间片来实现这个过程的。什么是时间片,时间片是CPU分配给各个线程的时间,时间片非常短。所以我们是平还是感觉不到,CPU不停切换线程执行,时间片一般就是几十毫秒,就那么一瞬间。
如何减少上下文切换
减少“上下文切换”常用有这种方法:无锁并发编程、CAS算法、使用最少线程和使用协程。
- 无锁并发编程:就是多线程竞争锁时,会引起上下文切换,多线程处理数据时,可以用一 些办法来避免使用锁,如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。
- CAS算法:Java的Atomic包使用CAS算法来更新数据,就是它在没有锁的状态下,可以保证多个线程对一个值的更新。
- 使用最少线程:避免创建不需要的线程。
- 协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。
上下文切换的消耗
下文切换,它是需要相当可观的处理器时间的。当在每秒几十上百次的切换中,每次切换都需要纳秒量级的时间,所以时间是非常短,很多时候,我们是观察不到 变化的。因此,对于上下文切换,会给系统带来的是消耗大量的CPU时间。
上下文切换带来的问题
除了进程需要上下文切换,其实还有一种上下文切换,那就是操作系统检测到中断、异常、系统调用时发生的,以及包括IO设备引起的中断,应用程序主动发起系统调用(如文件读写)等等。如果操作系统检测到中断异常系统调用的信号后,会通过中断向量表找到对应的处理程序,然后切换成处理程序进程,处理完成后再切换回来。
其实在系统调用时候,可能还会有用户态到内核态的切换,这个过程更加为复杂。在普通上下文,它会的开销比普通上下文切换代价更大了。
如何减少上下文切换?相关推荐
- 减少上下文切换和避免死锁简述
title: 减少上下文切换和避免死锁简述 date: 2021/8/13 线程有创建和上下文切换的开销: 如何减少上下文切换? 无锁并发编程.多线程竞争锁时,会引起上下文切换,所以多线程切换数据时, ...
- 什么是上下文切换?如何减少上下文切换?
文章目录 导致原因 开销 如何减少上下文切换 即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制.时间片是CPU分配给各个线程的执行时间,因为事件片非常短,所有C ...
- 如何减少CPU上下文切换
1.减少上下文切换的方法有 1.无锁并发编程 多线程竞争时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,将数据Id按hash算法取模来分段,不同的线程处理不同时端的数据 2.C ...
- Java多线程的上下文切换
转载自 https://blog.csdn.net/fuyuwei2015/article/details/71860349 对于上下文切换不同的操作系统模式也不尽相同,这里我们只讨论Unix系统,在 ...
- java 优化线程_Java | 多线程调优(下):如何优化多线程上下文切换?
通过上一讲的讲解,相信你对上下文切换已经有了一定的了解了.如果是单个线程,在 CPU 调用之后,那么它基本上是不会被调度出去的.如果可运行的线程数远大于 CPU 数量,那么操作系统最终会将某个正在运行 ...
- 关于线程上下文切换,你知道多少?
点击关注公众号,实用技术文章及时了解 由于现在大多计算机都是多核CPU,多线程往往会比单线程更快,更能够提高并发,但提高并发并不意味着启动更多的线程来执行.更多的线程意味着线程创建销毁开销加大.上下文 ...
- 查看java上下文切换,七日打卡--java并发编程之上下文切换
上下文切换 CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务.但是在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态.所以任务从保存到 ...
- 多线程上下文切换优化与注意
前言 本文来自方腾飞老师<Java并发编程的艺术>第一章. 并发编程的目的是为了让程序运行得更快,但是并不是启动更多的线程就能让程序最大限度地并发执行.在进行并发编程时,如果希望通过多线程 ...
- 并发编程合集(1)上下文切换详解、死锁及解决方案详解
目录 <Java 并发编程的艺术>第1章--介绍Java并发编程的挑战 1.1 上下文切换 1.1.1 多线程一定快吗 1.1.2 测试上下文切换次数和时长 1.1.3 如何减少上下文切换 ...
最新文章
- 重设wordpress用户密码
- write solid code 零散(原文)
- outlook搜索不到历史邮件内容
- Android 布局以及优化资料汇总
- echart 动画 饼图_echarts构建关系图,节点可收缩和展开,可添加点击事件
- android.view.WindowManager$BadTokenException异常
- Head First设计模式读书笔记八 第九章下 组合模式
- 小米冲击高端,这次能否成功?
- Android截图-截屏与截长图(二)
- javascript 设为首页 | 加入收藏夹 JS代码
- XML编辑器oXygen XML Editor V19大版本更新 | 附下载
- 苹果手机如何分享wifi密码_怎样用手机改wifi密码
- Ubuntu如何更新显卡驱动
- Android平台上的PacketSender
- 已解决pandas创建DataFrame对象失败
- xcode没有Products的解决方法
- 阿里云服务器SSL不可用
- 广义似然比检验matlab,第5章 资产定价模型的时间序列估计与检验.pptx
- Git创建分支和查看分支命令
- 谷歌的新系统Fuchsia OS根本不能替代安卓
热门文章
- 逐梦....圈圈圈圈圈
- 北航程序设计决赛(虽然。。。。但是)补题。
- python语法基础语法_Python基本语法[二],python入门到精通[四]
- 使用SDL实现一个简单的YUV播放器
- linux医学软件,Schrodinger Suites 2015-2 Linux版简单安装经验分享
- 日益趋增的Linux勒索软件
- abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一)
- IoC容器篇(三)——依赖(二)
- GPG在PHP中的使用
- 【小猫爪】AUTOSAR学习笔记03-Communication Stack之CanIf模块