第一章和第二章

第一章 虚拟化和云计算

Saas(软件即服务):将已经部署好的软件作为一种服务来提供,比如:Google Docs, Google Apps 
Paas(平台即服务):将开发环境作为一种服务来提供。 
Iaas(基础设施即服务):将多台服务器组成的“云端”基础设施作为计量服务提供给客户。

软件虚拟化:

利用纯软件的方法在现有的物理平台上(往往并不支持硬件虚拟化)实现对物理平台访问的截获和模拟。 
常见的软件虚拟机如QEMU,它是通过纯软件来仿真x86平台处理器的取指、解码和执行,客户机的指令并不在物理 平台上直接执行。 
由于所有指令都是软件模拟的,因此性能往往比较差,但是可以在同一平台上模拟不同架构平台的虚拟机。

VMware的软件虚拟化使用了动态二进制翻译技术。虚拟机监控机(VMM)在可控制的范围内,允许客户机的指令在物理平台上直接运行。但是,客户机指令在运行前会被虚拟机监控机扫描,其中突破虚拟机监控机限制的指令会被动态替换为可以在物理平台上直接运行的安全指令,或者替换为对虚拟机监控机的软件调用。优点是比纯软件模拟性能有大幅提升,缺点是失去了跨平台虚拟化的能力。

硬件虚拟化:

物理平台本身提供对特殊指令的截获和重定向的支持;甚至新的硬件会提供额外的资源来帮助软件实现对关键硬件资源的虚拟化,从而提升性能。

以x86平台的虚拟化为例,支持虚拟技术的x86 CPU 带有特别优化过的指令集来控制虚拟过程,通过这些指令集,VMM很容易将客户机置于一种受限制的模式下运行,一旦客户机试图访问物理资源,硬件会暂停客户机的运行,将控制权交回给VMM处理。VMM可以将客户机在受限模式下对一些特殊资源的访问完全由硬件重定向到VMM指定的虚拟资源。整个过程不需要暂停客户机的运行和VMM软件的参与。

由于虚拟化硬件可提供全新的架构,支持操作系统直接在其上运行,无需进行二进制转码,减少了相关的性能开销,极大简化了VMM的设计,进而使得VMM能够按照通用标准进行编写,性能更加强大。

准虚拟化:

改动客户机操作系统,使它以为自己运行在虚拟环境下,能够同虚拟机监控机协同工作。所以,准虚拟化需要修改客户机的操作系统的源代码来实现主动通知。

Xen是准虚拟化的一个例子,它适用于Linux这样的开源操作系统,而不适合于Windows这样的闭源操作系统。

全虚拟化:

支持运行任何理论上可在真实物理平台上运行的操作系统。不需要对客户机操作系统进行任何修改。

KVM

KVM的开发人员并不是从底层开始新写一个Hypervisor,而是选择了基于Linux Kernel,通过加载新的模块而使Linux Kernel变身成为一个Hypervisor. 
KVM目前设计为通过可加载的内核模块,支持广泛的客户机操作系统,包括Windows.

在KVM架构中,虚拟机实现为常规的Linux进程,由标准Linux调度程序进行调度。事实上,每个虚拟CPU实现为一个常规的Linux进程。这使得KVM可以享受Linux内核的所有功能。

KVM本身不执行任何模拟,需要用户空间程序通过/dev/kvm接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的I/O,并将它的视频显示映射回宿主的显示屏。这个应用程序(注:上述的“用户空间程序”)就是大名鼎鼎的QEMU.

REHL6.x系统中的一个KVM客户机可以支持160个虚拟CPU和多达2TB的内存,KVM宿主机支持4096个CPU核心和多达64TB的内存。


第二章 KVM原理简介

操作系统内核设计分为:微内核和单内核。

单内核指的是整个内核从整体上作为一个单独的大过程来实现,并且同时运行在一个单独的地址空间内。所有的内核服务都在这样一个大的内核空间运行,内核之间的通信可以简单地实现为函数调用。

对于微内核来说,内核的功能被划分为多个独立的过程,每一个过程叫做一个服务器。多个服务器都运行在自己的地址空间,只有少量核心的服务器运行在特权模式下,服务器之间的通信采用了进程间通信机制。独立的服务器进程提高系统的健壮性,但是进程间通信由于涉及内核空间和用户空间的上下文切换,其开销比函数调用大得多。

