什么是上下文切换,哪些因素会导致上下文切换,它有哪些开销,如何降低这些开销(2015-12-01)?
《Java多线程编程实战指南(设计模式篇)》作者回复:
《Java多线程编程实战指南(设计模式篇)》第1章打了个比方:比如我们用手机与他人通话的时候,聊着聊着的时候由于第3个人拨打了你的电话。那么,这个时候你可能会做的一个动作就是先记下刚才的通话聊到哪里的(即进度),接着和对方说“我先接个电话,你别挂断“,然后和第3个人说”稍后给您回电“。这时,继续和第1个人通话的时候,我们就要回想刚才我们聊到哪里了,否则你必然要问对方这个问题。
上面的比方中,从和一个人通话到和另外一个人通话的这种来回切换就是上下文切换,通话中聊到哪里的这个信息就是”上下文”。
从Java语言的角度来说,上下文切换就是Java线程的状态在Runnable和非Runnable(Blocked、WAITED或者TIMED_WAITED)之间来回变动时CPU所做的一个动作。线程的状态从Runnable到非Runnable的变化时CPU所在的动作叫切出(Switch out),线程的状态从非Runnable到Runnable的变化时CPU所在的动作叫切入(Switch in)。
上下文切换的开销包括直接开销和间接开销。直接开销就是保存或者恢复被切出或者切入的线程的上下文信息的CPU开销。上下文信息包括寄存器、程序计数器、栈指针等信息。
间接的开销包括线程重新调度所需的开销、以及被切出的线程可能会被切入到另外一个CPU上运行而导致CPU Cache Miss导致的开销(即Cache Miss导致读内存这个慢的操作的时间开销)。
根据上述描述,我们可以发现凡是可以导致线程状态从Runnable变为非Runnable的因素,都会导致上下文切换。这些常见因素包括:
I/O操作、
锁(非争用的锁由于Java做过优化,并不会导致上下文切换)、
GC(GC的时候所谓的stop-the-world会导致所有应用线程被暂停,即切出)。
如何减少上下文切换的开销问题实际上就是如何减少上下文切换的问题。常见的方法包括:
减少锁持有的时间:锁持有的时间越短,它被争用的几率越低,因此它导致上下文切换的几率也越低。这与Java1.6 开始对synchronized做的一些优化有关。因为Java会对持有时间较短的锁做这样一种优化(可以理解为spin-wait),使得这种锁的获得不会导致上下文切换。
避免在临界区中执行I/O操作:因为I/O操作会引起上下文切换,而I/O操作通常又是比较慢的操作,若将这种操作放在临界区中会使得锁的持有时间变长,从而使得锁的获得也会上下文切换。于是就产生了雪上加霜的效果。
尽量减少GC的频率,有其是Full GC的频率:GC过程中的compact阶段由于要移动对象的内存区域导致它必须停止应用线程,从而导致上下文切换。
在Linux平台下,我们可以使用perf命令来监控发生在指定进程内的上下文切换。
对于Java8,我们可以使用JMC这个JDK工具来查看上下文切换的频率。
相关推荐
在Java编程中,多线程是一项关键技能,它允许程序同时执行多个任务,极大地提高了程序的...通过阅读"Java多线程编程实战指南 设计模式篇.pdf",你将获得更深入的理论知识和实践技巧,为你的编程事业奠定坚实的基础。
Java多线程编程实战指南(核心篇) 高清pdf带目录 随着现代处理器的生产工艺从提升处理器主频频率转向多核化,即在一块芯片上集成多个处理器内核(Core),多核处理器(Multicore Processor)离我们越来越近了――如今...
《Java多线程编程实战指南-核心篇》是一本深入探讨Java并发编程的书籍,旨在帮助读者掌握在Java环境中创建、管理和同步线程的核心技术。Java的多线程能力是其强大之处,使得开发者能够在同一时间执行多个任务,提高...
《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...
《Java多线程编程实战指南(设计模式篇)》由黄文海撰写,是一本深入探讨Java多线程编程和设计模式的专业书籍。书中详细介绍了如何在Java环境中利用多线程来实现高效的并发处理,同时结合设计模式,帮助开发者更好地...
总之,“Java多线程编程实战指南+设计模式篇(全部)”是一份宝贵的资源,它将帮助读者深入理解Java多线程编程的各个方面,以及如何利用设计模式解决实际问题。学习并掌握这些知识,对于提升Java程序员的专业技能和...
Java多线程编程实战指南设计模式篇.mobi
《Java多线程编程实战指南 设计模式篇》是一本深度探讨Java并发编程与设计模式融合的书籍。在Java编程中,多线程是提升系统性能、实现并行计算的关键技术,而设计模式则是解决常见问题的最佳实践。本书旨在帮助...
《Java多线程编程实战指南(设计模式篇)》采用Java(JDK1.6)语言和UML 为描述语言,并结合作者多年工作经历的相关实战案例,介绍了多线程环境下常用设计模式的来龙去脉:各个设计模式是什么样的及其典型的实际应用...
本书以理论结合示例的方式介绍了多线程常见设计模式。
读书笔记:《Java多线程编程实战指南设计模式篇》源码
读书笔记:Java多线程编程实战指南设计模式篇 之读书笔记
《Java多线程编程实战指南》是一本深入探讨Java并发编程的书籍,涵盖了核心篇与设计模式篇。这本书旨在帮助开发者理解和掌握Java平台上的多线程编程,提升系统性能和可扩展性。在Java世界中,多线程是实现并发处理、...
《Java多线程编程实战指南(核心篇)》以基本概念、原理与方法为主线,辅以丰富的实战案例和生活化实例,并从Java虚拟机、操作系统和硬件多个层次与角度出发,循序渐进、系统地介绍Java平台下的多线程编程核心技术及...
读书笔记:《Java多线程编程实战指南设计模式篇》随书代码, 改为了maven
《汪文君JAVA多线程编程实战》是一本专注于Java多线程编程的实战教程,由知名讲师汪文君倾力打造。这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是...
《多线程编程实战指南-核心篇》是针对Java开发者深入理解并掌握多线程编程的一本实战性书籍。在当今的并发计算环境中,多线程技术是必不可少的知识点,它能够有效地利用多核处理器资源,提高程序的执行效率。本书以...
读书笔记:Java多线程编程实战指南核心篇
读书笔记:Java多线程编程实战指南 核心篇 测试代码