进程的用户态和内核态的概念理解以及切换方法_用户进程从用户态切换到内核态

进程的用户态和内核态的概念理解以及切换方法_用户进程从用户态切换到内核态原文链接:https://www.cnblogs.com/viviwind/archive/2012/09/22/2698450.html内核态:当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。用户态:每个进程都有自己的内核栈。当进程在执行用…

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

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

原文链接:https://www.cnblogs.com/viviwind/archive/2012/09/22/2698450.html

内核态:

当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。

用户态:

每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态。即此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似。 

用户态和内核态的区别:

用户态下和内核态下工作的程序有很多差别,但最重要的差别就在于特权级的不同,即权力的不同。运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。

特权级:

举个例子,fork()函数,对于任何操作系统来说,创建一个新的进程都是属于核心功能,因为它要做很多底层细致地工作,消耗系统的物理资源,比如分配物理内存,从父进程拷贝相关信息,拷贝设置页目录页表等等,这些显然不能随便让哪个程序就能去做,于是就自然引出特权级别的概念,显然,最关键性的权力必须由高特权级的程序来执行,这样才可以做到集中管理,减少有限资源的访问和使用冲突。

 

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

1. 系统调用

这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如前例中fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。

2.异常

当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。

3.外围设备的中断

当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。

 

具体的切换操作

从触发方式上看,可以认为存在前述3种不同的类型,但是从最终实际完成由用户态到内核态的切换操作上来说,涉及的关键步骤是完全一致的,没有任何区别,都相当于执行了一个中断响应的过程,因为系统调用实际上最终是中断机制实现的,而异常和中断的处理机制基本上也是一致的,关于它们的具体区别这里不再赘述。关于中断处理机制的细节和步骤这里也不做过多分析,涉及到由用户态切换到内核态的步骤主要包括:

1.从当前进程的描述符中提取其内核栈的ss0及esp0信息。

2.使用ss0和esp0指向的内核栈将当前进程的cs,eip,eflags,ss,esp信息保存起来,这个过程也完成了由用户栈到内核栈的切换过程,同时保存了z暂停执行的程序的下一条指令。

3.将先前由中断向量检索得到的中断处理程序的cs,eip信息装入相应的寄存器,开始执行中断处理程序,这时就转到了内核态的程序执行了。

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/193168.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • wing是什么_124个叶结点的完全二叉树

    wing是什么_124个叶结点的完全二叉树设一个 n 个节点的二叉树 tree 的中序遍历为(1,2,3,…,n),其中数字 1,2,3,…,n 为节点编号。每个节点都有一个分数(均为正整数),记第 i 个节点的分数为 di,tree 及它的每个子树都有一个加分,任一棵子树 subtree(也包含 tree 本身)的加分计算方法如下:subtree的左子树的加分 × subtree的右子树的加分 + subtree的根的分数若某个子树为空,规定其加分为 1。叶子的加分就是叶节点本身的分数,不考虑它的空子树。试求一棵符合中序遍历为(1,2,

  • SHFileOperation 文件夹COPY「建议收藏」

    SHFileOperation 文件夹COPY「建议收藏」/********************************************************函数名:CopyFolder函数功能:文件夹复制输入参数:lpszFromPath,lpszFromPath返回值:True说明:源目录必须以’\0\0′(即连续的两个’\0′)结束,不能以’\’结束*******************************

  • 缓存穿透、缓存击穿、缓存雪崩区别和解决方案[通俗易懂]

    一、缓存处理流程   前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果。     二、缓存穿透    描述:    缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导…

  • JavaScript-匿名函数[通俗易懂]

    JavaScript-匿名函数[通俗易懂]什么是匿名函数1、匿名函数,即没有名称的函数2、如果单独只写一个匿名函数,此时是不符合语法要求的会报错。需要给匿名函数包裹一个括号,使之成为表达式。3、被小括号包裹的内容会被js识别为一个函数表达式如何执行和使用匿名函数?需要执行匿名函数后面追加括号即可也就是立即执行函数方式一:小括号只将匿名函数包裹起来后面跟随执行的小括号(常用)(function(){alert(‘匿名函数执行方式一’)})();小括号将匿名函数以及执行匿名函数的小括号都包裹起来

  • DeepLearning之LSTM模型输入参数:time_step, input_size, batch_size的理解[通俗易懂]

    DeepLearning之LSTM模型输入参数:time_step, input_size, batch_size的理解[通俗易懂]1.LSTM模型输入参数理解(LongShort-TermMemory)lstm是RNN模型的一种变种模式,增加了输入门,遗忘门,输出门。LSTM也是在时间序列预测中的常用模型。小白我也是从这个模型入门来开始机器学习的坑。LSTM的基本概念与各个门的解释已经有博文写的非常详细:推荐博文:【译】理解LSTM(通俗易懂版)这篇文章写的非常详细,生动,概念解释的非常清楚。我也是从这个…

  • Pytest(1)安装与入门[通俗易懂]

    Pytest(1)安装与入门[通俗易懂]pytest介绍pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高。根据pytest的官方网站介绍,它

发表回复

您的电子邮箱地址不会被公开。

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