CPU上下文

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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线程上下文切换

以上是关于CPU上下文的主要内容,如果未能解决你的问题,请参考以下文章

分享几个实用的代码片段(附代码例子)

分享几个实用的代码片段(附代码例子)

片段无法转换为上下文

如何在android的片段中设置应用程序上下文?

片段未附加到上下文 - 延迟的 UI 更改

片段活动中的 ListView 适配器上下文错误,我该怎么办?