CPU中的上下文
一.简介
Linux是多任务操作系统,cpu划分固定时间片,分给每个进程,当前进程时间片执行完毕,将挂起,运行下一个进程。而进程运行时,需要到寄存器中获得要运行的指令和指令所在内存的位置。
cpu上下文切换,就需要将寄存器中的数据保存到系统内核中,加载新程序的寄存器信息,跳转到计数器所指定的内存位置,开始读取和运行新进程。每次切换需要消耗cpu,繁上下文切换会影响性能。
二.进程切换
Linux 按照特权等级,把进程的运行空间分为内核空间和用户空间。0为内核态,3为用户态

一个进程如果要输出一些信息,只需要在用户空间完成即可,但要读取文件,就需要到内核空间完成,这个转变,就需要系统调用。需要把原先用户态的指令保存,加载内核态的指令到进寄存器,完成指令。这种不会涉及虚拟内存等用户态资源。只是同进程中,为了完成不同权限指令的切换。
进程由内核管理和调度,切换发生在内核态。上下文中保存了虚拟内存,栈,全局变量等用户空间资源,也保存了内核堆栈,寄存器等内核空间资源。因为除了保存寄存器信息,还需要刷新TLB管理的虚拟内存和用户栈
cpu在每个核心上维护了一个就绪列队,将正在运行和等待运行的进程按优先级和等待cpu时间排序。选择优先级最高和等待cpu时间最长的进程运行。
切换理由:
1.cpu划分固定时间片,分给每个进程,当前进程时间片执行完毕,将挂起,运行下一个进程。
2.运行sleep函数,自动挂起。
3.当前进程资源不足,例如内存需要2G,但内存不够,将挂起,当满足后再运行。
4.有优先级更高的进程,则当前进程挂起,运行新进程。
5.硬件中断,进程挂起,执行内核中的中断服务。
三.线程切换
进程是拥有资源的集合体,而线程是执行操作的单位。关系很像公司中部门和人员的关系。每个部分都有不同的资源,而部门中的人员则使用资源完成任务。
当只有一个线程的时候,线程等于进程
当有多个线程的时候,线程共享虚拟内存,全局变量等资源,这些资源上写文切换时不需要更改。
线程有自己的单独数据,栈和寄存器重存储的内容,切换需要保存。
切换理由:
前后2个线程属于不同进程,等同于进程的切换
前后2个线程属于同进程,切换只需要保存私有数据
相比进程的切换,将要节省更多资源
四.中断切换
当有硬件事件,例如在键盘打字,就会中断当前进程,响应硬件设备。中断切换并不涉及进程用户态,不需要保存和恢复虚拟内存,全局变量等用户态资源。只保存内核态,中断服务程序执行所必须的状态,包括cpu寄存器,内核堆栈,硬件终端参数等。
同cpu中,中断优先级最高,所以中断切换和进程之前切换并不会同时发生。
五.中断检测和查看
1.检查上下文切换情况
vmstat

cs(context switch)是每秒上下文切换的次数
in(interrupt)则是每秒中断的次数
r(Running or Runnable)是就绪队列的长度,也就是正在运行和等待 CPU 的进程数
b(Blocked)则是处于不可中断睡眠状态的进程数
2.每个进程的上下文切换情况
pidstat -w 5

cswch(voluntary context switches)每秒自愿上下文切换的次数
是指进程无法获取所需资源,导致的上下文切换,例如I/O、内存等系统资源不足时
nvcswch(non voluntary context switches)每秒非自愿上下文切换的次数
指进程由于时间片已到,有优先级更高的进程启动等原因,被系统强制调度从而切换。当大量进程抢夺cpu时,就容易发生此类切换。
六.模拟
sysbench,多线程基准测试工具
使用sysstat来检查监控和分析,包含mpstat用于查看每颗cpu的状态,pidstat查看每个进程的状态
rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
yum -y install sysbench sysstat
1.查看空闲系统上下文切换数据,3秒一次
vmstat 3

2.单独开一个终端
以 10 个线程运行 5 分钟的基准测试,模拟多线程切换的问题
sysbench --threads=10 --max-time=300 threads run

3.返回第一个终端,可以看到突然变大

r 列:就绪队列的长度已经到了 8,远远超过了系统 CPU,会导致频繁切换
us(user)和 sy(system)列:这两列的 CPU加起来就是100%,sy最高,主要是内核占用
in 列:中断次数也上升到了 1k左右,说明中断处理也是问题
说明等待使用cpu的进程太多,导致大量上下文切换,上下文切换导致cpu占用率升高。
4.查看具体应用
-w 参数表示输出进程切换指标,-u 参数则表示输出 CPU 使用指标
pidstat -w -u 3

可以看到sysbench占用了很高的cpu使用率很高,但没有产生多少上下文切换
5.查看多线程,-t显示线程
pidstat -wt 3

