CPU上下文切换(上)

CPU上下文切换

? 我们经常说的平均负载和cpu升高没有直接的关系,在不同的场景cpu升高会导致系统负载,但是系统负载不一定是cpu升高导致的。

一、系统负载过高的三种场景

  • cpu密集型进程,使用大量cpu会导致平均负载升高,此时这两者是一致的。
  • io密集型进程,等待io也会导致平均负载升高,但cpu不一定很高。
  • 大量等待cpu的进程调度也会导致平均负载升高,此时cpu使用率也会比较高。

? 大量进程竞争cpu(也就是上面的第三个场景),往往是被忽略的,cpu虽然没有使用,只是在竞争,也会发生负载吗?

? 我们都知道linux是一个多任务操作系统,它支持远大于cpu数量的任务同时运行,当然这些任务不是同时运行,而是系统在很短时间内,将cpu轮流分配给它们,造成多任务同时运行的错觉。而每个任务运行前,cpu需要知道任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设置好cpu寄存器和程序计数器

二、CPU寄存器和程序计数器

1. cpu寄存器:

? cpu内置的容量小、但速度极快的内存。

2. 程序计数器:

? 是用来存储cpu正在执行的指令位置、或者即将执行的下一条指令位置。他们都是cpu在运行任何任务前,必须的依赖环境,因此也被叫做cpu上下文。

3. cpu上下文切换

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

? 而这些保存下来的上下文,会存储在系统内核中,并在任务重新调度执行时再次加载进来。这样就保证原来任务的状态不受影响,让任务看起来还是连续运行。

? 根据任务不同,cpu的上下文切换就可以分为不同的几个场景,进程上下文切换,线程上下文切换以及中断上下文切换。

3.1. 进程上下文切换

? linux安装特权等级,把进程的运行空间分为内核空间和用户空间

![]

  • 内核空间(Ring0)具有最高权限,可以直接访问所有资源;
  • 用户空间(Ring3)只能访问受限权限,不能直接访问内存等硬件设备,必须通过系统调用陷入到内核中,才能访问特权资源。

? 所以,进程既可以在用户空间运行又可以在内核空间运行,在用户空间运行时,称为用户态。在内核空间运行时,称为内核态。

3.1.1. 系统调用是否发生cpu上下文切换
  • 系统调用:cpu寄存器里面原来的用户态的指令位置,需要先保存起来。接着,为了执行内核态代码,cpu寄存器需要更新为内核态指令的新位置。最后,才跳转到内核态运行内核任务。
  • 系统调用结束后:cpu寄存器需要恢复原来保存的用户态,然后再切换到用户空间,继续运行进程。所以,一次系统调用,其实发送了两次cpu上下文切换。
  • 系统调用过程中,并不会涉及到虚拟内存等进程用户态的资源,也不会切换进程。所以,系统调用通常称为特权模式切换,但实际上,系统调用也无法避免cpu上下文切换。
3.1.2. 进程上下文切换跟系统调用区别

? 进程是由内核来管理和调度的,进程的切换只能发生在内核态,所以,进程的上下文不仅包括了用户态的虚拟内存,用户栈,全局变量等资源。还包括了内核栈、寄存器等内核空间的状态。

? 因此,进程的切换比系统调用多了一步:在保存当前进程的内核状态和cpu寄存器之前,需要先把用户态的虚拟内存,用户栈保存下来;在加载了下一进程的内核态后,需要刷新进程的虚拟内核和用户栈。

? 保存上下文和恢复上下文的进程并不是免费的,需要内存在cpu上运行才能完成。

? 每次上下文切换都需要几十纳秒到微妙的cpu时间。这个时间还是相当可观。在进程上下文切换次数较多的情况下,很容易导致cpu将大量时间耗费在寄存器、内核栈以及虚拟内存等资源的保存和恢复上,进而大大缩短了真正运行进程的时间。这也是导致平均负载升高的重要因素。

? linux通过(tlb)来管理虚拟内存和物理内存直接的映射关系,当虚拟内存更新后,tlb也要更新,内存访问随之变慢。特别是在多处理器系统上,缓存被多个处理器共享,刷新缓存不仅影响当前处理器的进程,还会影响共享缓存的其他处理器的进程。

3.1.3. 进程什么时候切换

? 进程执行完终止了,会释放cpu,这个时候cpu从就绪队列里面拿一个新的进程运行,还有其他的一些非正常场景也会导致进程切换。

  • 时间片耗尽:为了保证所以进程可以得到公平调度,CPU时间被划分成一段段的时间片,这些时间片轮流分配给各个进程。当某个时间片耗尽了,就会被系统挂起,切换到其他等待cpu的进程运行。
  • 系统资源不足(如:内存不足):这个时候进程会被挂起,并由系统调度其他进程运行。
  • 进程主动挂起: 当进程通过睡眠函数sleep这样的方式将自己主动挂起时。
  • 高优先级进程:当有优先级高的进程出现时,为了保证优先级高的进程运行,当前进程会被系统挂起
  • 硬件中断时:当发生硬件中断时,Cpu上的进程会被中断挂起,转而执行内核中的中断服务程序。

    3.2. 线程上下文切换

    ? 线程和进程最大的区别在于,线程是调度的基本单位,而进程则是资源拥有的基本单位。所谓内核中的任务调度,实际上的调度对象是线程;而进程只是给线程提供了虚拟内存、全局变量等资源。所以,对于线程和进程可以理解为:

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

