什么是上下文切换?如何减少上下文切换?
文章目录
- 导致原因
- 开销
- 如何减少上下文切换
即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的执行时间,因为事件片非常短,所有CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行,时间片一般 几十毫秒 (ms)。
CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切回这个任务时,可以再加载这个任务的状态。所以任务 从保存到再加载的过程就是一次上下文切换。
这就像我们同时读两本书,当我们在读一本英文的技术书时,发现某个单词不认识,于是便打开中英文字典,但是在放下英文技术书之前,大脑必须先记住这本书读到了多少页的第多少行,等查完单词之后,能够继续读这本书。这样的切换是会影响读书效率的,同样上下文
切换也会影响多线程的执行速度。
导致原因
1.自发性切换
线程由于自身原因切出。
- Thread.sleep
- wait
- Thread.yield
- Thread.join
- LockSupport.park
- 发起了IO操作如读文件
- 等待其他线程持有的锁
- 非自发性切换
线程由于调度器的原因被迫切出
- 被切出的时间片用完
- 比被切出线程的优先级更高的线程需要被运行
开销
- 直接开销
- 操作系统保存和恢复上下文所需的开销
- 线程调度器 进行线程调度的开销: 比如按照一定的规则决定哪个线程会占用处理器运行
- 间接开销
- 处理器高速缓存重新加载的开销
- 上下文切换也可能导致一级高速缓存中的内容被冲刷
如何减少上下文切换
无锁并发编程
多线程竞争时,会一起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,如将数据的ID按照Hash的算法取模分段,不同的线程处理不同段的数据。CAS
java的Atomic包 使用CAS算法来更新数据,而不需要加锁使用最少线程
避免创建不需要的线程,比如人物很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态。协程
在单线程里实现多任务调度,并在单线程里维持多个任务间的切换
什么是上下文切换?如何减少上下文切换?相关推荐
- 减少上下文切换和避免死锁简述
title: 减少上下文切换和避免死锁简述 date: 2021/8/13 线程有创建和上下文切换的开销: 如何减少上下文切换? 无锁并发编程.多线程竞争锁时,会引起上下文切换,所以多线程切换数据时, ...
- 如何减少上下文切换?
什么是上下文切换? 上下文换指的是操作系统的核心,在CPU上对进程或者线程进行切换的意思.上下文切换过程中的信息被保存在进程控制块中的. 理解上下文切换 首先,大家不管在单核或多核处理器都支持多线程执 ...
- Linux中断与进程切换,结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程...
@ 实验环境 OS Linux cj-virtual-machine 5.3.0-51-generic 虚拟机 QEMU 内核版本 5.3.4 调式方法 GDB PS:调试环境安装请看上一篇博客汇编级 ...
- mysql上下文切换_进程上下文切换开销
进程是我们开发同学非常熟悉的概念,我们可能也听说过进程上下文切换开销.那么今天让我们来思考一个问题,究竟一次进程上下文切换会吃掉多少CPU时间呢?线程据说比进程轻量,它的上下文切换会比进程切换节约很多 ...
- 查看java上下文切换,线程的上下文切换,多线程频繁上下文切换
线程的上下文切换,多线程频繁上下文切换 利用时间片轮转的方式,CPU给每个任务都服务一定的时间,然后把当前任务的状态保存下来,在加载下一个任务后,继续服务下一个任务,这个过程叫做上下文切换. 时间片轮 ...
- linux 上下文切换时间,CPU上下文切换的次数和时间(context switch)
什么是CPU上下文切换?css 如今linux是大多基于抢占式,CPU给每一个任务必定的服务时间,当时间片轮转的时候,须要把当前状态保存下来,同时加载下一个任务,这个过程叫作上下文切换.时间片轮转的方 ...
- linux进程上下文切换的具体过程,Linux实验三 结合中断上下文切换和进程上下文切换分析Linux内核一般执行过程...
fork系统调?创建?进程,也就?个进程变成了两个进程,两个进程执?相同的代码,只是fork系统调?在?进程和?进程中的返回值不同. 打开linux-5.4.34/arch/x86/entry/sys ...
- mysql 上下文切换_线程上下文切换
今天为了获取一张图片,用了一段代码: ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateV ...
- 如何减少CPU上下文切换
1.减少上下文切换的方法有 1.无锁并发编程 多线程竞争时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,将数据Id按hash算法取模来分段,不同的线程处理不同时端的数据 2.C ...
最新文章
- spark+openfire即时通讯工具二次开发参考文档
- hdu 5512 Pagodas
- 吴裕雄 python 神经网络——TensorFlow 图、张量及会话
- android png转灰度,Android提高之使用NDK把彩图转换灰度图的方法
- shell获取文件扩展名(前缀,后缀)
- python输入时间_一文搞懂python日期时间处理
- Oracle正确迁移数据文件,Oracle数据文件迁移知多少?
- Springboot+CAS下Session过期无效,页面请求302问题解决
- mac黑白打印和彩色打印
- 【数据结构与算法分析】——java语言描述(1)
- 美化字体 css3,美化你空间的文字:20种CSS字体镜像特效
- chrome F12开发者工具 (二)preview 与response的区别
- “一键GHOST”系统备份与恢复 一键GHOST使用方法 - 绿色软件联盟 - 绿色免费共享
- 2021年网络规划设计师论文真题
- 628 小媛在努力【水题】
- 【完整项目搭建】基于vue-cli实现vue前端搭建考试系统——①创建vue-cli实现项目搭建
- 职教云python题和答案_智慧职教云课堂Python程序设计试题及答案
- 小米官网导航栏的实现
- django+xadmin 在线教育网站(三)
- 爱立信携手KDDI加速蜂窝物联网发展:成功验证LPWA技术