当前位置: 首页 > news >正文

内核态和用户态

用户所处的状态就是用户态,内核所处的状态就是内核态。而用户态和内核态存在的意义就是限制不同程序的访问权限。例如,当执行用户自己的代码时,进程所处的状态就是用户态,而当用户的代码中包含系统调用时,可能需要调用内核的代码,而调用内核的代码需要内核级别的权限,此时进程就需要转换成内核态。

举一个形象的例子,一个用户去银行取钱,从哪个账户取,取多少都是由用户自己决定的,这个阶段就是执行用户自己的代码,处于用户态。但是当用户提出取钱的要求之后,需要银行的工作人员帮他取钱,这时,取钱需要工作人员的权限,用户的权限就不够了。所以用户提出取钱的要求就是在调用内核的代码,这时就需要内核级别的权限,进入内核态。总之,当用户的代码中有自己的代码,也有涉及内核的代码,那这些代码由谁负责,谁有权限,就由谁来执行

总体来看,内核态执行的是操作系统的代码,权限较高,用户态执行的是普通用户的代码,权限较低。因此用户态无法访问内核态的代码。但是需要注意的是,进程处于内核态的时候,也不能访问用户态的代码。其原因是基于这样一点认识“操作系统默认所有用户都是恶意的”,如果处于内核态的进程执行了用户态的代码,那这些代码在内核中执行,就可能会对操作系统造成损害。

用户自己做自己的事情,就处于用户态,一旦涉及操作系统,那就处于内核态。

什么时候需要用户态和内核态之间的切换?

1,进程切换:当一个进程的时间片到了的时候,就需要将其切换下去,再把其它进程切换上来,再切换下去之前,需要保存进程当前的临时数据和上下文信息。具体过程如下:

(1)通过该即将被换下去的进程找到其虚拟地址空间,找到虚拟地址空间中的1G内核空间。通过内核空间所对应的内核页表的映射找到管理进程的操作系统代码。

(2)在当前进程的上下文空间中执行相应的代码,通过执行这些代码来保存进程的上下文信息和临时数据。

(3)换上另一个进程,这时需要加入当前进程的进程控制块,将进程的上下文信息和临时数据加载进来。在这之后进程就可以在用户态运行。

即当进程正常运行,行使功能的时候,都是处于用户态的,但当进程需要进行进程切换时上下文信息、临时数据的保存,恢复新切换上来的进程的上下文信息和临时变量时进程是处于内核态的。

2,进程对信号的处理:首先明确一点,进程在运行的时候,就是单纯的在运行,无法估计其它事务,只有当涉及时间片的切换或出现异常情况,进程暂时没有在运行的时候才能有机会对信号进行处理。进程处理信号的具体过程如下:

(1)由于时间片的切换或异常情况的出现,导致进程进入内核态,当进程在内核态处理完问题之后,需要对那些之前收到却被暂时挂起的信号进行处理。

(2)对于一个传递给进程的信号而言,分为三种情况:默认、忽略、按照自定义方式处理。如果是前两种,那就直接默认或忽略即可。如果是第三种,那所谓的自定义信号处理方式就需要到用户代码种寻找,这时处于内核态的进程就需要进入内核态,以便于寻找并执行用户自定义的信号处理方式。

(3)在对信号处理完毕之后,进程理应当是返回用户态正常执行任务的,虽然在处理自定义信号的时候,进程当前就处于用户态,但是这样的状态和默认状态下回到用户态的逻辑是不同的。因处理信号而回到用户态的进程并不在主控制流程中。所以该进程必须要再次进入内核,亦即回归主线,再通过内核返回用户态,到达刚刚进入内核态之前进程所运行到的下一行代码中,然后在用户态继续运行即可。

 

相关文章:

  • 学习笔记(9)JavaScript元素、节点
  • 2022届秋招Java岗高频面试题盘点,老司机也未必全会,真的太卷了
  • 飞机机场城市标签 易语言代码
  • 遍历Map集合、修改Map集合中的value值
  • Tapdata 杨哲轩:如何在零售行业实施主数据治理?
  • POSIX线程使用signal模拟“中断“处理流程
  • 深入Spring Boot :整合Redis详解
  • 检测数据类型
  • java多线程面试总结,字节跳动java面试题
  • python读取json格式文件大量数据,以及python字典和列表嵌套用法详解
  • 前端新特性
  • 有什么低价好用的电容笔推荐?大一新生必备物品
  • Vite打包优化插件
  • 一文搞懂nginx的反向代理 负载均衡
  • Redis的哨兵模式搭建
  • eclipse(luna)创建web工程
  • ES6--对象的扩展
  • JDK 6和JDK 7中的substring()方法
  • JS实现简单的MVC模式开发小游戏
  • JS题目及答案整理
  • Laravel 中的一个后期静态绑定
  • Logstash 参考指南(目录)
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 笨办法学C 练习34:动态数组
  • 官方解决所有 npm 全局安装权限问题
  • 强力优化Rancher k8s中国区的使用体验
  • 少走弯路,给Java 1~5 年程序员的建议
  • 小试R空间处理新库sf
  • 写代码的正确姿势
  • 优秀架构师必须掌握的架构思维
  • hi-nginx-1.3.4编译安装
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #《AI中文版》V3 第 1 章 概述
  • #ifdef 的技巧用法
  • (175)FPGA门控时钟技术
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (zt)最盛行的警世狂言(爆笑)
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (实战篇)如何缓存数据
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • *2 echo、printf、mkdir命令的应用
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .Net Web窗口页属性
  • .NET6 开发一个检查某些状态持续多长时间的类
  • [51nod1610]路径计数
  • [Android]通过PhoneLookup读取所有电话号码