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

1.什么是上下文?

Linux是一个多任务的操作系统,它支持远大于CPU数量的任务同时运行,当然,这些任务实际上并不是真正的在同时运行,而是系统在很短的时间内,将CPU轮流分配给他们,给用户造成很多任务同时运行的错觉。

在每个任务运行前, CPU 都需要知道任务从哪里加载,又从哪里开始运行。也就是说,需要系统事先给他设置好 CPU 寄存器和程序计数器(Program Counter,PC)

  • CPU 寄存器:是 CPU 内置的容量小、但速度极快的内存
  • 程序计数器:是用来存储 CPU 正在执行的指令位置、或者即将执行的下一条指令位置

综上所述,我们就有答案了

什么是上下文:

我们通常说的上下文又叫CPU上下文,是CPU运行任何任务前,必须依赖的环境,包括CPU 寄存器和程序计数器

上下文切换:就是先把前一个任务的 CPU 上下文(也就是 CPU 寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。

2.上下文切换详细介绍

根据CPU切换运行任务的不同,又可以分为进程上下文切换线程上下文切换中断上下文切换

我们先了解下面2个上下文切换涉及的知识点系统调用、进程运行态

进程的运行态:

Linux 按照特权等级,把进程的运行空间分为内核空间用户空间 。在这两种空间中运行的进程状态分别称为内核态用户态

  • 内核空间(Ring 0):具有最高权限,可以直接访问所有资源(读取文件,)

    • 分配内存、IO操作、创建子进程……都是内核操作。这也表明,当IO操作频繁时,System参数会很高。
  • 用户空间(Ring 3):只能访问受限资源,不能直接访问内存等硬件设备,必须通过系统调用进入到内核中,才能访问这些特权资源
    • 典型的用户态空间程序有:Shells、数据库、web服务器、PHP程序、Java程序……

在linux系统使用top命令查看cpu时,能看到user和system两项,对应的就是用户态和内核态占用的cpu资源

如上,我们的web服务是运行在用户态下的,对文件的io没有权限,当需要读取文件时,就涉及到系统调用

系统调用:

从用户态到内核态的转变,需要通过系统调用来完成。比如查看文件时,需要执行多次系统调用:open、read、write、close等。系统调用的过程如下:

  • 把 CPU 寄存器里原来用户态的指令位置保存起来;
  • 为了执行内核代码,CPU 寄存器需要更新为内核态指令的新位置,最后跳转到内核态运行内核任务;
  • 系统调用结束后,CPU 寄存器需要恢复原来保存的用户态,然后再切换到用户空间,继续运行进程;

所以,一次系统调用的过程,其实是发生了两次 CPU 上下文切换。

进程上下文切换?

  • 进程执行终止,它之前顺颂的CPU就会被释放出来,这时就从就绪队列中取出下一个等待时间片的进程;
  • 当某个进程的时间片耗尽,它就会被系统挂起,切换到其他等待CPU的进程运行;
  • 某个进程因为需要的系统资源比较大(比如内存不足),这时候该进程会被挂起,系统会调度其他进程执行;
  • 当有优先级更高的进程(系统操作进程)需要时间片,为了保证优先级更高的进程能够执行,当前进程会被挂起;
  • 如果当前进程中有sleep函数,他也会被挂起;

线程的上下文切换?

对操作系统来说,线程是最小的执行单元,进程是最小的资源管理单元。说白了,所谓内核中的任务调用,实际上的调度对象是线程;而进程只是给线程提供了虚拟内存、全局变量等资源。所以,对于现场和进程,我们可以这么理解:

  • 当进程只有一个线程时,可以认为进程就等于线程。
  • 当进程拥有多个线程时,这些线程会共享父进程的资源(即共享相同的虚拟内存和全局变量等资源)。这些资源在上下文切换时是不需要修改的。
  • 另外,线程也有自己的私有数据,比如栈和寄存器等,这些在上下文切换时也是需要保存的。

综上,线程上下文切换有两种情况:

  • 前后两个线程属于不同进程,因为资源不共享,所以切换过程就跟进程上下文切换是一样的;
  • 前后两个线程属于同一个进程,因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源就保持不动,只需要切换线程的私有数据、寄存器等不共享的数据。

中断上下文切换?

中断处理会打断进程的正常调度和执行。在打断其他进程时,需要将进程当前的状态保存下来,中断结束后,进程仍然可以从原来的状态恢复运行。

中断上下文切换并不涉及到进程的用户态。所以,即便中断过程打断了一个正处在用户态的进程,也不需要保存和恢复这个进程的虚拟内存、全局变量等用户态资源。中断上下文,其实只包括内核态中断服务程序执行所必须的状态,包括 CPU 寄存器、内核堆栈、硬件中断参数等。

小结

根据Tsuna的测试报告,每次上下文切换都需要几十纳秒到数微妙的CPU时间,这个时间还是相当可观的。

不管是哪种场景导致的上下文切换,你都应该知道:

  1. CPU上下文切换,是保证Linux系统正常工作的核心功能之一,一般情况下不需要我们特别关注。
  2. 但过多的上下文切换,会把CPU时间消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上,从而缩短进程真正运行的时间,导致系统的整体性能大幅下降。

原文地址:https://www.cnblogs.com/JaminXie/p/10984379.html

时间: 2024-11-01 20:49:43

上下文切换,CPU上下文介绍的相关文章

CPU上下文

--来自极客时间倪朋飞老师学习后总结 1.CPU上下文相关知识 1.1任务的同时运行 前面总结了python多进程多线程的笔记 在python中,只有多进程能够利用多核CPU的优势,实现真正意义的同时运行 在python中,多线程时不能利用多核CPU的优势的,所谓的同时运行,是CPU对多个任务的切换,看起来像同时运行 所以多进程处理运算密集型任务性能较高,因为可以利用多核CPU, 而且进程的创建需要的时间和资源比线程多,所以多进程对IO密集型的任务性能低. 多线程处理IO密集型任务性能较高,因为

Google Developing for Android 一 - 相关上下文介绍

前几天在G+上看到Google Developers站点,有一个Android系列的文章,分享到个人微博,周末闲来没事就学写了下,把它们简单的翻译了下,没想到一发不可收拾,六篇文章全部都翻译完了,有些地方省略了部分示例的描述或者换了另一种表述,如果有理解的不准确的地方,还望指正 原文:Developing for Android, I:Understanding the Mobile Context context或者这些建议为何如此重要 对于理解这些最佳实践的相关上下文是非常重要的.特别是明白

小时代5-perl上下文介绍

perl不像C/C++有各种变量类型.perl中的变量类型通过上下文来确定,到底是字符串还是整形变量.例如: my $para = @_ #这是标量上下文,$para得到的是@_中元素的个数. my ($para) = @_ #这是列表上下文,$para得到的是@_中的元素值. 具体是什么上下文是由等号左边的变量类型决定的,等号左边是标量,则是标量上下文,等号左边是列表,则是列表上下文. 强制指定标量上下文 使用scalar函数 my @a = (1..10) ; print @a ;#打印1-

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的介绍:参考博客:https://blog.csdn.net/stpeace/article/details/80101441 官名叫做微处理器,微处理器由一片或少数几片大规模集成电路组成的中央处理器,这些电路执行控制部件和算数逻辑部件的功能. CPU从逻辑上可以划分成3个模块,分别是 1控制单元: 控制单元是整个CPU的指挥控制中心,由 程序计数器PC(Program Counter), 指令寄存器IR(Instruction Register).指令译码器ID(Instruction

监控CPU(二)

常见的监控CPU的工具基本的就是top mpstat sar vmstat(上下文切换/CPU数目是否够).再有就是去看/proc/里边的文件信息了,因为里边记录系统运行时刻的东西,牛叉的就是nmon AIX的监控工具. sar使用请参照:http://www.chinaz.com/server/2013/0401/297942.shtml top top - 10:30:11 up 46 min,  3 users,  load average: 0.10, 1.00, 1.00 Tasks: