文档章节

操作系统的抽象与虚拟化

廖君
 廖君
发布于 2015/08/11 22:37
字数 889
阅读 255
收藏 8

为什么需要操作系统?

说抽象之前得先知道CPU以及键盘、鼠标是之间是工作的。CPU最终状态只能进行加减,当我们输入一个简单的字符“A”的时候键盘与CPU都是把字母“A”转化为能够识别的二进制01才能识别。而这一些对于使用者来说都是透明的,让使用者认为当输入一个字母“A”时就是对字母“A”的一个“投影”显示。但实现这个的一切转化都已经由操作系统帮助我们完成,如果没有操作系统,对于一个字母A的输入,可能就是输入01000001这样的二进制代码。操作系统把设备(CPU,键盘,鼠标等)抽象后以方便我们的操作。

操作系统究竟把设备抽象成什么?

那么操作系统究竟把这些设备抽象成什么,是如何开发者方便开发者的调用?在操作系统中Everything is FileCPU,鼠标等这些都被操作系统抽象(虚拟化?)成为了文件,这样开发者可以通过对这些文件操作来操作设备。下面两幅图前者是Linux(Ubuntu)对于CPU和鼠标抽象之后的结果,后者是Windows7对于硬盘的抽象(虚拟化?)后的截图:

(Linux)

Windows7

开发者在使用这些设备的时候内部发生了什么?

前面提到的OS把一切抽象成为了文件的形式以供开发者(包括用户)来使用,那么在写一个C语言简单的scanf的时候,内部究竟干了什么?如下图:

 

上图一个程序与设备通信的工程,可以想象我们正在执行一个包含scanf的程序,我们需要通过程序输入一个值得是在内部是程序通过系统调用接口(syscall.h man 2 syscall)去操作设备驱动,然后设备驱动选择使用那个设备节点,最后节点与实际的设备相关联。

对于上图的进一步分析:

对于在Linux操作系统中执行ls命令查看当前文件夹内容的抽象:

抽象=虚拟化?

虚拟化和抽象我认为不能混为一谈,抽象是把物理设备编程实实在在的文件形式,但是虚拟化对于一个虚拟化系统是一个并不存在的东西,虽然虚拟化系统会认为自己本身是运行在物理设备之上但这一切都是运行在一个虚拟设备监视器(VMM)的容器之内。如图:

 

因为每个进程都拥有自己的内存空间,进程间通过pipe进行通信,而虚拟机监视器可以让虚拟机共享一个物理内存空间。换句话说就是:虚拟机监视器对于虚拟机是多对多的关系而对于物理设别的抽象内存是一对一的关系。如果是省略中间的监视器,实际上就是虚拟机共享物理内存的一个进程的内存空间(实际是不可能省略中间的监视器,这里只是类比)。监视器模拟虚拟CPU,虚拟CPU的计算通过监视器传递给真实的CPU计算。(下图为VMM模拟)

© 著作权归作者所有

廖君
粉丝 12
博文 71
码字总数 35592
作品 0
深圳
私信 提问
加载中

评论(1)

梅林先森
梅林先森
一切皆文件,一切皆资源。
虚拟化的概念

题注:最近在学习虚拟化技术,这是自己的一些笔记。 虚拟化的概念 虚 拟化技术的产生是计算机技术发展道路上的一个趋势和必然现象,在计算机发展道路上起到了重要的作用,虚拟化的技术早在2...

文艺小青年
2017/03/09
0
0
针对Linux的I/O虚拟化框架--Virtio

是半虚拟化 hypervisor 中位于设备之上的抽象层。 由 Rusty Russell 开发,他当时的目的是支持自己的虚拟化解决方案 。 是对半虚拟化 hypervisor 中的一组通用模拟设备的抽象。该设置还允许 ...

匿名
2010/03/06
4.9K
0
从虚拟化到软件定义--重新定义IT产业格局

一、从操作系统对硬件的虚拟化到容器对应用程序的虚拟化 虚拟化将经典的三层架构(硬件、操作系统、应用程序)都虚拟化了一遍。 1、操作系统对硬件的虚拟化 在没有虚拟化之前,或者说在虚拟化...

tasnrh
2017/03/21
0
0
针对Linux的I/O虚拟化框架VirtIO

概而言之,virtio 是半虚拟化 hypervisor 中位于设备之上的抽象层。virtio 由 Rusty Russell 开发,他当时的目的是支持自己的虚拟化解决方案 lguest。本文在开篇时介绍半虚拟化和模拟设备,然...

架构师技术联盟
01/29
0
0
读书笔记1---为什么使用Docker

Docker在开发与运维中优势 a) 更快速的交付和部署—使用Docker,开发人员可以使用镜像来构建一套标准的开发环境,测试和运维则可以直接使用。Docker可以快速创建和删除容器,实现快速迭代,大...

makeths
2017/11/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
51分钟前
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
4
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
5
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部