Linux采用实用主义的设计:Linux内核被设计成单内核以满足性能要求;但同时,Linux内核还具有模块化设计和动态装载内核模块的能力。除了诸如进程切换、内存管理等核心内核功能,将大部分内核功能作为单独的内核模块设计并实现。这些内核模块编译好后以单独的二进制文件的形式存在,内核在运行过程中,按照需求,动态地加载并链接进入内核空间运行。不使用的模块还可以在运行过程中动态卸载。这样的设计,既保证了内核的性能,也改进了传统单内核设计的灵活性。 
KVM就是以内核模块的形式存在,为Linux内核增加了虚拟化的功能。

从虚拟机的基本架构来区分,分为2种:类型一和类型二。 
类型一: 
系统上电之后首先加载运行虚拟机监控程序,而传统的操作系统则是运行在其创建的虚拟机中。 
类型一的虚拟机监控程序,可以视为一个特别为虚拟机而优化裁剪的操作系统内核。 
著名的开源虚拟化软件Xen、商业软件VMware ESX/ESXi 和微软的Hyper-V就是类型一的代表。

类型二: 
在系统上电之后仍然运行一般意义的操作系统(也就是俗称的宿主机操作系统),虚拟机监控程序作为特殊的应用程序,可以是为操作系统功能的扩展。 
对于类型二虚拟机来说,最大的优势在于可以充分利用现有的操作系统;但也会受到宿主机操作系统的一些限制。 
KVM、VMware Workstation、VirtualBox就是属于类型二虚拟机。

KVM模块

P38-39

KVM模块的主要功能是初始化CPU硬件,打开虚拟化模式,然后将虚拟客户机运行在虚拟机模式下,并对虚拟客户机的运行提供一定的支持。 
KVM仅支持硬件虚拟化。

以KVM在Intel公司的CPU上运行为例: 
1. 在内核被加载的时候,KVM模块会先初始化内部的数据结构; 
2. 做好准备之后,KVM模块检测系统当前的CPU,然后打开CPU控制寄存器CR4中的虚拟化模式开关; 
3. 通过执行VMXON指令将宿主操作系统(包括KVM模块本身)置于虚拟化模式的根模式; 
4. 最后,KVM模块创建特殊设备文件 /dev/kvm 并等待来自用户空间的命令; 
5. 接下来,虚拟机的创建和运行将是一个用户空间应用程序(QEMU)和KVM模块相互配合的过程。

KVM模块和用户空间QEMU的通信接口主要是一系列针对特殊设备文件的IOCTL调用。 
KVM模块加载之初,只存在 /dev/kvm 文件,而针对该文件的最重要的IOCTL调用就是“创建虚拟机”,其可以被理解为KVM为了某个特定的虚拟客户机(用户空间程序创建并初始化)创建对应的内核数据结构。同时,KVM还会返回一个文件句柄来代表所创建的虚拟机。

针对虚拟处理器最重要的IOCTL调用就是“执行虚拟处理器”。通过它,用户空间准备好的虚拟机在KVM模块的支持下,被置于虚拟化模式的非根模式下,开始执行二进制指令。在非根模式下,所有敏感的二进制指令都会被处理器捕捉到,处理器在保存现场之后,自动切换到根模式,由KVM决定如何进一步处理(要么由KVM模块直接处理,要么返回用户空间交由用户空间程序处理)。

除了处理器的虚拟化,内存虚拟化也是由KVM模块实现的。实际上,这一部分是一个虚拟机实现代码中代码量最大、实现最复杂的部分(至少在硬件支持二维地址翻译之前是这样的)。

处理器对设备的访问主要是通过IO指令和MMIO,其中IO指令会被处理器直接截获,MMIO会通过配置内存虚拟化来捕捉。但是,外设的模拟一般并不由KVM模块负责。一般来说,只有对性能要求比较高的虚拟设备才会由KVM内核模块来直接负责,比如虚拟中断控制器和虚拟时钟。大部分输入输出设备还是会交给用户态程序QEMU负责。

QEMU设备模型

QEMU本身并不是KVM的一部分,其自身就是一个著名的开源虚拟机软件。它是一个纯软件的实现,所以性能低下。

为了简化开发和代码重用,KVM在QEMU的基础上进行了修改。在虚拟机运行期间,QEMU会通过KVM模块提供的系统调用计入内核,由KVM模块负责将虚拟机置于处理器的特殊模式运行。遇到虚拟机进行输入输出操作,KVM模块会从上次的系统调用出口处返回QEMU,有QEMU来负责解析和模拟这些设备。

http://blog.csdn.net/nirendao/article/details/52853103

