用户态和内核态的切换

我们经常说,一个程序依赖DMA设备来减少用户态和内核态的切换次数,以此来提升性能。那么对于它的细节是如何进行的呢?本篇,博主与你一起研究一下用户态和内核态的划分,以及这件事情的前因后果。

用户空间和内核空间

对于32位的操作系统而言,它的寻址空间最大为4g(2的32次方),换言之一个系统进程最大可运行的内存地址空间为4个G,操作系统核心空间占用1g,其他3g则给予用户空间使用。针对Linux操作系统而言,最高的1G字节(从虚拟地址 0xC0000000 到 0xFFFFFFFF),由内核使用,称为内核空间,而较低的3G的字节(从虚拟地址 0x00000000 到 0xBFFFFFFF)由各个进程使用,称为用户空间。

为什么要区分内核空间和用户空间

为了安全,通过隔离内核空间和用户空间,使得相互之间不受影响。内核空间由操作系统所管理,负责的都是比较核心的资源管理,甚至中断等。通过环境隔离,使得操作系统的资源被保护起来,这样不会因为用户空间的用户进程滥用崩溃从而导致内核空间也跟着崩溃。

内核空间这些指令在CPU层面被称之为R0级的指令,而用户空间则运行在R3级别的指令集。操作系统也是应用了cpu的这种指令级别划分。

什么是用户态和内核态

通过上文的分析,我们已经了解到操作系统通过空间隔离,隔离用户的程序和操作系统的程序,这就使得它们之间互不影响。从而建立操作系统程序的健壮性。但是,这种空间隔离也带来了运行程序额外的开销,即空间切换。

进程运行在内核空间就处于内核态,运行在用户空间则属于用户态,任何一个进程,有两个堆栈,在(内核态和用户各有一个堆栈),这就使得用户在发起一个系统调用或者系统中断的时候必须要暂停当前的应用程序,并且保存当前程序的上下文,并且将程序切换到内核堆栈中执行。这个切换的过程,也就是我们所说的性能开销。

用户态切换到内核态的3种方式

  • 系统调用:用户进程通过系统函数发起一次系统调用,系统调用的机制,核心是使用了操作系统为用户开放的终端来实现,例如Linux的ine 80h中断
  • 异常:CPU通过持有的虚拟地址和地址总线访问链接在地址总线上的所有设备,由MMU将虚拟地址转换成物理地址,当没有创建一个虚拟地址到物理地址的映射,或创建了映射,但物理页不允许写的时候,触发的缺页异常
  • 设备的中断信号:当外围设备处理完成某项操作之后,它会发出一个中断信号,以此来中断当前运行的用户程序,转而抢占cpu的执行权。比如硬盘的读写完成、用户的输入输出。这些都需要优先处理。否则,用户端看起来只能是操作的卡顿。

运行态切换的细节

  • 从当前进程的描述符中提取其内核栈的ss0和esp0的信息

  • 使用ss0和esp0指向的内核栈将当前进程的cs,eip,eflags,ss,esp信息保存起来。

  • 将先前由中断向量检索得到的中断处理程序的cs,eip信息装入相应的寄存器,开始

    执行中断处理程序,这时就转到了内核态的程序执行了。

说明:那么上面的这个过程细节,目前来看,也没有那么明朗,虽然大家都这样写。但是,并没有一个实际的案例。

这里博主先todo,稍后单开一篇文章叙述。到时这里会换上链接,当然,比较着急的同学也可以参考这篇:

https://zhuanlan.zhihu.com/p/142084966

番外篇:cpu占比(top3)

  • us(user) :cpu在用户空间的消耗时间百分比
  • sy(system): cpu在内核空间的消耗时间百分比
  • ni(niceness): cpu消耗在低优先级程序消耗的时间百分比
  • id(idle) : cpu空闲时间百分比
  • wa(wait) : cpu等待外部 i/o的时间百分比,在此期间纯粹等待,这个值太高则说明外围设备有问题
  • hi(hardware interrupt): cpu响应硬件设备中断所占用的百分比
  • si(software interrupt):cpu 响应软件中断所占用的百分比
  • st(stole time) : 只对虚拟机有效,指当前虚拟机cpu时间中,被同一台物理机上其他虚拟机偷走的时间百分比

参考文章

  • 详解用户态和内核态切换:https://www.cnblogs.com/sparkdev/p/8410350.html
  • 番外top3:https://cloud.tencent.com/developer/article/1352415
  • cpu的运行级别和保护机制:https://zhuanlan.zhihu.com/p/55478625
  • 切换细节:https://www.cnblogs.com/maxigang/p/9041080.html

