
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们在前几期的文章中给大家简单介绍了多线程编程开发的一些基础知识等内容,而本文我们就继续来了解一下,多线程上下文切换概念与应用分析。
什么是上下文切换
在单个处理器的时期,操作系统就能处理多线程并发任务。处理器给每个线程分配CPU时间片(TimeSlice),线程在分配获得的时间片内执行任务。
CPU时间片是CPU分配给每个线程执行的时间段,一般为几十毫秒。在这么短的时间内线程互相切换,我们根本感觉不到,所以看上去就好像是同时进行的一样。
时间片决定了一个线程可以连续占用处理器运行的时长。当一个线程的时间片用完了,或者因自身原因被迫暂停运行了,这个时候,另外一个线程(可以是同一个线程或者其它进程的线程)就会被操作系统选中,来占用处理器。这种一个线程被暂停剥夺使用权,另外一个线程被选中开始或者继续运行的过程就叫做上下文切换(ContextSwitch)。
具体来说,一个线程被剥夺处理器的使用权而被暂停运行,就是“切出”;一个线程被选中占用处理器开始或者继续运行,就是“切入”。在这种切出切入的过程中,操作系统需要保存和恢复相应的进度信息,这个进度信息就是“上下文”了。
那上下文都包括哪些内容呢?具体来说,它包括了寄存器的存储内容以及程序计数器存储的指令内容。CPU寄存器负责存储已经、正在和将要执行的任务,程序计数器负责存储CPU正在执行的指令位置以及即将执行的下一条指令的位置。
在当前CPU数量远远不止一个的情况下,操作系统将CPU轮流分配给线程任务,此时的上下文切换就变得更加频繁了,并且存在跨CPU上下文切换,比起单核上下文切换,跨核切换更加昂贵。
上下文切换的诱因
在操作系统中,上下文切换的类型还可以分为进程间的上下文切换和线程间的上下文切换。而在多线程编程中,我们主要面对的就是线程间的上下文切换导致的性能问题,下面我们就重点看看究竟是什么原因导致了多线程的上下文切换。
如果是单个线程,在CPU调用之后,那么它基本上是不会被调度出去的。如果可运行的线程数远大于CPU数量,那么操作系统终会将某个正在运行的线程调度出来,从而使其它线程能够使用CPU,这就会导致上下文切换。
还有,在多线程中如果使用了竞争锁,当线程由于等待竞争锁而被阻塞时,JVM通常会将这个线程挂起,并允许它被交换出去。如果频繁地发生阻塞,CPU密集型的程序就会发生更多的上下文切换。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。