使用BAT方法结束进程的更多相关文章

  1. BAT-使用BAT方法结束进程(删除进程)

    @echo off taskkill /f /im GAM.exe taskkill /f /im GCL10.exe

  2. Android下结束进程的方法

    转自:http://www.cnblogs.com/crazypebble/archive/2011/04/05/2006213.html 最近在做一个类似与任务管理器的东西,里面有个功能,可以通过这 ...

  3. android结束进程、退出application的方法

    1.finish()方法 finish是Activity的类,仅仅针对Activity,当调用finish()时,只是将活动推向后台,并没有立即释放内存,活动的资源并没有被清理:调用finish()方 ...

  4. Linux结束进程到底有多少种方法?

    我们经常在Linux里使用kill命令来结束某后台进程.但kill命令实际上是向进程发送信号,并且有多种信号.终止运行一个程序只是其中一个信号而已.kill是根据进程号发送信号的,而另一个工具kill ...

  5. C#各种结束进程的方法详细介绍

    Process类的CloseMainWindow, Kill, Close Process.CloseMainWindow是GUI程序的最友好结束方式,从名字上就可以看出来它是通过结束主窗体,相当于用 ...

  6. 关于ASP.NET MVC中Response.Redirect和RedirectToAction的BUG (跳转后继续执行后面代码而不结束进程)以及处理方法

    关于ASP.NET MVC中Response.Redirect和RedirectToAction的BUG (跳转后继续执行后面代码而不结束进程)以及处理方法   在传统的ASP.NET中,使用Resp ...

  7. c# 筛选进程命令行,得其ProcessId(唯一标示符,简称pid),再通过pid结束进程

    不说别的,上代码 部分using: using System.Diagnostics; using System.Management; 其中要引用System.Management 1.通过筛选Co ...

  8. Linux查看和结束进程命令详解

    在ubuntu中,终止一个进程或终止一个正在运行的程序,一般是通过 kill .killall.pkill.xkill 等进行. ----------------------------------- ...

  9. python 进程锁 生产者消费者模型 队列 (进程其他方法,守护进程,数据共享,进程隔离验证)

    #######################总结######### 主要理解 锁      生产者消费者模型 解耦用的   队列 共享资源的时候 是不安全的 所以用到后面的锁 守护进程:p.daem ...

随机推荐

  1. javascript 检测密码强度 美化版

    模仿美团的美化 <!DOCTYPE> <head runat="server"> <title></title> <link ...

  2. 用macports装了一份openssl

    我已经用macports装了一份openssl,然后自己又编译了一份openssl....第三方给Mac出的一个类似BSD Ports的一个软件包管理工具装的话只需要sudo port install ...

  3. 数据结构——链表(linkedlist)

    基本分类: 1.单向链表 2.带尾指针的单向链表 3.双向循环链表 以下分类进行说明 1.单向链表 基本元素:*front //头节点 *next //下一节点 声明:node<T>*p; ...

  4. linux搭建java环境

    建议使用EXCEL查看 准备文件 apache-tomcat-7.0.57.tar tomcat web容器 server-jre-7u76-linux-x64.tar  java jdk java执 ...

  5. stm32之中断系统

    概述: 提供中断控制器,用于总体管理异常,称之为“嵌套向量中断控制器:Nested Vectored Interrupt Controller (NVIC) VIC:中断管理器: NVIC:内嵌中断管 ...

  6. ThinkPHP - 配置项目结构

    配置项目结构: 项目如果分为前后台使用. 那么最关键的就是,使用公共部分文件的划分,其中最为核心的就是公共配置文件的使用. 下面介绍的就是怎么将前后台项目的公共部分提起出来. 首先是其他公共的文件夹: ...

  7. iOS系统自带的 UIAlertView 自动旋转的实现

    这里主要解析 UIAlertView 的几个关键功能的实现: 随着设备屏幕的旋转而旋转: Alert弹出框,使用UIWindow来实现,就是说,不用依赖于当前显示在最前面的UIView. 实现源码参考 ...

  8. 【centos6 , 7】 网络原理、网络配置

    第一部分:网络原理: 一.网络编址 (主要使用IP编址) 1.ip编址是一个双层编址方案,一个ip地址标识一个主机(或一个网卡接口) 2.现在应用最为广泛的是IPv4编址,已经开始逐渐向IPv6编址转 ...

  9. Android 使用 array.xml

    //获取文件资源 TypedArray mainNavIcon = context.getResources().obtainTypedArray(R.array.mainNavIcon); //获取 ...

  10. Win7 x64安装Paramiko出问题

    今天上午windows下配置paramiko环境时出现问题,随手记录下来.   先说一下我的环境: win7 x64 旗舰版.Python3.5.0.pip8.1.0 pip install para ...