内核态的出现,让计算机系统的权力向操作系统高度集中了。

操作系统分出内核态和用户态,就是为了进行不同等级的权限管理, 从而更好的适应多用户多任务并发的工作环境。

用户态和内核态的来源

在早期的单进程单用户操作系统中,是不存在两种用户态的。

随着进程和用户的出现,当时的计算机面临着一个重要问题,就是如何限制不同进程的操作的权限。(因为操作系统无法预测未来会出现什么样的进程)

把计算机内部想象成一个有条不紊的工厂,那必须在管理者和被管理者之间制定好规则,每个职位的权限都一定要确定好。

所以当时的工程师,就准备让一些危险的操作只允许操作系统的进程去做。如果其他用户进程想做这个操作,必须询先询问操作系统的意见。然后由操作系统去做,做完再把数据传给询问的用户进程。(比如I/O操作)

随着内核态的出现,操作系统进程/线程也正式凌驾于用户线程之上

权限本质就是可以做的事情不同。

CPU的内核态、用户态出现

如果只是操作系统对进程/线程的不同权限限制,还称不上“态”。但是随着操作系统权限限制功能的普及,CPU厂商也与时俱进,开始在硬件层进行权限限制。

操作系统厂商:CPU厂,现在我们都需要权限限制功能,能不能在硬件层做一个设计。软件层做不够安全,速度切换也较慢。

CPU厂商:好的,我在程序状态寄存器设计两位标志位,提供至少四个状态。你操作系统修改这个寄存器的状态位,我CPU就知道此时是什么权限等级了。

现代操作系统一般只使用最高ring 0和最低ring3,它们分别被成为内核态和用户态。

CPU会根据状态位的不同,限制可以执行的指令集,从而从硬件层做出限制。

操作系统通过修改CPU上寄存器的值,来做到切换权限,这种过程就是内核态和用户态的切换。
可见内核态、用户态是针对整个计算机系统来讲,而不是针对某个线程。

问1:我们如何定义高权限?

如果一个线程可以访问并修改计算机系统内的所有内存和寄存器。那么我们就认为这个线程具有最高的权限。

这种最高权限的线程,一般只属于操作系统。

问2:是所有的操作系统都分两种状态吗?

不是,早期的操作系统都不分两种状态,比如MS-DOS。分两种状态,是因为操作系统不得不面对 多用户权限多任务并发的 需要,而创建的。

问3:用户线程和内核线程跟内核态,用户态的关系

没什么关系。线程的切换必须是操作系统的高权限线程去决定(采用中断手段),不可能让普通线程自己去做。所以只要是线程的切换一定是在内核态进行的。

用户线程因为根本不是真正的线程,所以它在用户态的切换,本质只是一种伪切换。

用户线程、内核线程是真伪线程的关系。
内核态、用户态是权限高低的关系。

不建议说“一个线程此时在内核态”,因为内核态是对操作系统某时刻权限的描述。换成“操作系统此时处于内核态执行某个线程”更好。

例1:当某个线程向操作系统申请I/O操作的过程

  1. A线程因为权限不够,向操作系统申请I/O操作
  2. 操作系统同意,中断A线程
  3. 操作系统修改CPU寄存器状态,使计算机进入内核态
  4. 操作系统调用自身的高权限线程,执行I/O操作。(注意不是调用A线程去做)
  5. 修改CPU寄存器状态,使计算机进入用户态
  6. 数据送给A线程
  7. 调用A线程。
内核态的出现源于多权限功能的设计,随着CPU厂商的硬件层面完善,正式形成。
内核态不仅限制了权限,而且操作系统一般情况下只允许自身的线程在内核态下工作。
计算机的权限进一步集中到操作系统之中,这促进了计算机体系结构的形成。

欢迎访问:个人博客-zobolの计算机操作系统学习札记

