什么是上下文切换?
上下文换指的是操作系统的核心,在CPU上对进程或者线程进行切换的意思。上下文切换过程中的信息被保存在进程控制块中的。
理解上下文切换
首先,大家不管在单核或多核处理器都支持多线程执行代码,然后CPU通过给每个线程分配CPU时间片来实现这个过程的。什么是时间片,时间片是CPU分配给各个线程的时间,时间片非常短。所以我们是平还是感觉不到,CPU不停切换线程执行,时间片一般就是几十毫秒,就那么一瞬间。
如何减少上下文切换
减少“上下文切换”常用有这种方法:无锁并发编程、CAS算法、使用最少线程和使用协程。
无锁并发编程:就是多线程竞争锁时,会引起上下文切换,多线程处理数据时,可以用一 些办法来避免使用锁,如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。 CAS算法:Java的Atomic包使用CAS算法来更新数据,就是它在没有锁的状态下,可以保证多个线程对一个值的更新。使用最少线程:避免创建不需要的线程。协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。
上下文切换的消耗
上下文切换,它是需要相当可观的处理器时间的。当在每秒几十上百次的切换中,每次切换都需要纳秒量级的时间,所以时间是非常短,很多时候,我们是观察不到 变化的。因此,对于上下文切换,会给系统带来的是消耗大量的CPU时间。
上下文切换带来的问题
除了进程需要上下文切换,其实还有一种上下文切换,那就是操作系统检测到中断、异常、系统调用时发生的,以及包括IO设备引起的中断,应用程序主动发起系统调用(如文件读写)等等。如果操作系统检测到中断异常系统调用的信号后,会通过中断向量表找到对应的处理程序,然后切换成处理程序进程,处理完成后再切换回来。
其实在系统调用时候,可能还会有用户态到内核态的切换,这个过程更加为复杂。在普通上下文,它会的开销比普通上下文切换代价更大了。
如有需要:复习脑图、Java、大数据、Redis、Spring Boot等相关精品教程和资料。关注我且私信“资料”即可获得。
举报/反馈

metashops

1505获赞 398粉丝
一名Go语言爱好者,希望大家多多支持。
关注
0
0
收藏
分享