内核态与用户态(为什么存在这种机制、程序应处于哪个状态、如何判断当前所处状态、哪些功能需要内核态、如何实现这种机制)

1.首先我们应该思考清楚为什么会有内核态和用户态?(为什么存在这种机制)

因为计算机的资源是有限的, 所以不可能让每个程序都能访问所有资源, 有的程序能访问任何资源, 有的则不能。就如人类社会中的社会地位一样, 越是社会地位高的人, 拥有的资源越多。所以运行于内核态的程序必须要有十分可靠的安全性, 不然随便修改了OS的内核数据结构, 就会造成系统的崩溃。而处于用户态的程序, 最多知识用户程序崩溃, 操作系统还能继续运行。

2.如何判断程序应该处于内核态还是用户态

1.具体来说如果程序能运行在用户态, 就不让其运行于内核态。
2.如果牵扯到的是计算机本体根本运行的事情应该在内核态中执行。而于用户数据, 应用相关的应该方法用户态执行。
3.对于时序性要求非常高的, 也应该放在内核态.比如国家领导人出门做车, 为了保证不塞车, 肯定不是去做公交车。

3.那么哪些功能应该在内核态实现哪些功能在用户态实现

1.CPU管理和内存管理肯定都在内核态.如果放在用户态实现, 就如同一个国家里哪个人都能管理军队, 这是十分危险, 不玩安全的, 所以为了计算机的安全性, 可靠性, 就必须在内核态来实现。所谓的内核态就是拥有特权。
2.诊断和测试程序, 因为诊断和测试程序需要访问计算机所有资源

4.怎么来判断某个进程是处于内核态还是用户态?

1.这显然需要一种标记。而这个标记就是CPU上的一个位, 这个位就可以用来标记当前CPU所处的状态。也就说所谓的程序内核态或者用户态,本质上指的是CPU所处的状态, CPU处于什么状态, 当前程序就是好什么状态。

5.那么我们如何实现内核态和用户这种机制态的呢?

1.我们知道内核态和用户态的区别就是对于资源的访问权限不一样。那么我们如何实现这样的权限?这需要对程序执行的每一条指令进行检查才能完成, 这种检查就是地址翻译。程序发出一条指令都需要经过这个地址翻译过程,从而我们通过控制翻译,就可以限制程序对资源的访问。
2.而内核态对所有资源都有特权, 所以内核程序都是直接绕过内存地址翻译而直接执行特权指令。

操作系统结构(操作系统的结构的发展、微内核)

1.杂乱、无结构:

一开始人们也没有操作系统这个概念, 没有将库函数统称为操作系统。要什么功能就把它加进去, 所以一开始的操作系统是:杂乱的、无结构的。

2.单一操作系统结构:

随着人们的认识, 操作系统慢慢变得有结构, 人们把各种功能归位一个功能块, 彼此相互独立, 能相互调用, 这时候的功能某块是图关系形式的。这样的功能模块关系复杂, 耦合性太高。任意修改一个功能模块, 每个的功能模块都要重新修改。所以人们就先到了人类社会的层级关系。

3.层次化的操作系统结构

人们给操作系统定义了各个的层, 没一层为最临近的高一层提供服务。就如人类社会的结构: 职员--》项目经理--》主管---》公司老大

4.操作系统的结构所带来的问题。

1.首先操作系统的所有功能都在内核态运行。而从用户态转为内核态需要一定的时间成本,这就造成了频发进入内核态会造成操作系统效率低下。
2.其次当操作系统越来越大时, 要保证安全性就越来越难。如1400行的操作系统和40 000 000行的操作系统区别可想而知。

5.微内核

正是基于操作系统接口所带来的问题, 人们又相处一个办法,将操作系统中核心的核心放在内核态, 其它全都移到用户太。这就提高了效率和安全性。如下图,现在各种操作系统都向着这个方向发展。

