何为上下文切换?
当一个线程的时间片用完后或者其他自身原因被迫暂停运行了,这时候,另外一个线程或者、进程或者其他进程的线程就会白操作系统选中,用来占用处理器。
这种一个线程被暂停,一个线程包选中开始执行的过程就叫做上下文切换。
和CPU寄存器、程序计数器的关系
上下文切换包含了寄存器的存储和程序计数器存储的指令内容。
CPU寄存器负责存储已经、正在和即将要执行的任务。
程序计数器负责寄存CPU正在执行的指令位置和即将执行的下一条指令的位置。
上下文切换分类
进程之间的上下文切换。
线程之间的上下文切换(本文重点)。
什么场景会导致线程的上下文切换?
导致线程上下文切换的有两种类型:
自发性上下文切换是指线程由Java程序调用导致切出,在多线程编程中,执行调用上图中的 方法或关键字,常常就会引发自发性上下文切换。
非自发性上下文切换指线程由于调度器的原因被迫切出。常见的有:线程被分配的时间片用完, 虚拟机垃圾回收导致或者执行优先级的问题导致。
那么虚拟机垃圾回收为什么会导致上下文切换?
在Java虚拟机中,对象的内存都是由虚拟机中的堆分配的,在程序运行过程中,新的对象将 不断被创建,如果旧的对象使用后不进行回收,堆内存将很快被耗尽。Java虚拟机提供了一 种回收机制,对创建后不再使用的对象进行回收,从而保证堆内存的可持续性分配。而这种垃 圾回收机制的使用有可能会导致stop-the-world事件的发生,这其实就是一种线程暂停行为。
总结:
上下文切换就是一个工作的线程被另外一个线程暂停,另外一个线程占用了处理器开始执行任 务的过程。系统和Java程序自发性以及非自发性的调用操作,就会导致上下文切换,从而带来系统开销。
线程越多,系统的运行速度不一定越快。那么我们平时在并发量比较大的情况下,什么时候用 单线程,什么时候用多线程呢?
一般在单个逻辑比较简单,而且速度相对来非常快的情况下,我们可以使用单线程。例如,我 们前面讲到的Redis,从内存中快速读取值,不用考虑I/O瓶颈带来的阻塞问题。而在逻辑 相对来说很复杂的场景,等待时间相对较长又或者是需要大量计算的场景,我建议使用多线程 来提髙系统的整体性能。例如,NI0时期的文件读写操作、图像处理以及大数据分析等。

Was this helpful?

0 / 0

发表回复 0

Your email address will not be published.