? 所以说:

? 当两个线程不属于同一进程时,线程上下文切换时。因为资源不共享,所以切换就相当于时进程间切换。

? 当两个线程属于同一进程时,线程上下文切换时。因为资源共享,只需要切换线程私有数据。

? 进程间切换消耗的资源多于线程间切换,所以就出现了多线程代替多进程的优势。

3.3. 中断上下文切换

? 为了快速响应硬件的事件,中断处理会打断进程的正常调度和执行,转而调用中断处理程序,响应设备事件。在打断其他进程时,就需要将进程当前状态保存起来。

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

? 对同一个cup来说,中断处理比进程拥有更高的优先级,所以中断上下文切换并不会与进程上线文切换同时发生。所以大部分中断处理程序都短小精悍,以便尽快的执行结束。

? 总结

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

原文地址:https://blog.51cto.com/12924846/2406421

时间: 2024-11-08 15:19:23

CPU上下文切换(上)的相关文章

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

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

03讲基础篇:经常说的CPU上下文切换是什么意思(上)

1.多任务竞争CPU,cpu变换任务的时候进行CPU上下文切换(context switch).CPU执行任务有4种方式:进程.线程.或者硬件通过触发信号导致中断的调用.2.当切换任务的时候,需要记录任务当前的状态和获取下一任务的信息和地址(指针),这就是上下文的内容.因此,上下文是指某一时间点CPU寄存器(CPU register)和程序计数器(PC)的内容, 广义上还包括内存中进程的虚拟地址映射信息.3.上下文切换的过程:(1)记录当前任务的上下文(即寄存器和计算器等所有的状态):(2)找到

cpu上下文切换(下)

cpu上下文切换如何查看 上一篇介绍了cpu上下文切换几种场景以及数据保存恢复过程,这篇文章介绍如何查看cpu上下文切换 一.vmstat 安装:yum install -y sysstat vmstat是一个常用的系统性能分析工具,主要用来分析系统的内存情况,也常用来分析cpu上下文切换和中断的次数. # vmstat <br/>procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----&l

Go语言在国产CPU平台上应用前景的探索与思考

http://www.chinaaet.com/article/3000087559 0 引言 CPU是电子产品的核心,代表着信息产业的发展水平.CPU发展至今已经有四十多年的历史了,实际就是Intel公司的发展历史[1].Intel的CPU和其兼容产品占领了PC的大半江山.我国CPU战略已经发展十余年,部分领域完全具有核心技术,产业化取得积极进展,但是与国际主流厂商Intel等仍存在较大差距.国产CPU由于受多方因素制约,单核性能并不高,在2000年左右所有的微处理器厂商都转向了多核微处理器的

2.2 CPU 上下文切换是什么意思?(下)

怎么查看系统的上下文切换情况 过多的上下文切换,会把 CPU 时间消耗在寄存器.内核栈以及虚拟内存等数据的保存和恢复上,缩短进程真正运行的时间,成了系统性能大幅下降的一个 元凶. 使用 vmstat 这个工具,来查询系统的上下文切换情况. vmstat 是一个常用的系统性能分析工具,主要用来分析系统的内存使用情况,也常用来分析 CPU 上下文切换和中断的次数. vmstat 的使用示例: [[email protected] ~]# vmstat 5 procs -----------memor

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

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

虚拟机评估——如何确定一个CPU核上部署的虚拟机数量?

最近研究虚拟化技术,不可避免遇到一个问题:如何评估物理主机上虚拟主机的容量?下面这篇文章的思路有一定的启发性,转发一下. 如何确定一个CPU核上部署的虚拟机数量? 摘要:本文说明一个CPU核上部署虚拟机的理想数量. 用户经常会问我这样一个问题,“在一个CPU核上部署虚拟机的理想数量是多少?”我试图从下面两个答案中其中一方面回答:要么用户基于业内测试实例做出决定,要么基于他们自己的桌面PC机来验证性能.评估CPU需求量. 用业内标准来评判,一个3.0GHz四核心双CPU的服务器通常可以负载的虚拟机

linux下如何将sheduler绑定到制定的cpu核上

作者:张昌昌 1.顺序绑定 erl +sbt db 是按从前到后的顺序来绑定调度器的,如: erl +sbt db +S 3含义是启动erlang虚拟机,开启3个调度器,按顺序绑定在0,1,2号核上. 2.随机绑定 利用taskset命令, taskset -c 1,3,5 erl +S 3:含义是启动3个调度器的erlang虚拟机,3个调度器分别绑定在指定的1,3,5号cpu核上,然后可执行 top命令,按下1查看各核的负载情况. taskset -c 1-5 erl +S 5:含义是启动5个

Linux 进程、线程运行在指定CPU核上

/******************************************************************************** * Linux 进程.线程运行在指定CPU核上 * 说明: * affinity参数决定了进程.线程是否可在CPU多核之间切换,当然,并不是说就不进行 * 线程切换. * * 2017-9-22 深圳 龙华樟坑村 曾剑锋 *********************************************************