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

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. juicer模板引擎使用

    http://www.juicer.name/ <script src="~/Scripts/jquery-1.8.2.min.js"></script> ...

  2. C++字符串指针与字符数组的区别

    今天发现这样一个问题 #include <iostream> using namespace std; int main() { ]; strcpy_s(ch1,");//编译通 ...

  3. jsp验证码 (通过单击验证码或超链接换验证码)

    #code.jsp <%@ page language="java" import="java.util.*" import="java.awt ...

  4. mount命令汇总(转载)

    (一)挂接命令(mount) 首先,介绍一下挂接(mount)命令的使用方法,mount命令参数非常多,这里主要讲一下今天我们要用到的. 命令格式: mount [-t vfstype] [-o op ...

  5. 表单javascript checkbox全选 反选 全不选

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  6. 新手使用ThinkPHP3.2.3的命名空间问题

    ThinkPHP3.2.3的命名空间问题 命名空间的出现是为了避免命名冲突. 我们在TP3.2.3的Collection和Model的创建过程中经常会遇到这样的两行代码: 这是在控制器中的写法.其中n ...

  7. git 远程分支创建与推送

    git 远程分支创建与推送   原文地址:http://hi.baidu.com/lingzhixu/blog/item/4a9b830bb08a329fe850cd5b.html 本地分支的创建 本 ...

  8. ArrayList的分析(转)

    一. ArrayList概述: ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境 ...

  9. 常用LINUX脚本汇总(1)

    1.查看磁盘使用空间 df -hl 2.查看文件或者文件夹大小 du -sh 文件(夹)名  查看文件大小  AIX系统为du -sg 3.查看当前用户下定时任务列表crontab -l 4.修改定时 ...

  10. CSS属性值定义语法中的符号说名

    我们通常看到一个CSS语法,总是有很多符号在其中,这些符号是什么鬼呢,且看下面道来 这些符号可以大致分为2类:分组类与数量类. 1.分组类,就是分成一堆一堆啦: 符号 名称 描述 示例   并置 各部 ...