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

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. UVa 147 Dollars(硬币转换)

    题目大意:给出五种硬币,价值分别为 1,5,10,25,50,.当给出一个价值时,求出能够组合的种数(每种硬币可以用无限次). 思路:完全背包, dp[i][j]表示总数 i 能够被表示的种数.状态转 ...

  2. Linux各种包安装及命令

    1.Locate yum -y install mlocate 若出现问题: locate: can not stat () `/var/lib/mlocate/mlocate.db': 没有那个文件 ...

  3. QT文件夹定位(网友提供)

    #ifndef FOLDERFINDER_H #define FOLDERFINDER_H#include <QDir>class FolderFinder{public:    QStr ...

  4. A10 平板开发一硬件平台搭建

    A10板子从原理图设计.接插件布局.PCB设计到物料采购以及贴片,最后调试,花了不少时间,刚刚把屏点亮了,系统总算跑起来了.整个过程遇到不少问题,包括与外面工程师沟通.硬件测试.软件调试,还有很多问题 ...

  5. java实现点名,并记录被点次数

    java实现点名,并记录被点次数 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStrea ...

  6. Android-------设置TextView同时显示图片和文本,并控制图片大小

    //获取资源图片     Drawable leftDrawable = getResources().getDrawable(R.drawable.comment_parise);     //设置 ...

  7. 本地计算机上的OracleOraDb11g_home2TNSListener服务启动又停止了。

    电脑上装了oracle后启动很慢,然后我就不oracle服务设置成手动启动,没想到今天启动的时候居然报错 折腾了一上午,终于搞定, 在环境变量中把ORACLE_HOME 设置成D:\app\XL\pr ...

  8. ConcurrentQueue对列的基本使用方式

    队列(Queue)代表了一个先进先出的对象集合.当您需要对各项进行先进先出的访问时,则使用队列.当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队. ConcurrentQueue< ...

  9. C#代码启用事务锁Transaction进行一系列提交回滚操作

    一.前言 因为很多人一般进行一系列相关数据库操作都是在存储过程里面,而且在存储过程用锁的写法也是很简单的,在这篇文章主要介绍一下C#后台代码用锁进行一系列事务操作,我建立一个简单的winform程序, ...

  10. String 字符串相等比较