16、什么是上下文切换
答:
比如人工作的时候,准备好装备好工作需要的工具才能开始正常工作,否则都是工作的准备阶段。而我们的cpu是分片执行的(因为CPU运行速度太快,不想浪费,所以都是分片运行任务),我们一般的操作系统都是多任务系统,需要执行其它任务,那么就需要把当前任务的工作环境也就是运行环境保存到内存里,然后把下一个任务的工作环境/运行环境(其实就是寄存器、程序计数器那些东西就绪)放入CPU中,然后开始执行。
这两个任务运行环境切换称为上下文切换。
17、上下文切换的过程
答:
1)挂起一个进程,将这个进程在 CPU 中的状态(上下文)存储于PCB中。
2)在内存中检索下一个进程的上下文并将其在 CPU 的寄存器中恢复。
3)跳转到程序计数器所指向的位置(即跳转到进程被中断时的代码行),以恢复该进程在程序中。
18、什么是PCB
答:
上下文切换中,上下文的信息被保存在进程控制块中(PCB,process control block中)。 PCB 还经常被称作“切换桢”(switchframe)。 信息会一直保存到 CPU 的内存中,直到他们被再次使用。
19、引起线程上下文切换的原因
答:
1)时间片用完,需要进程挂起
2)硬中断
3)代码逻辑挂起线程
4)当前任务有IO阻塞
5)多进程抢占锁资源
20、Linux如何查看上下文中断
答:
通过Linux安装工具sysstat。
可以使用vmstat查看上下文中断。
比如,下面就是一个 vmstat 的使用示例:
# 每隔 5 秒输出 1 组数据
$ vmstat 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 7005360 91564 818900 0 0 0 0 25 33 0 0 100 0 0
我们一起来看这个结果,你可以先试着自己解读每列的含义。在这里,我重点强调下,需要特别关注的四列内容:
cs(context switch)是每秒上下文切换的次数。
in(interrupt)则是每秒中断的次数。
可以看到,这个例子中的上下文切换次数 cs 是 33 次,而系统中断次数 in 则是 25 次,而就绪队列长度 r 和不可中断状态进程数 b 都是 0。
vmstat 只给出了系统总体的上下文切换情况,要想查看每个进程的详细情况,就需要使用我们前面提到过的 pidstat 了。给它加上 -w 选项,你就可以查看每个进程上下文切换的情况了。
比如说:
# 每隔 5 秒输出 1 组数据
$ pidstat -w 5
Linux 4.15.0 (ubuntu) 09/23/18 _x86_64_ (2 CPU)
08:18:26 UID PID cswch/s nvcswch/s Command
08:18:31 0 1 0.20 0.00 systemd
08:18:31 0 8 5.40 0.00 rcu_sched
...
这个结果中有两列内容是我们的重点关注对象。一个是 cswch ,表示每秒自愿上下文切换(voluntary context switches)的次数,另一个则是 nvcswch ,表示每秒非自愿上下文切换(non voluntary context switches)的次数。
这两个概念你一定要牢牢记住,因为它们意味着不同的性能问题:
所谓自愿上下文切换,是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
而非自愿上下文切换,则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换。
pid加上 -t 参数后,才会输出线程的指标。
所以,我们可以在第三个终端里, Ctrl+C 停止刚才的 pidstat 命令,再加上 -t 参数,重试一下看看:
# 每隔 1 秒输出一组数据(需要 Ctrl+C 才结束)
# -wt 参数表示输出线程的上下文切换指标
$ pidstat -wt 1
08:14:05 UID TGID TID cswch/s nvcswch/s Command
...
08:14:05 0 10551 - 6.00 0.00 sysbench
08:14:05 0 - 10551 6.00 0.00 |__sysbench
08:14:05 0 - 10552 18911.00 103740.00 |__sysbench
08:14:05 0 - 10553 18915.00 100955.00 |__sysbench
08:14:05 0 - 10554 18827.00 103954.00 |__sysbench
...