什么是线程切换、线程阻塞、线程中断

什么是线程切换、线程阻塞、线程中断,第1张

线程切换: 我们知道,CPU是以时间片进行线程调度的,一个线程在占有一个分配的时间片之后,CPU就会根据相应的策略进行线程的重新调度,这个过程会很大程度上参考线程的优先级,当然调度策略也会考虑到各个线程的等待时间等。也就是说,若是当前线程的优先级足够高的话,那么就有可能在下一次的CPU调度中再次获得一个时间片。若是当前线程未能再次获得时间片,那么它就要插入线程就绪队列,等待CPU的下一次调度,这便是线程之间的切换。

线程阻塞: 线程阻塞,指的是当一个线程执行到某一个状态时,这时候它需要获得其他资源才能继续执行(比方说IO资源),但是此时有其他线程占着IO资源不释放,那么这个线程就必须等到其他的线程将IO资源释放之后才能继续执行了,这个便是线程阻塞,此时线程在线程阻塞队列而非就绪队列中。Java中的sleep()会引起线程阻塞。(yield()-不会阻塞,仅仅是重新调度,wait()-挂起)

线程中断: 汇编语言中的中断一般指暂停当前的程序,然后跳到中断入口,执行相应的中断处理程序,处理完毕之后回到之前程序的断点继续执行。那么Java中的中断是不是也是指停止当前程序运行的意思呢?可能会觉得会奇怪,其实并非是这样的。它的存在可以说是给我们提供了一种线程的控制机制。线程中断它指的并不只是等到线程到达某个检查点决定的中断,还包括有些时候在无法到达检查点,我们需要在run()方法中执行中断。接下来让我们走近中断

多线程的目的 - “最大限度地利用CPU资源”。每个程序执行时都会产生一个进程,而每一个进程至少要有一个主线程。对于单CPU来说(没有开启超线程),在同一时间只能执行一个线程,所以如果想实现多任务,那么就只能每个进程或线程获得一个时间片,在某个时间片内,只能一个线程执行,然后按照某种策略换其他线程执行。由于时间片很短,这样给用户的感觉是同时有好多线程在执行。

Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多线程(Thread)的情况下,不能发挥多核的优势。而使用多进程(Multiprocess),则可以发挥多核的优势真正地提高效率。

单线程、多线程和多进程的效率对比测试: github地址

资料显示,如果多线程的进程是CPU密集型的,那多线程并不能有多少效率上的提升,相反还可能会因为线程的频繁切换,导致效率下降,推荐使用多进程;如果是IO密集型,多线程进程可以利用IO阻塞等待时的空闲时间执行其他线程,提升效率。所以我们根据实验对比不同场景的效率

| CPU密集型 *** 作| IO密集型 *** 作| 网络请求密集型 *** 作

-- | -- | --| --

线性 *** 作| 6973533328374 |1776633326213 | 678833333651

多线程 *** 作| 7540299995740 |14568366670609 | 193999997775

多进程 *** 作| 1397433336576 | 467833328247| 238333328565

仅个人观点,,欢迎留言~~~

时间片通常就是 *** 作系统调度程序的运行周期(除了主动挂起引发的调度外,两次进入调度程序的间隔就是时间片),也通常是硬件时钟周期的整数倍, *** 作系统通常在开发阶段试验了各种不同的时间片并选择综合最优的常数化到了 *** 作系统内部,应该没办法特别为某个程序从核心修改时间片的

虽然不能修改核心参数,但可以变通实现修改时间片。如果希望减少一个线程的时间片,主动挂起(比如sleep),引发调度;如果想增加,也存在可能性,事实上,增加时间片和“拒绝被调度”是类似,只需调高该线程的优先级,则可最大限度防止被调度,在不需要增加时间片时,再调回优先级即可

golang学习笔记 >

以上就是关于什么是线程切换、线程阻塞、线程中断全部的内容,包括:什么是线程切换、线程阻塞、线程中断、Python高阶(一) - 单线程、多线程和多进程的效率对比测试、多线程编程 如何修改时间片等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/9463167.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存