2.2.1 用户态、内核态的形成 -《zobolの操作系统学习札记》的更多相关文章

  1. 42.Linux应用调试-初步制作系统调用(用户态->内核态)

    1首先来讲讲应用程序如何实现系统调用(用户态->内核态)? 我们以应用程序的write()函数为例: 1)首先用户态的write()函数会进入glibc库,里面会将write()转换为swi(S ...

  2. linux 用户态 内核态

    http://blog.chinaunix.net/uid-1829236-id-3182279.html 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在 ...

  3. 进程:linux用户态-内核态

    用户态:Ring3运行于用户态的代码则要受到处理器的诸多检查,它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址,且只能对任务状态段(TSS)中I/O许可位图(I/O Permi ...

  4. GCC 用户态&内核态 Makefile

    转了一圈,今天再次回到C 网上一篇博文,个人感觉良心作品,故而拿来重新实现一遍,原作者原文有问题,我这里把他打通了 一.GCC Makefile //hello.c #include <stdi ...

  5. 用户态和内核态&操作系统

    用户态和内核态 内核态:cpu可以访问内存的所有数据,包括外围设备,例如硬盘,网卡,cpu也可以将自己从一个程序切换到另一个程序. 用户态:只能受限的访问内存,且不允许访问外围设备,占用cpu的能力被 ...

  6. cpu内核态与用户态

    1.操作系统需要两种CPU状态 内核态(Kernel Mode):运行操作系统程序,操作硬件 用户态(User Mode):运行用户程序 2.指令划分 特权指令:只能由操作系统使用.用户程序不能使用的 ...

  7. 《Linux内核分析》课程第二周学习总结

    姓名:何伟钦 学号:20135223 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...

  8. ucore操作系统学习(四) ucore lab4内核线程管理

    1. ucore lab4介绍 什么是进程? 现代操作系统为了满足人们对于多道编程的需求,希望在计算机系统上能并发的同时运行多个程序,且彼此间互相不干扰.当一个程序受制于等待I/O完成等事件时,可以让 ...

  9. Linux用户态和内核态

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

随机推荐

  1. 招商银行 KubeVela 离线部署实践

    招商银行云平台开发团队自 2021 年开始接触 KubeVela,并探索 KubeVela 在招商银行云平台的落地实践,借此提升云原生应用交付与管理能力.同时因为金融保险行业的特殊性,网络安全管控措施 ...

  2. 面试官:说一说Zookeeper中Leader选举机制

    哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 今天又是一个阳光明媚的一天,我又 ...

  3. vue3 监听路由($route)变化

      setup() {      // ...   },   watch: {     $route(m, n) {       console.log('mm', m)       console. ...

  4. Caused by: com.sonatype.nexus.staging.client.StagingRuleFailuresException: Staging rules failure! 已解决!

    问题分析 由于项目中修改了一些代码,然后没有修改版本号,直接deploy代码到仓库,最终导致错误! 根据 https://central.sonatype.org/faq/can-i-change-a ...

  5. 【Java分享客栈】一文搞定CompletableFuture并行处理,成倍缩短查询时间。

    前言   工作中你可能会遇到很多这样的场景,一个接口,要从其他几个service调用查询方法,分别获取到需要的值之后再封装数据返回.   还可能在微服务中遇到类似的情况,某个服务的接口,要使用好几次f ...

  6. [AcWing 35] 反转链表

    迭代版本 点击查看代码 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next ...

  7. mybaits映射器方法多参数传递

    1.参数传递的表达式 1.#{参数名}: 这种方法可以解决sql注入,把参数变成 ?(推荐用这种方式) 2.${参数名}:这种方法不能防止sql注入 2.只有一个参数 方法:public Countr ...

  8. drf-Serializers

    What is serializers? serializers主要作用是将原生的Python数据类型(如 model querysets )转换为web中通用的JSON,XML或其他内容类型. DR ...

  9. 斯坦福NLP课程 | 第11讲 - NLP中的卷积神经网络

    作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www. ...

  10. [ Module ] 环境变量管理工具 Module 安装和使用

    https://www.cnblogs.com/yeungchie/ 1. 工具下载 手动下载 modules-5.1.0 点击下载 wget 下载 wget https://jaist.dl.sou ...