可以看到线程占用的很多
6.查看中断信息
/proc/interrupts 这个只读文件中读取,/proc 实际上是 Linux 的一个虚拟文件系统。/proc/interrupts 就是这种通信机制的一部分,用于内核空间与用户空间之间的通信,提供了一个只读的中断使用情况。
watch -d cat /proc/interrupts
CPU中的上下文的更多相关文章
- paip.提升性能--多核cpu中的java/.net/php/c++编程
paip.提升性能--多核cpu中的java/.net/php/c++编程 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http ...
- 如何添加“在这里打开PowerShell”到Windows中的上下文菜单
It was only a matter of time, right? Due to my recent infatuation passionate love affair with PowerS ...
- 【转】Python之向日志输出中添加上下文信息
[转]Python之向日志输出中添加上下文信息 除了传递给日志记录函数的参数(如msg)外,有时候我们还想在日志输出中包含一些额外的上下文信息.比如,在一个网络应用中,可能希望在日志中记录客户端的特定 ...
- 14.翻译系列:从已经存在的数据库中生成上下文类和实体类【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/code-first-from-existing-database.aspx EF 6 ...
- (转)Python中的上下文管理器和Tornado对其的巧妙应用
原文:https://www.binss.me/blog/the-context-manager-of-python-and-the-applications-in-tornado/ 上下文是什么? ...
- 5.翻译:EF基础系列---EF中的上下文类
原文地址:http://www.entityframeworktutorial.net/basics/context-class-in-entity-framework.aspx EF中的上下文类是一 ...
- [知识库:python-tornado]异步调用中的上下文控制Tornado stack context
异步调用中的上下文控制Tornado stack context https://www.zouyesheng.com/context-in-async-env.html 这篇文章真心不错, 非常透彻 ...
- Python 日志输出中添加上下文信息
Python日志输出中添加上下文信息 除了传递给日志记录函数的参数(如msg)外,有时候我们还想在日志输出中包含一些额外的上下文信息.比如,在一个网络应用中,可能希望在日志中记录客户端的特定信息,如: ...
- Python协程中使用上下文
在Python 3.7中,asyncio 协程加入了对上下文的支持.使用上下文就可以在一些场景下隐式地传递变量,比如数据库连接session等,而不需要在所有方法调用显示地传递这些变量.使用得当的话, ...
随机推荐
- Typora下载安装教程
Typoa下载和安装 Typora---程序员记事本!!! 这里我们选择Typora作为我们的编辑器,功能的强大需要各位自己去体会. Typora下载地址 点击链接打开,然后选择Download! 根 ...
- mysql 数据库中 int(3) 和 int(11) 有区别么???
今天去面试的时候 面试官问到了这个问题:int(3) 和 int(11) 有什么区别?? 当时一听有点蒙,(不知道为什么蒙,后来回来想想可能是觉得考官怎么会问这么简单的问题呢,所以蒙了),当时我的回答 ...
- NFS导致df -h卡主解决
NFS导致df -h无法使用解决 NFS服务意外断开,导致挂载的客户端"df -Th"命令无法使用,及挂载目录无法"cd""ls"解决思路: ...
- [spojDIVCNT1]Counting Divisors
定义 约定1:以下分数都是最简,且令$\frac{1}{0}$有意义,其大于其余分数,并称平行于$y$轴的直线斜率为$-\frac{1}{0}$ 分数加:对于分数$a=\frac{a_{1}}{a_{ ...
- [loj3341]时代的眼泪
题意即求在区间$[l,r]$中且权值在$[x,y]$中的逆序对个数 考虑分块,逆序对个数包含4部分: 1.左/右块外内部,预处理出$i$到其所在块的块首/尾,小于/小于等于$j$(需要对$j$离散)的 ...
- Scrum精髓读书笔记
Scrum精髓 四 . Sprint Sprint的定义 Scrum在最长一个月的迭代或周期中安排工作,一般为2个星期,这些迭代或周期称为Sprint Sprint提供基本的Scrum骨架,大多数其他 ...
- [IIS]发布到 IIS 上的程序没有权限访问共享文件
老板突然跑路了,丢下一个破项目让我一个人维护,各种奇葩问题不断. 为了弄一键发布,布置了新的环境,结果新环境下的程序不能访问共享文件了. 访问共享文件需要设置应用程序池(Application Poo ...
- CF1511E Colorings and Dominoes
考虑计数拆开贡献. 因为在一个方案中一个格子最多只会贡献一次,那么不妨反过来求这个格子贡献了多少次. 然后发现,行列独立,那么我们单独计算红蓝色,即可. 一个偶数块贡献当且仅当前面也是偶数块. 然后显 ...
- 洛谷 P3721 - [AH2017/HNOI2017]单旋(LCT)
洛谷题面传送门 终于调出来这道题了,写篇题解( 首先碰到这样的题我们肯定要考虑每种操作会对树的形态产生怎样的影响: 插入操作:对于 BST 有一个性质是,当你插入一个节点时,其在 BST 上的父亲肯定 ...
- intent.getSerializableExtra(转)
Activity之间通过Intent传递值,支持基本数据类型和String对象及它们的数组对象byte.byte[].char.char[].boolean.boolean[].short.short ...