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

用户态和内核态的简单理解「建议收藏」文章目录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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • webstorm2021 激活码【最新永久激活】

    (webstorm2021 激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月29日
    316
  • 图像处理5:Sobel边缘检测算子(C++)[通俗易懂]

    图像处理5:Sobel边缘检测算子(C++)[通俗易懂]voidCMFCworkDlg::OnBnClickedButton7(){ //TODO:在此添加控件通知处理程序代码 //Sobel算子边缘检测 Matimage=imread(“ema.jpg”,1); Matimage_gray=gray_img(image); Matgradx,grady; gradx.create(image.size(),CV_8UC1); grady.create(image.size(),CV_8UC1); for..

    2022年7月15日
    12
  • Activity 跳转的生命周期变化

    Activity 跳转的生命周期变化####(1)Activity1跳转到Activity2的生命周期流程1.Activity1启动:Activity1:onCreate()Activity1:onStart()Activity1:onResume()2.点击按钮跳转到Activity2:Activity1:onPause()Activity2:…

    2022年5月21日
    48
  • python 列表函数

    python 列表函数list函数:功能:将字符创转化为列表,例:列表基本函数:1.元素赋值,例:注意:通过list[0]='hel',如果原来位置上有值,会覆盖掉原来的。2.分片操作1)显示

    2022年7月6日
    17
  • 错误:备份集中的数据库备份与现有XXX数据库不同

    错误:备份集中的数据库备份与现有XXX数据库不同当在使用另外一台的数据库备份文件.bak恢复到本机数据库时,遇到“备份集中的数据库备份与现有XXX数据库不同”的错误时,只需要以下几步:删除与要恢复数据库同名的已经存在的数据库; 右击“数据库”选择“还原数据库”;选择源设备;然后再在弹出窗口的“目标数据库”中选择要还原数据库名;这时要备份的数据库的名字会弹出来,所以不需要提前创建现在手中有SqlServer2…

    2022年6月12日
    32
  • Win10下loadrunner11激活成功教程安装与运行

    Win10下loadrunner11激活成功教程安装与运行一.安装1.      下载loadrunner11进行安装。打开安装安装程序进入如图界面(可能会出现提示,不受信任。出现这个情况尝试用此方法解决下“win+r”打开运行,输入gpedit.msc进入组策略,依次选择“计算机配置”、“windows设置”、“安全设置”、“本地策略”、“安全选项”,在右侧下拉选择“用户账户控制:以管理员批准模式运行所有管理员”,双击它,选择“已禁用”,重启即可关闭…

    2022年7月22日
    89

发表回复

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

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