什么是用户态和内核态的区别_内核态和用户态的概念

什么是用户态和内核态的区别_内核态和用户态的概念什么是用户态和内核态从图上我们可以看出来通过系统调用将Linux整个体系分为用户态和内核态(或者说内核空间和用户空间)。那内核态到底是什么呢?其实从本质上说就是我们所说的内核,它是一种特殊的软件程序,特殊在哪儿呢?控制计算机的硬件资源,例如协调CPU资源,分配内存资源,并且提供稳定的环境供应用程序运行。用户态就是提供应用程序运行的空间,为了使应用程序访问到内核管理的资源例如CPU,内存,I/O。内核必须提供一组通用的访问接口,这些接口就叫系统调用。为什么要区分内核态和用户态往往我们的系统的资源是


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

什么是用户态和内核态

在这里插入图片描述
从图上我们可以看出来通过系统调用将Linux整个体系分为用户态和内核态(或者说内核空间和用户空间)。
那内核态到底是什么呢?其实从本质上说就是我们所说的内核,它是一种特殊的软件程序,特殊在哪儿呢?控制计算机的硬件资源,例如协调CPU资源,分配内存资源,并且提供稳定的环境供应用程序运行。

用户态就是提供应用程序运行的空间,为了使应用程序访问到内核管理的资源例如CPU,内存,I/O。内核必须提供一组通用的访问接口,这些接口就叫系统调用。

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

往往我们的系统的资源是固定的,例如内存2G,CPU固定,磁盘2TB,网络接口固定。所以就需要操作系统对资源进行有效的利用。假设某个应用程序过分的访问这些资源,就会导致整个系统的资源被占用,如果不对这种行为进行限制和区分,就会导致资源访问的冲突。所以,Linux的设计的初衷:给不同的操作给与不同的“权限”。Linux操作系统就将权限等级分为了2个等级,分别就是内核态和用户态。

各位有没有发现,前面讲了这么多内核态和用户态什么不同,其实用一句话就能概括:它们权限不同。用户态的进程能够访问的资源受到了极大的控制,而运行在内核态的进程可以“为所欲为”。一个进程可以运行在用户态也可以运行在内核态,那它们之间肯定存在用户态和内核态切换的过程。打一个比方:C库接口malloc申请动态内存,malloc的实现内部最终还是会调用brk()或者mmap()系统调用来分配内存。

如何从用户态进入内核态

  • 系统调用:这是用户态进程主动要求切换到内核态的一种方式。用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作。例如fork()就是执行了一个创建新进程的系统调用。系统调用的机制和新是使用了操作系统为用户特别开放的一个中断来实现,所以系统调用本身就是中断,但是软件中断,跟硬中断不同。
  • 异常:如果当前进程运行在用户态,如果这个时候发生了异常事件,就会触发切换。例如:缺页异常。
  • 外设中断:当外设完成用户的请求时,会向CPU发送中断信号。这时CPU会暂停执行下一条即将要执行的指令而转到与中断信号对应的处理程序去执行,如果前面执行的指令时用户态下的程序,那么转换的过程自然就会是 由用户态到内核态的切换。如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后边的操作等。

这三种方式是系统在运行时由用户态切换到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。从触发方式上看,切换方式都不一样,但从最终实际完成由用户态到内核态的切换操作来看,步骤有事一样的,都相当于执行了一个中断响应的过程。系统调用实际上最终是中断机制实现的,而异常和中断的处理机制基本一致。

转载自:https://zhuanlan.zhihu.com/p/69554144
https://blog.csdn.net/qq_39823627/article/details/78736650

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

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


相关推荐

  • break和continue关键字的区别

    break和continue关键字的区别break和continue关键字的区别break:用于跳出当前所在循环体,去执行循环后面的语句。continue:用于结束本次循环,继续执行下一次循环。注意:break关键字可以用在switch–case的分支结构和循环结构。      continue关键字只能用于循环中。  如果文中有错误,希望能够指出,一同进步!…

    2022年5月7日
  • PHP7还没学明白,PHP8就要来了, 能有多快?[通俗易懂]

    PHP7还没学明白,PHP8就要来了, 能有多快?

    2022年2月14日
  • RPN网络解读

    RPN网络解读RPN网络源码解读在高层的featuremap初次计算anchorbox点数值604099代表一个特征维度生成9个anchorbox,但特征层w,h为啥是60,40不应该是相等的?毕竟backbone网络一系列操作(下采样),w,h同时缩小的。下不管了,不是今天主要问题。step1:也就是说原始生成大约20000boxs,再进行2k排序(每个boxs得分为目标或背景的概率,不管是背景还是目标都要得分高的)设定阈值为12000,也就是说最多保留12000,也有的源码设定2000。step2

    2022年6月23日
  • java常量有哪些_JAVA常量介绍「建议收藏」

    java常量有哪些_JAVA常量介绍「建议收藏」常量:在程序执行过程中,其值不发生改变的量;1、分类:字面值常量和自定义常量;1、字面值常量有以下几种:字符串常量、小数常量、整数常量、字符常量、布尔常量(true、false)、空常量(null);2、整数常量的表现形式:二进制:由0、1组成,以0b开头;八进制:由0,1,….7组成,以0开头;十进制:由0,1,……9组成,整数默认是十进制;十六进制:由0,1,….9,…

    2022年7月7日
  • Lua使用心得(2)

    在lua脚本调用中,如果我们碰到一种不好的脚本,例如:while1dodoend那我们的程序主线程也会被阻塞住。那我们如何防止这种问题呢?下面就给出一个解决的办法。首先为了不阻塞主线程,

    2021年12月25日
  • dev-c++ 总是坏

    dev-c++ 总是坏

    2021年9月27日

发表回复

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

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