到底什么是线程上下文切换?
什么是 线程?
什么是上下文?
为什么要切换?
@正是那朵玫瑰同学,我认为老师所说的耗费cpu资源指的是线程阻塞和等待进行额外的上下文切换,要理解其,先要知道上下文是什么,具体来说,一个线程被剥夺处理器的使用权而被暂停运行,就是“切出”;一个线程被选中占用处理器开始或者继续运行,就是“切入”。在这种切出切入的过程中,操作系统需要保存和恢复相应的进度信息,这个进度信息就是“上下文”了。至于系统开销具体发生在切换过程中的哪些具体环节,总结如下:
- 操作系统保存和恢复上下文;
- 调度器进行线程调度;
- 处理器高速缓存重新加载;
上下文切换也可能导致整个高速缓存区被冲刷,从而带来时间开销。以上情况过多都会耗费cpu资源,而你看到cpu资源利用率下降了是因为cpu已经做完了上下文切换,把线程的上下文保存到内存或者硬盘上去了,但是当你的线程重新唤醒,其cpu是不是又要多一次不必要的上下文切换?在上下文切换过程中,CPU 会停止处理当前运行的程序,并保存当前程序运行的具体位置以便之后继续运行。
从这个角度来看,上下文切换有点像我们同时阅读几本书,在来回切换书本的同时我们需要记住每本书当前读到的页码。
在程序中,上下文切换过程中的“页码”信息是保存在进程控制块(PCB)中的。
PCB 还经常被称作“切换桢”(switchframe)。“页码”信息会一直保存到 CPU 的内存中,直到他们被再次使用。
上下文切换是存储和恢复 CPU 状态的过程,它使得线程执行能够从中断点恢复执行。 上下文切换是多任务操作系统和多线程环境的基本特征。
什么是线程的上下文切换?
多线程执行是cpu抢占时间片的方式执行。多线程创建并切换到另一个线程的过程,称之为线程的上下文切换
如何减少上下文切换 ** 减少上下文切换的方法有无锁并发编程、CAS算法、使用最少线程和使用协程。
无锁并发编程。多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。
CAS算法。Java的Atomic包使用CAS算法来更新数据,而不需要加锁。
使用最少线程。避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这 样会造成大量线程都处于等待状态
协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换
———————————————— 版权声明:本文为CSDN博主「唐 中」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_39472101/article/details/108817655
什么是线程的上下文切换
首先要了解,就算我们的CPU是单核的,也是支持多线程运行代码的。 那么能做到这点的关键就在于 CPU 利用了时间片轮询来为每一个任务都服务一段时间。 时间片指的就是CPU分配给每一个线程的时间,同时因为时间片的时间很短,以毫秒为单位,所以即使CPU不断的切换线程运行,给我们的感知也是并行的。 而在这不断切换线程的过程中,CPU会把当前任务的状态保存下来(方便之后切换回来时能够继续执行),然后继续服务下一个切换的线程,这种从任务的状态保存到再加载的过程就叫做线程的上下文切换。
什么会引起线程的上下文切换
当前线程任务正常完成,CPU调度下一个任务 硬件中断 当前任务被挂起,比如用了sleep方法,wait方法,yeild方法等,让出了CPU 当前任务执行I/O等会引起阻塞的操作,调度器会挂起这个任务,然后执行下一个任务 多个任务抢占锁资源,当前任务没抢到,就会被调度器挂起,然后调度器会执行下一个任务 ———————————————— 版权声明:本文为CSDN博主「绅士jiejie」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_38106322/article/details/104102968
整理于:2021年3月11日14:56:37