操作系统基本概念(内核态与用户态、操作系统结构)-by sixleaves的更多相关文章

  1. go语言学习--内核态和用户态(协程)

    go中的一个特点就是引入了相比于线程更加轻量级的协程(用户态的线程),那么什么是用户态和内核态呢? 一.什么是用户态和内核态 当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核 ...

  2. [OS] 内核态和用户态的区别

    http://blog.csdn.net/fatsandwich/article/details/2131707# http://jakielong.iteye.com/blog/771663 当一个 ...

  3. Linux内核态、用户态简介与IntelCPU特权级别--Ring0-3

    一.现代操作系统的权限分离: 现代操作系统一般都至少分为内核态和用户态.一般应用程序通常运行于用户态,而当应用程序调用系统调用时候会执行内核代码,此时会处于内核态.一般的,应用程序是不能随便进入内核态 ...

  4. cpu与寄存器,内核态与用户态及如何切换

    cpu:相当于计算机的大脑负责运算和发送命令: 寄存器:寄存器是cpu当中的一个有限存储部件,cpu从内存调用数据时,寄存器会将从内存调用的数据进行更新在寄存器中以一个字或变量进行存储. 寄存器总共分 ...

  5. linux内核态和用户态小结

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

  6. cpu内核态与用户态

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

  7. linux内核态和用户态的信号量

    在Linux的内核态和用户态都有信号量,使用也不同,简单记录一下. 1> 内核信号量,由内核控制路径使用.内核信号量是struct semaphore类型的对象,它在中定义struct sema ...

  8. 在linux系统中实现各项监控的关键技术(2)--内核态与用户态进程之间的通信netlink

    Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的 socket API 就可以使用 netlink 提供的强大功能,内核态需要使用专门的内核 API 来使用 ...

  9. Linux 内核态与用户态通信 netlink

    参考资料: https://blog.csdn.net/zqixiao_09/article/details/77131283 https://www.cnblogs.com/lopnor/p/615 ...

随机推荐

  1. linux 虚拟机设置IP访问外网

    1 设置网络为桥接模式:(Vmware为例,安装过程中也可以设置) 选中当前的操作系统,点击虚拟机-->设置-->硬件-->网络设备器,勾选桥接模式 2 修改网络配置在命令行界面输入 ...

  2. 关于echo双引号和单引号的问题

    echo ''; 输出的是变量符号和变量名称. echo"";输出的是变量的值. <?php $s="PAP"; echo "my name i ...

  3. UGUI实现摇杆(模仿太极熊猫)

    核心代码: using UnityEngine; using System.Collections; using UnityEngine.UI; public delegate void Joysti ...

  4. 泛泰A880S升级官方4.4.2 binx教程

    之前为了尝鲜,直接官升4.4.2,红砖了.越南兄弟说官方没更新升级工具,所以导致升级到78%就停止了,他给的办法,我试也没成功.官方旧版本号又不能升级S0221118以上的版本号,新版的离线升级工具没 ...

  5. CAS原理与协议

    SSO英文全称Single Sign On,单点登录. SSO是在多个应用系统中,用户仅仅须要登录一次就能够訪问全部相互信任的应用系统. SSO的解决方式非常多,比方收费的有UTrust.惠普灵动等, ...

  6. 多线程程序 怎样查看每个线程的cpu占用

    可以用下面的命令将 cpu 占用率高的线程找出来: ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu 这个命令首先指定参数'H',显示线程相关的 ...

  7. Boost线程库学习笔记

    一.创建一个线程 创建线程 boost::thread myThread(threadFun); 需要注意的是:参数可以是函数对象或者函数指针.并且这个函数无参数,并返回void类型. 当一个thre ...

  8. CLR via C# - CLR模型

    博客园对markdown支持不佳,错乱移步Github IO 博文 CLR 的执行模型 模块/程序集 1.模块 托管模块组成部分 PE32/PE32+头 : PE即Portable Executabl ...

  9. 企业qq代码,工作中用到的

    <div id="xixi" onmouseover="toBig()" style="top: 120px; left: 0; positio ...

  10. [转载]一个小例子介绍Obj-C的函数命名方式

    原文链接:http://www.cnblogs.com/liufan9/archive/2013/04/02/2995626.html 对于以前做C#或者JAVA开发的朋友而言,初次接触iOS开发,O ...