操作系统基本概念(内核态与用户态、操作系统结构)-by sixleaves
内核态与用户态(为什么存在这种机制、程序应处于哪个状态、如何判断当前所处状态、哪些功能需要内核态、如何实现这种机制)
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的更多相关文章
- go语言学习--内核态和用户态(协程)
go中的一个特点就是引入了相比于线程更加轻量级的协程(用户态的线程),那么什么是用户态和内核态呢? 一.什么是用户态和内核态 当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核 ...
- [OS] 内核态和用户态的区别
http://blog.csdn.net/fatsandwich/article/details/2131707# http://jakielong.iteye.com/blog/771663 当一个 ...
- Linux内核态、用户态简介与IntelCPU特权级别--Ring0-3
一.现代操作系统的权限分离: 现代操作系统一般都至少分为内核态和用户态.一般应用程序通常运行于用户态,而当应用程序调用系统调用时候会执行内核代码,此时会处于内核态.一般的,应用程序是不能随便进入内核态 ...
- cpu与寄存器,内核态与用户态及如何切换
cpu:相当于计算机的大脑负责运算和发送命令: 寄存器:寄存器是cpu当中的一个有限存储部件,cpu从内存调用数据时,寄存器会将从内存调用的数据进行更新在寄存器中以一个字或变量进行存储. 寄存器总共分 ...
- linux内核态和用户态小结
一 内核态和用户态的区别 当进程执行系统调用而陷入内核代码中执行时,我们就称进程处于内核状态.此时处理器处于特权级最高的(0级)内核代码.当进程处于内核态时,执行的内核代码会使用当前的内核栈.每个进程 ...
- cpu内核态与用户态
1.操作系统需要两种CPU状态 内核态(Kernel Mode):运行操作系统程序,操作硬件 用户态(User Mode):运行用户程序 2.指令划分 特权指令:只能由操作系统使用.用户程序不能使用的 ...
- linux内核态和用户态的信号量
在Linux的内核态和用户态都有信号量,使用也不同,简单记录一下. 1> 内核信号量,由内核控制路径使用.内核信号量是struct semaphore类型的对象,它在中定义struct sema ...
- 在linux系统中实现各项监控的关键技术(2)--内核态与用户态进程之间的通信netlink
Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的 socket API 就可以使用 netlink 提供的强大功能,内核态需要使用专门的内核 API 来使用 ...
- Linux 内核态与用户态通信 netlink
参考资料: https://blog.csdn.net/zqixiao_09/article/details/77131283 https://www.cnblogs.com/lopnor/p/615 ...
随机推荐
- dp优化
入口 A(fzu 1894) 普通的单调队列,trick是进队判断的符号选取(>=wa , >ac). B(poj 2823) 没什么好说的 ,坑爹poj g++,tle ;c++,ac. ...
- Nx32926 命令关机
一. poweroff关机命令 ~ # poweroff ~ # baud=, quot= w-config: 8bits/char umount: devtmpfs busy - remounted ...
- 初学github
在公司一直用的SVN做版本管理,倒也没什么问题.最近想自己在家写点东西,上班的时候又想偷偷地写.代码经常在两个地方同步,很是辛苦.反正写的只是一些用来学习测试的代码,干脆放到github上. 1.登录 ...
- LinQ to SQL 查询
LINQ to SQL 是将对象关系映射到.NET框架中的一种实现.它可以将关系数据库映射为.NET Framework中的一些类. 然后,开发人员就可以通过使用 LINQ to SQL对数据库中的数 ...
- 创建UILabel
UILabelCreate.h #import <UIKit/UIKit.h> @interface UILabelCreate : UILabel /** * 创建UILabel 初始化 ...
- Ubuntu包管理命令 dpkg、apt和aptitude
起初GNU/Linux系统中仅仅有.tar.gz.用户 必须自己编译他们想使用的每个程序.在Debian出现之後,人们觉得有必要在系统 中加入一种机 制用来管理 安装在计算机上的软件包.人们将这套系统 ...
- 从零开始学C++之STL(七):剩下5种算法代码分析与使用示例(remove 、rotate 、sort、lower_bound、accumulate)
一.移除性算法 (remove) C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ...
- Android学习笔记--JNI的使用方法
1.JNI是什么 JNI是Java Native Interface的缩写,它提供若干的API实现Java与其他语言之间的通信.而Android Framework由基于Java语言的的Java层与基 ...
- ToString()和Convert.ToString()的区别
ToString()和Convert.ToString()的区别 一般情况下,这两种方法都可以通用,但是当返回的数据类型中有可能出现null值时如果调用ToString方法了,就会返回NullRefe ...
- JavaScript-------寄生组合式继承
组合继承在前面有说过,也是JavaScript中最常用的一个继承模式:不过,它也有自己的不足.组合继承最大的问题就是无论什么情况,都会调用两次构造函数: 那我们来回顾下组合式继承基本模式: funct ...