用户态和内核态的简单理解「建议收藏」

用户态和内核态的简单理解「建议收藏」文章目录linux基础系统调用和库函数的区别什么是用户态和内核态用户态和内核态的相互转换linux基础linux的kernel内核外是系统调用,系统调用外是shell、库函数系统调用和库函数的区别内核:屏蔽了调用各硬件资源的细节系统调用:内核提供给用户调用的接口,但系统调用的可移植性差移植性差的原因:windows、linux内核的系统调用是不同的,比如:同一个功能提供给用户的函数名、参数都不相同,会出现从一个系统移植到另一个系统无法正常运行。库函数:为了解决系统调用移植新差的问题,同时封

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

linux基础

linux的kernel内核外是系统调用,系统调用外是shell、库函数,而应用程序则在最外层
在这里插入图片描述

系统调用和库函数的区别

  • 内核:屏蔽了调用各硬件资源的细节
  • 系统调用:内核提供给用户调用的接口,但系统调用的可移植性差
    移植性差的原因:windows、linux内核的系统调用是不同的,比如:同一个功能提供给用户的函数名、参数都不相同,会出现从一个系统移植到另一个系统无法正常运行。
  • 库函数:为了解决系统调用移植新差的问题,同时封装windows和linux系统调用,对用户提供一个的函数(接口)。
  • 系统调用在内核地址空间执行,而库函数是在用户地址空间调用。

在这里插入图片描述

为什么要区分用户态和内核态?

在CPU指令中,有些指令是非常危险的,如果错用将导致系统崩溃,比如清内存、设置时钟等,所以CPU将指令分为特权指令和非特权指令。对于危险指令,只允许操作系统及其相关模块使用,普通应用程序只能使用不危险的指令。

  • Intel的CPU将特权等级分为4个级别:Ring0~Ring3,而Linux使用Ring3级别运行用户态,Ring0作为内核态。
  • 操作系统启动时对内存进行了划分,操作系统的数据都是存放于内核空间的,用户进程的数据是存放于用户空间的。处于用户态级别的程序只能访问用户空间,而处于内核态级别的程序可以访问用户空间和内核空间。
  • 当一个进程执行系统调用而陷入内核代码中执行时,我们就称进程处于内核态

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

内核为上层应用使用CPU、存储、IO等硬件资源提供了接口,即系统调用,如果一个应用程序需要用到内核资源,就需执行系统调用的相关语句。
(1)当执行系统调用时,首先会保存现场,然后通过系统调用到内核态执行,最后内核态变为用户态执行用户程序时,需要恢复用户态的现场。
在进入内核的时候需要保存用户态的寄存器,在内核态返回用户态的时候会恢复这些寄存器的内容。

(2)每个线程都有两个栈:用户栈和内核栈,当执行系统调用时,线程就会由用户栈切换到内核栈,而内核代码对用户不信任,需要进行额外的检查。
Linux | 为什么用户态和内核态的切换耗费时间?

哪些情况会出出现用户态和内核态的切换

  • 线程间的切换(上下文):线程上下文切换时,前一个线程的线程线程(切换前最后时刻的数据和指令)会被保存到内核中,而切换回来时需要从内核空间中读取数据恢复现场。
  • Syncronized锁的获取和释放:使用内核中monitor对象

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

  • 当程序在用户态需要申请外部资源(如声卡、网卡、U盘、磁盘)时,需要从用户态切换到内核态,主要有3种情况需要申请外部资源:
    (1)系统调用
    举例: 创建线程时,需要通过pthread函数库调用内核来创建
    (2)中断
    举例: 当外围设备完成用户请求的操作后,会想CPU发送中断信号。这时CPU会暂停执行下一条指令(用户态)转而执行与该中断信号对应的中断处理程序
    (3)异常:某些异常如缺页异常只能由内核进行处理
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/192305.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python中取整数的方法(python中取整符号)

    Python中的round()有两个参数,第一个参数是需要处理的数,第二个参数是数位精度,默认为0。round(3.4)##3round(3.5)##4而有时候会出现奇怪的情况,比如:round(3.24,1)#是四舍五入##3.2round(3.26,1)#是四舍五入##3.3round(3.25,1)#不是四舍五入##3.2######################…

    2022年4月12日
    69
  • VS配置管理器

    VS配置管理器可以在VS的配置管理器中,配置当前活动解决方案采用debug和release模式,还可以设置活动解决方案平台,即win32或x64。还可以配置整个解决方案哪些项目需要生成,哪些不用,在多项目编译时间较长的情况下还是挺有作用的。

    2022年7月20日
    18
  • oracle insert 将一张表数据插入另外表中[通俗易懂]

    oracle insert 将一张表数据插入另外表中[通俗易懂]将一张表的数据插入两外张表以表B的数据插入表A,表B有多少符合条件的数据,表A就插入多少条数据如表B符合条件有10条数据,表A也会添加10条数据case1两张表的结构完全一样insertintotableAselect*fromtableBcase2,两张表的结构不一样,只获取表B中符合条件的一些列的数据insertintot

    2022年7月17日
    14
  • pycharm 激活吗【2021最新】「建议收藏」

    (pycharm 激活吗)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月30日
    36
  • pycharm新建anaconda_anaconda怎么创建虚拟环境

    pycharm新建anaconda_anaconda怎么创建虚拟环境在anaconda中已经有了一个比较全的环境,希望在Pycharm中使用,但百度后发现网上的一些方法已经在新版Pycharm中不一样的,在此记录下:File->Settings->Project:[当前项目名称]单击设置图标,然后选择【Add…】然后就是定位到anaconda中已有环境的python.exe所在目录了假设环境名称是tensorflow,一般路径是:C:\Users\…

    2022年8月27日
    6
  • fast发现_fasttext

    fast发现_fasttextfastai错误提示找不到’fastai.conv_learner’输入pipinstallfastai==0.7.0pipinstalltorchtext==0.2.3

    2025年10月2日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号