首页 > 其他分享 >上下文切换

上下文切换

时间:2023-02-01 14:23:38浏览次数:32  
标签:线程 内核 进程 上下文 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 寄存器、内核堆栈、硬件中断参数等。

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

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

CPU上下文切换,是保证Linux系统正常工作的核心功能之一,一般情况下不需要我们特别关注。

但过多的上下文切换,会把CPU时间消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上,从而缩短进程真正运行的时间,导致系统的整体性能大幅下降。
————————————————
版权声明:本文为CSDN博主「DO your like」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36777191/article/details/113597811

标签:线程,内核,进程,上下文,CPU,切换
From: https://www.cnblogs.com/iancloud/p/17082438.html

相关文章

  • Android全局获取Context上下文实例
    如题,在没有用到Activity的类中也能轻松获取上下文Context实例方法很简单,继承Application,提供获取上下文的静态方法供全局调用在Application类的onCreate()方法中获取Con......
  • 前端主题切换方案详解 转载
    前端主题切换方案 现在我们经常可以看到一些网站会有类似暗黑模式/白天模式的主题切换功能,效果也是十分炫酷,在平时的开发场景中也有越来越多这样的需求,这里大致罗列一些......
  • QML实现换肤(主题样式切换)
    QtQuick没有像QtWidgets那样的QSS样式表机制,只能通过自定义组件或者设置Controls主题来实现样式定制。目前网上搜到的换肤功能,大多是定义一个全局的样式文件,在自定......
  • XCL-Charts图表库中柱形图的同源风格切换介绍
         柱形图是被使用最多的图之一,在写XCL-Charts这个Android图表库时,为它花费的时间相当多,不是因为有多难绘制,而是要在设计时如何才能保证图基类能适应各种情况,能......
  • 0148-Go-上下文
    环境Time2022-08-25Go1.19前言说明参考:https://gobyexample.com/context目标使用Go语言的上下文。示例packagemainimport("fmt""net/http""time"......
  • 多个版本的JDK切换
    一、前言想要实现多个版本的JDK切换自如二、步骤1、下载好所需要的JDK点击前往JDK下载页面2、安装略3、配置现在我下载了两个版本1)打开系统->高级系统设置->系统......
  • nodejs 安装多版本 版本切换
    版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/qq_40127119/article/details/128450398————......
  • Node快速切换版本、版本回退(降级)、版本更新(升级)
    方案一:全局安装nnpminstall-gn安装最新稳定版nodenstable安装最新版本nodenlatest安装某个具体node版本n14.16.1删除某个版本nrm14.16.1查......
  • win10如何设置一键关机休眠切换系统图标
    1.一键关机2.一键休眠创建快捷方式——一键休眠C:\Windows\System32\rundll32.exepowrprof.dll,SetSuspendStateHibemate3.切换任务图标https://www.kafan.cn/A......
  • 用VB6写了个防火墙助手,方便切换
    用VB6写了个防火墙助手,方便切换感觉就是速度很快,无他哈哈下载:​​http://free5.ys168.com/?tanaya​​进入:我开发的免费软件   ......