文章目录

  • 用户态和内核态之间关系?
    • 指令划分
    • 特权级别
  • 那么为什么要有用户态和内核态呢?
  • CPU状态之间的转换

用户态和内核态之间关系?

  • 用户态和内核态是操作系统中CPU的两种运行状态。

  • 内核态:处于内核态的 CPU 可以访问任意的数据,包括外围设备,比如网卡、硬盘等,处于内核态的 CPU 可以从一个程序切换到另外一个程序,并且占用 CPU 不会发生抢占情况,一般处于特权级 0 的状态我们称之为内核态。

  • 用户态:处于用户态的 CPU 只能受限的访问内存,并且不允许访问外围设备,用户态下的 CPU 不允许独占,也就是说 CPU 能够被其他程序获取。 当程序运行在3级特权级上时,可以称之为运行在用户态

  • 处于用户态执行时,进程所能访问的内存空间和对象受到限制,其所处于占有的处理器是可被抢占的处于内核态执行时,则能访问所有的内存空间和对象,且所占有的处理器是不允许被抢占的。

指令划分

  • 特权指令:只能由操作系统使用、用户程序不能使用的指令。 举例:启动I/O 内存清零 修改程序状态字 设置时钟 允许/禁止终端 停机

  • 非特权指令:用户程序可以使用的指令。 举例:控制转移 算数运算 取数指令 访管指令(使用户程序从用户态陷入内核态)

特权级别

  • 特权环:R0、R1、R2和R3

  • R0相当于内核态,R3相当于用户态;

  • 不同级别能够运行不同的指令集合;

那么为什么要有用户态和内核态呢?

  • 这个主要是访问能力的限制的考量,计算机中有一些比较危险的操作,比如设置时钟、内存清理,这些都需要在内核态下完成,如果随意进行危险操作,极容易导致系统崩坏。

  • 操作系统的核心是内核(kernel),它独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。有些 CPU 的指令是非常危险的,一旦用错可能导致系统崩溃。如果所有的程序都可以任意使用这些指令,那么系统崩溃的概率将大大增加。为了保证内核的安全,操作系统一般都禁止用户进程直接操作内核。具体的实现方式是将虚拟内存空间划分为两部分,一部分为内核空间,另一部分为用户空间。当进程运行在内核空间时就处于内核态,进程运行在用户空间时则处于用户态。

  • 无论是进程还是线程,它们的上下文切换和"内核态、用户态"没有直接的关系。比如只要需要系统调用,即使不做任何切换,都需要进入内核态。举个例子:一个线程调用函数在屏幕上打印 hello world,就已经进入了内核态了,因为打印字符的功能是由内核程序提供的。总的来说,应用程序通常运行在用户态,遇到下列三种情况会切换到内核态:

    • 系统调用:创建和调度线程、加锁解锁等等。
    • 异常事件:发生不可知的异常时切换到内核态,以执行相关的异常事件。
    • 设备中断:如果外围设备完成了用户请求,比如硬盘读写操作,就会给 CPU 发送中断信号。CPU 会转去处理中断事件,切换到内核态。

CPU状态之间的转换

  • 用户态—>内核态:唯一途径是通过系统调用、设备中断、异常事件、陷入机制(访管指令)

  • 内核态—>用户态:设置程序状态字PSW

例如利用线程函数需要系统调用

  • 线程的代码在用户态运行,而调度是在内核态运行的。操作系统切换线程上下文的步骤如下所示:

    • 1)保留用户态现场(上下文、寄存器、用户栈等)
    • 2)复制用户态参数,用户栈切到内核栈,进入内核态
    • 3)代码安全检查(内核不信任用户态代码)
    • 4)执行内核态代码
    • 5)复制内核态代码执行结果,回到用户态
    • 6)恢复用户态现场(上下文、寄存器、用户栈等)

