
Thread类中包含的成员变量代表了线程的某些优先级,Thread,线程的优先级可以在程序中表明该线程的重要性,
Thread,在默认情况下优先级都是Thread,在时间结束后。但这个并不意味着低
优先级的线程得不到运行,每个线程都会得到一小段CPU时间片运行,而只是它运行的几率比较小,这是系统就会选择与当前优先级相同的程序予以运行.MIN_PRIORITY(常数1),系统会根据优先级来决定首先使哪个线程进入运行状态,将轮换另一个线程进入运行状态。
在多任务的 *** 作系统中,系统始终选择就绪状态下优先级较高的线程进入运行状态
你刚讲了线程1的优秀级高,那么中断来了之后,肯定要先处理这个线程。系统不会强制结束当前的线程,如果这样做可能导致死机活崩溃,因为该线程可能是系统的。
正常的做法是将该线程的数据备份,处理优先级高的,之后再回来继续工作
在 Linux性能分析-平均负载 中,提到过一种导致平均负载升高的情况,就是有大量进程或线程等待cpu调度。
为什么大量进程或者线程等待CPU调度会导致负载升高呢?
当大量进程或者线程等待调度时,cpu需要更加频繁的切换任务,在切换任务的过程中,需要保存上一个任务的context到内核中,并且恢复当前任务的context,这种保存和恢复的 *** 作也是需要cpu来执行的,导致cpu都消耗在了 保存上文和恢复下文 这个过程中。
除了进程和线程导致的上下文切换以外,硬件产生的中断事件也会导致上下文切换。并且中断事件的优先级是高于线程和进程任务的。
这篇文章会模拟测试这种情况。
vmstat是一个观测总体上下文切换状况的命令。
下面指令可以每隔5秒输出一组数据。
重点关注列含义:
使用vmstat关注到了整体的情况,接下来可以使用pidstat关注具体线程的情况
注:pidstat -wt 可以输出线程的情况
重点关注列含义:
系统环境:
首先安装sysbench,使用sysbench,我们可以模拟一个进程内多线程调度引起的上下文切换问题。
安装好后,执行下面命令
查看下vmstat和pidstat
观察vmstat结果,可以看到
观察pidstat两类结果,可以发现
整体结果符合我们的预期。
针对in列显著提高,可以查看 /proc/interrupts 文件,里面记录了中断相关的数据,这些数据记录的是从上次启动到现在的累加值。
我们把系统重新启动下,看下空闲状态下的文件
当执行sysbench命令后,并运行一段时间后,该文件如下
其中,LOC和RES显著升高
RES表示,唤醒空闲状态的CPU来调度新的任务运行,和我们模拟的过多任务调度有关。
LOC不太理解,暂时先放在这里。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)