总结每天之上下文切换

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
...
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值