CPU上下文

--来自极客时间倪朋飞老师学习后总结

1.CPU上下文相关知识

1.1任务的同时运行

前面总结了python多进程多线程的笔记
在python中,只有多进程能够利用多核CPU的优势,实现真正意义的同时运行
在python中,多线程时不能利用多核CPU的优势的,所谓的同时运行,是CPU对多个任务的切换,看起来像同时运行
所以多进程处理运算密集型任务性能较高,因为可以利用多核CPU,
    而且进程的创建需要的时间和资源比线程多,所以多进程对IO密集型的任务性能低。
多线程处理IO密集型任务性能较高,因为多线程是不能利用多核CPU的优势
    多线程的创建需要的资源和时间比进程小,遇见IO可以快速进行任务的切换。

1.2CPU上下文切换

"首先认识下上下文切换
就是下面的cs列"
[[email protected] ~]# vmstat
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 1893932  23704  32412    0    0    12     1   17   14  0  0 100  0  0
[[email protected] ~]#
"CPU寄存器和程序计数器"
前面说到了CPU任务的切换
在任务切换时
需要记录下当前任务的相关位置和变量等数据信息
同时需要记录下下个任务的位置和变量等信息
因为CPU需要知道任务从哪里加载,从哪里开始运行,所以系统中设置了"CPU寄存器和程序计数器(program counter,PC)"
"CPU上下文(CPU寄存器和程序计数器)"
CPU寄存器是CPU内置的容量小,速度快的内存
程序计数器(PC)是用来存储CPU正在执行的指令位置或下一条指令的位置。
他们都是CPU运行任务前,必须依赖的环境,因此也叫CPU上下文。
"CPU上下文切换"
1.CPU上下文切换,就是把任务A的CPU上下文保存起来,任务A处于就绪状态
2.加载新任务B的上下文到CPU寄存器和程序计数器
3.跳转到程序计数器指定的新位置,运行新任务B
4.等CPU切换到任务A运行时,重新加载任务A的寄存器和程序计数器,接着任务A的上次位置继续运行,这样任务A不会受影响
"如果操作系统频繁的进行这些切换操作,肯定也是需要消耗系统资源的"
"CPU上下文切换的种类"
1.进程上下文
2.线程上下文
3.中断上下文

1.3进程上下文

"内核态和用户态"
Linux按照特权等级,把进程的运行空间分为内核空间和用户空间,分别对应着CPU特权等级的Ring0和Ring3
内核空间(Ring0):可以直接访问硬件资源
用户空间(Ring3):不能直接访问内存等硬件资源,可以通过Ring1,Ring2这些系统调用的接口程序进入到内核空间,然后访问硬件资源
进程可以在用户空间和内核空间中运行。
进程在用户空间运行,称为用户态
进程在内核空间运行,称为内核态
"系统调用"
从用户到内核态的转变,是通过系统调用的接口程序完成的
比如操作文件,需要多次系统调用
1.调用open()打开文件
2.调用read()读文件内容
3.调用write()将内容写道标准输出
4.调用close()关闭文件
"进程的上下文切换,是从一个进程切换到另一个进程"
"系统调用过程中一直是一个进程在运行,是进程在用户态的程序,调用一些系统的接口程序,进入到内核态,进而操作硬件资源"
"所以系统调用称为特权模式的切换,不是上下文切换。
但实际上,系统调用过程中,也会发生CPU的上下文切换
因为CPU会根据自己的算法,进行任务的切换,包括操作系统自身的代码"


"进程的上下文切换"
1.进程的切换是发生在内核态的
2.进程切换时,会保存当前进程的寄存器和程序计数器
3.加载新进程,刷新寄存器和程序计数器

进程的上下文切换即使速度很快,但是在切换次数较多时,也会消耗大量的CPU资源
因而上下文的切换,也是导致平均负载升高的一个重要因素

进程切换时才需要上下文的切换
linux为每个CPU维护了一个就绪队列,在就绪队列中的进程,会根据操作系统的调度算法或优先级,使得就绪队列中的进程处于运行状态
"那进程在什么时候才会被调度到CPU上运行呢"
1.一个进程的CPU时间片用完
    为了保证进程的公平调度,CPU时间被划分为多个时间片
    这些时间片被轮流分给各个进程
    当一个进程的时间片耗尽,就会被系统挂起,处于就绪状态,切换执行就绪队列中的另一个进程
2.系统资源不足时(例如内存不足)
    等到资源充足后才可以运行,这个时候进程被挂起,由系统调度运行其他进程
3.当进程调用sleep函数,主动将自己挂起时,会调用其他进程
4.优先级较高的进程运行时,当前进程会被挂起,运行高优先级的进程
5.发生硬件中断时,CPU上的进程会被挂起,执行内核中的终端服务程序
"一旦出现上下文切换性能问题,上面的原因就是参考依据"

1.4线程上下文切换

原文地址:https://blog.51cto.com/10983441/2401960

时间: 2024-08-29 06:34:25

CPU上下文的相关文章

上下文切换,CPU上下文介绍