用户态和内核态的切换相关推荐

  1. 操作系统 | 用户态和内核态的切换(中断、系统调用与过程(库函数)调用)

    文章目录 中断 过程调用 系统调用 过程调用和系统调用的区别 中断 用户态.内核态之间的切换是怎么实现的? 用户态→内核态 是通过中断实现的.并且 中断是唯一途径 . 核心态→用户态 的切换是通过执行 ...

  2. Linux系统编程33:进程信号之详解信号的捕捉过程,用户态和内核态及其切换,sigaction和signal

    文章目录 (1)用户态和内核态 (2)用户态和内核态的切换 (3)内核是如何实现信号的捕捉 (4)sigaction (1)用户态和内核态 我们说过,每个Linux进程有4GB的地址空间 其中0-3G ...

  3. 用户态和内核态的切换耗费时间的原因

    用户态和内核态的切换耗费时间的原因 总的来说,就是线程切换或者加锁解锁都是因为需要用户态和内核态的切换,从而导致的开销大. 应用程序的执行需要依托内核提供的资源,包括CPU.存储.IO等,因此内核提供 ...

  4. 进程用户态和内核态及其切换过程

    1.进程的堆栈 内核在创建进程的时候,会为进程创建相应的堆栈.每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间.当进程在用户空间运行时,CPU堆栈指针寄存器里面的内容是用户堆 ...

  5. 用户态和内核态之间的切换

    用户态和内核态之间的切换 切换方式 从用户态到内核态切换可以通过三种方式,或者说会导致从用户态切换到内核态的操作: 系统调用,这个上面已经讲解过了,在我公众号之前的文章也有讲解过.其实系统调用本身就是 ...

  6. 进程用户态和内核态及其切换过程(转)

    1.进程的堆栈 内核在创建进程的时候,会为进程创建相应的堆栈.每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间.当进程在用户空间运行时,CPU堆栈指针寄存器里面的内容是用户堆 ...

  7. 系统调用原理与用户态以及内核态相互切换过程,以linux系统为主

    1. 讲系统调用前需要清楚的几个基本概念 1.1 内核态与用户态 内核态:当CPU执行内核的代码(CPU堆栈指针指向内核堆栈)时,我们就称此时处于内核态,内核态的代码可以使用特权指令,这些指令可以控制 ...

  8. 操作系统用户态和内核态之间的切换过程

    操作系统用户态和内核态之间的切换过程 1. 用户态和内核态的概念区别 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重 ...

  9. 用户态与内核态之间切换详解

    用户空间和内核空间 用户程序有用户态和内核态两种状态.用户态就是执行在用户空间中,不能直接执行系统调用.必须先切换到内核态,也就是系统调用的相关数据信息必须存储在内核空间中,然后执行系统调用. 操作硬 ...

最新文章

  1. 易语言 基础知识一及认识句柄 局部变量
  2. express get和post数据
  3. jsp中c:forEach的应用
  4. 有监督回归:鲁棒学习
  5. c语言教改课程项目,C语言程序设计课程的教学改革.pdf
  6. Vue项目 全局定义日期时间方法处理
  7. linux bttrack服务,使用Docker安装OpenTracker,自建BT Tracker服务器
  8. freepiano 手残党也想弹钢琴(在电脑上弹奏电子钢琴自娱自乐,也许还是有点困难,不如试试freepiano+鼠标宏,这样用简谱就不怕残疾了)
  9. RAID技术全解图解-RAID0、RAID1、RAID5、RAID100
  10. git添加对勾图标 TortoiseGit安转配置
  11. 2022 华东师范大学 数据学院复试机考
  12. 2024 递归Eason
  13. 金融系列-会计基础知识
  14. AutoCAD 2019 常用命令速查手册
  15. 面试官:Spring 用了哪些设计模式?说三种即可 = =
  16. wow(2) : UI插件_EUI[2]_正式服配置分享
  17. 2021哔哩哔哩1024程序员节日第二弹:安全攻防挑战赛
  18. 在linux后台运行脚本的方法和命令
  19. 联想笔记本更换固态硬盘和重装系统
  20. 盗版免费升级到Win10仍是盗版 官方不保证稳定性

热门文章

  1. java毕业生设计抑郁症患者博客交流平台计算机源码+系统+mysql+调试部署+lw
  2. oracle 01722 无效数字,Oracle连接字符串报错误ORA-01722:无效数字的解决方法
  3. 淘宝天猫1688京东商品详情API接口,封装接口可高并发
  4. 2022年,绩效管理周期的综合指南
  5. 【面试必读】求你们不要再问我Java中的锁及优化了?
  6. 高屋建瓴 | 13页PPT讲述中台架构在阿里的实现!
  7. 惠动女神 | 三八节云和恩墨福利已派送, 请查收
  8. Qt——自定义编程风格指南(未完成)
  9. javaSE (十五)正则表达式应用(字符串排序、替换、叠词的切割与替换、查找和导出)
  10. 阿里开放平台获取refresh_token