进程的用户态和内核态相关推荐

  1. Linux系统编程33:进程信号之详解信号的捕捉过程,用户态和内核态及其切换,sigaction和signal

    文章目录 (1)用户态和内核态 (2)用户态和内核态的切换 (3)内核是如何实现信号的捕捉 (4)sigaction (1)用户态和内核态 我们说过,每个Linux进程有4GB的地址空间 其中0-3G ...

  2. 进程用户态和内核态及其切换过程

    1.进程的堆栈 内核在创建进程的时候,会为进程创建相应的堆栈.每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间.当进程在用户空间运行时,CPU堆栈指针寄存器里面的内容是用户堆 ...

  3. 进程用户态和内核态及其切换过程(转)

    1.进程的堆栈 内核在创建进程的时候,会为进程创建相应的堆栈.每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间.当进程在用户空间运行时,CPU堆栈指针寄存器里面的内容是用户堆 ...

  4. java运行在用户态_理解Linux用户态和内核态

    Linux整体架构图 我们先来看一张Linux整体架构图. 系统调用 ​ 系统调用时操作系统的最小功能单位.根据不同的应用场景,不同的Linux发行版本提供的系统调用数量也不尽相同,大致在240-35 ...

  5. 4-15 OS(线程,用户态,内核态,页) 数据库(原子性,日志) JAVA(I/O)

    在internet services课上老师说到Capriccio 是用户模式下的thread library,OS课里第2个project也是实现一个用户模式下的线程库.之前用过POSIX库,我知道 ...

  6. Linux用户态和内核态

    究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: 1)例 ...

  7. linux 用户态与内核态通信方式简介

    我们平常在写代码时,一般是在用户空间,通过系统调用函数来访问内核空间,这是最常用的一种用户态和内核态通信的方式.(关于 Linux 用户态和内核态可以参考 xx) 除此之外,还有以下四种方式: pro ...

  8. 多线程之:用户态和内核态的区别

    一:大话版用户态和内核态 (1)用户态和内核态的概念? --->内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序 ---& ...

  9. 操作系统(概述、组成)、用户态、内核态

    1. 概述 1.1 基本特征 1.1.1 并发 并发是指宏观上在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令. 并行需要硬件支持,如多流水线或者多处理器. 操作系统通过引入进程和线程 ...

最新文章

  1. MongoDB readConcern 原理解析
  2. 编写程序python输入任意大的自然数、输出各位数字之和_兰理工Python第一次上机作业源码...
  3. 找不到QtDir变量的解决办法, 同时不需要经过编译就可以使用qt 库
  4. select count(*)底层究竟干了啥么?
  5. mysql中关于关联索引的问题——对a,b,c三个字段建立联合索引,那么查询时使用其中的2个作为查询条件,是否还会走索引?...
  6. 递归算法详解及测试效率
  7. 金融数据分析余挖掘实战1.9-1.10补充
  8. 译稿:软件工程师不可不知的10个概念
  9. C++实现建立和一二进制树的三个递归遍历
  10. Excel 表格排版--会议记录表
  11. SuperMap 三维模型数据制作
  12. 微信测试点(八大点)
  13. PowerShell入门简介
  14. Python爬取多网页表格数据(非table)
  15. 20201203 aaaaabbbbbccccc
  16. 使用Git将代码上传到Gitee仓库
  17. STM32单片机开发实例 基于STM32单片机的智能血压计
  18. 西电杨宗凯调研计算机学院,西安电子科技大学校长杨宗凯到网络与继续教育学院调研指导工作...
  19. java for 获取索引_获取Java列表中的对象索引
  20. 计算机专业毕业设计论文答辩PPT模板,10套计算机毕业设计答辩PPT模板

热门文章

  1. 高考生隔空喊话雷军“优化 MIUI”
  2. 大数据在建筑行业落地开花
  3. 认识计算机前端和后端
  4. 端口被占用, 多个端口状态为TIME_WAIT
  5. GAOKU-WMS智能仓储管理系统
  6. uniapp plus.downloader.createDownload 无反应问题
  7. 【UE4从零开始 019】蓝图宏库
  8. 输入输出系统:M/M/1排队系统例题
  9. 关于云计算的个人理解
  10. 搭建呼叫中心系统几点注意事项