1.什么是上下文? Linux是一个多任务的操作系统,它支持远大于CPU数量的任务同时运行,当然,这些任务实际上并不是真正的在同时运行,而是系统在很短的时间内,将CPU轮流分配给他们,给用户造成很多任务同时运行的错觉. 在每个任务运行前, CPU 都需要知道任务从哪里加载,又从哪里开始运行.也就是说,需要系统事先给他设置好 CPU 寄存器和程序计数器(Program Counter,PC) CPU 寄存器:是 CPU 内置的容量小.但速度极快的内存 程序计数器:是用来存储 CPU 正在执行的指令

cpu上下文切换

cpu上下文就是寄存器和程序计数器.这里记录着指令的位置,他们存在系统内核 系统调用过程叫上下文切换. 进程的上下文切换,线程的上下文切换,中断的上下文切换 一:进程的上下文切换:他与系统调用的不同是,进程中还包括,虚拟内存,全部变量,栈等用户态.也包括寄存器,内核堆栈等内核态 二:线程的上下文切换,如何进程中只一个线程,那这个线程相当于线程 三:中断上下文切换:会打断正常的进程,优先级高 怎么查看系统上下文切换? 利用sysbench,vmstat,pidstat ,和 /proc/inter

CPU上下文切换(上)

CPU上下文切换 ? 我们经常说的平均负载和cpu升高没有直接的关系,在不同的场景cpu升高会导致系统负载,但是系统负载不一定是cpu升高导致的. 一.系统负载过高的三种场景 cpu密集型进程,使用大量cpu会导致平均负载升高,此时这两者是一致的. io密集型进程,等待io也会导致平均负载升高,但cpu不一定很高. 大量等待cpu的进程调度也会导致平均负载升高,此时cpu使用率也会比较高. ? 大量进程竞争cpu(也就是上面的第三个场景),往往是被忽略的,cpu虽然没有使用,只是在竞争,也会发生

Linux性能优化从入门到实战:03 CPU篇:CPU上下文切换

??linux操作系统是将CPU轮流分配给任务,分时执行的.而每次执行任务时,CPU需要知道CPU寄存器(CPU内置的内存)和程序计数器PC(CPU正在执行指令和下一条指令的位置)值,这些值是CPU执行任务所依赖的环境,也就是CPU上下文. ??CPU上下文切换,就是把前一个任务的CPU上下文(CPU寄存器和程序计数器)保存起来,然后加载入新任务的上下文到CPU寄存器和程序计数器中,最后跳转到程序计数器所指的位置,运行新任务. ??保存下来的上下文会在系统内核中,并在任务重新调度执行时再次加载进

CPU 上下文切换之理论篇(上)

1.什么是上下文?答:上下文是由CPU寄存器和程序计数器组成 2.CPU为什么进行上下文切换?答:CPU上下文切换,是保证Linux系统正常工作的核心功能之一 3.什么是CPU上下文切换?答:CPU上下文切换,就是先把前一个任务的CPU上下文保存起来,然后加载新任务的上下文到这些寄存器和程序计数器中,最后跳转到程序计数器所指的新位置,运行任务 4.什么是cpu寄存器?答:cpu寄存器是cpu内置很小.但速度极快的内存 5.什么是程序计数器?答:是用来存储CPU正在执行的指令位置.或者即将执行的下

【转帖】如果进入CPU的世界,时间会是怎样的?

如果进入CPU的世界,时间会是怎样的? 2018-02-26 20:52:46 world6 阅读数 1295更多 分类专栏: 网络 缓存服务 架构 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/world6/article/details/79375690 每个人都会有一些吐槽的想法存在,我替CPU把它的吐槽 放在我的博客里吧! 不知道大家有没有感觉每天写代码的时间过得很快啊,有时候一

Oracle 11g数据库详解(2015-1-18更新)

Oracle 11g数据库详解 整理者:高压锅 QQ:280604597 Email:[email protected] 大家有什么不明白的地方,或者想要详细了解的地方可以联系我,我会认真回复的 1   简介 数据库操作主要有以下几步: 1.  启动.停止数据库 2.  连接.断开数据库 3.  创建.修改.删除数据库用户 4.  表空间 5.  新建.修改.删除表 6.  查询.插入.修改.删除表数据 7.  新建.修改.删除视图 8.  新建.修改.删除存储过程 9.  新建.修改.删除触发

C++基本知识点总结(网摘)

原文出处:[Fei Guo] 1. 结构体和共同体的区别. 定义: 结构体struct:把不同类型的数据组合成一个整体,自定义类型. 共同体union:使几个不同类型的变量共同占用一段内存. 地址: struct和union都有内存对齐,结构体的内存布局依赖于CPU.操作系统.编译器及编译时的对齐选项. 关于内存对齐,先让我们看四个重要的基本概念: 1.数据类型自身的对齐值: 对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,

转载c++面试题

转载地点:http://www.cnblogs.com/LUO77/p/5771237.html  1. 结构体和共同体的区别. 定义: 结构体struct:把不同类型的数据组合成一个整体,自定义类型. 共同体union:使几个不同类型的变量共同占用一段内存. 地址: struct和union都有内存对齐,结构体的内存布局依赖于CPU.操作系统.编译器及编译时的对齐选项. 关于内存对齐,先让我们看四个重要的基本概念: 1.数据类型自身的对齐值: 对于char型数据,其自身对齐值为1,对于shor