运行在ESXi主机上的虚拟机分配内存之和可以超过物理机的实际内存大小,这个技术叫做超额分配(overcommitment),即使单个虚拟机的内存分配值都可以超分。但是超分的结果就是可能会引起内存资源竞争,从而有可能影响到性能。

VMkernel中有另外一个组件叫做memory allocator,用来负责内存资源的分配,(负责CPU调度的是scheduler,上一篇提到过),如下图:

那么内存分配的过程究竟是怎样的呢?我们来详细描述一下:

  • 首先,内存分为三个级别,主机物理内存,客户机物理内存(虚拟机分配的内存大小),客户机虚拟内存(应用程序使用的内存)。虚拟机开机后,VMkernel 不会立即分配所有的客户机物理内存给虚拟机,初始阶段是根据OS和应用程序的需要按需分配,如下图所示。这个时候,VMkernel会把物理机的内存页面地址映射给客户机物理内存页面,从而实现内存虚拟化。

  • 其次,当OS和应用程序释放内存的时候,Guest OS会把这些内存页面地址放在free list,但是VMkernel并不知道这个list,也就是说,VMkernel是不知道Guest里边有内存释放,也不会知道哪些应用程序正在占用哪些内存页面,它只知道虚拟机分配的内存大小。(是不是感觉VMkernel挺傻的,自己的东西分给别人了,但是别人用不用也不知道,直到最后自己的东西被分完了。)如下图所示:

其中,free list是Guest OS没有分配给应用程序的,左侧第一个“红色”内存页面是应用程序暂时不用的,被称为“Idle--闲置”内存,其他三个内存页面(黄色,蓝色,灰色)是应用程序正在使用的,被称为“Active--活动”内存,所以Guest OS会把内存分为下图的树形结构:

最后,当内存超分时,虚拟机请求的内存达到或者超过实际的物理内存大小时,VMkernel就要对分配出去的内存进行回收,从而触发四种内存回收机制,目的是为了保证所有的虚拟机都可以共享到内存资源,默认情况下,物理内存是平均分配的,但是如果管理员设置了资源控制参数(预留,限制,份额),那么VMkernel就会按照优先级对虚拟机的内存请求进行重分配。

详细讲述了CPU的调度原理,本篇讲一下内存的分配过程。的更多相关文章

  1. python并发编程之进程、线程、协程的调度原理(六)

    进程.线程和协程的调度和运行原理总结. 系列文章 python并发编程之threading线程(一) python并发编程之multiprocessing进程(二) python并发编程之asynci ...

  2. 超详细的Guava RateLimiter限流原理解析

    超详细的Guava RateLimiter限流原理解析  mp.weixin.qq.com 点击上方“方志朋”,选择“置顶或者星标” 你的关注意义重大! 限流是保护高并发系统的三把利器之一,另外两个是 ...

  3. 测试那些事儿—简述CPU的工作原理

    简单介绍CPU的工作原理 1.内部架构 CPU是由晶体管组成,其根本任务就是执行指令和数据处理,对计算机来说,就是由0和1组成的序列.CPU从逻辑上可分为3个模块,分别是控制单元,运算单元和存储单元. ...

  4. 弄懂goroutine调度原理

    goroutine简介 golang语言作者Rob Pike说,"Goroutine是一个与其他goroutines 并发运行在同一地址空间的Go函数或方法.一个运行的程序由一个或更多个go ...

  5. 图解Go协程调度原理,小白都能理解

    阅读本文仅需五分钟,golang协程调度原理,小白也能看懂,超实用. 什么是协程 对于进程.线程,都是有内核进行调度,有CPU时间片的概念,进行抢占式调度.协程,又称微线程,纤程.英文名Corouti ...

  6. golang channel的使用以及调度原理

    golang channel的使用以及调度原理 为了并发的goroutines之间的通讯,golang使用了管道channel. 可以通过一个goroutines向channel发送数据,然后从另一个 ...

  7. 简单介绍 CPU 的工作原理

    1.内部架构 CPU 的根本任务就是执行指令,对计算机来说最终都是一串由 0 和 1 组成的序列.CPU 从逻辑上可以划分成 3 个模块,分别是控制单元.运算单元和存储单元 .其内部架构如下: [1] ...

  8. Erlang的调度原理(译文)

    原文 http://jlouisramblings.blogspot.com/2013/01/how-erlang-does-scheduling.html 免爬墙链接 http://www.diku ...

  9. CPU 的工作原理

    内部架构 CPU 的根本任务就是执行指令,对计算机来说最终都是一串由 0 和 1 组成的序列.CPU 从逻辑上可以划分成 3 个模块,分别是控制单元.运算单元和存储单元 .其内部架构如下: [1]控制 ...

  10. ARM CPU自动调度神经网络

    ARM CPU自动调度神经网络 对特定设备和工作负载进行自动调度,对于获得最佳性能至关重要.通过RPC使用自动调度器为ARM CPU调度整个神经网络. 为了自动调度神经网络,将网络划分为小的子图,进行 ...

随机推荐

  1. 贝叶斯定律和卡尔曼滤波中,关于(e^-x)*(e^-x)的积分的计算方法

    贝叶斯定律和卡尔曼滤波中,关于(e^-x)*(e^-x)的积分的计算方法: 1.用数学软件Mathmatica计算: 2.用复变函数中的留数定理计算: 3.用FFT+卷积公式计算.

  2. 开源轻量级 IM 框架 MobileIMSDK 的微信小程序端已发布!

    一.基本介绍 MobileIMSDK - 微信小程序端是一套基于微信原生 WebSocket 的即时通讯库: 1)超轻量级.无任何第 3 方库依赖(开箱即用): 2)纯 JS 编写.ES6 语法.高度 ...

  3. spark (三) hadoop上传文件并运行spark

    目录 1. 上传文件到hdfs 2. 运行wordCount 2.1 spark-shell运行 2.2 spark-submit运行example(stand-alone) 2.3 spark-su ...

  4. Chrome谷歌浏览器自动升级后页面字体过小

    谷歌浏览器使用一段时间后系统自动升级后页面字体突然变小,如何进行设置呢,如下 1.在页面右上角选择浏览器设置-外观-自定义字体-设置字号等其他需要配置的参数即可

  5. ffmpeg 去除音频中的静音

    去除音频中的静音 //去除所有超过0.3秒的静音部分 ffmpeg -i input.mp3 -af silenceremove=stop_periods=-1:stop_duration=0.3:s ...

  6. biancheng-Spring Cloud Alibaba Nacos

    参考http://c.biancheng.net/springcloud/what-is-alibaba.html http://c.biancheng.net/springcloud/nacos.h ...

  7. biancheng-Redis教程

    目录http://c.biancheng.net/redis/ 1Redis是什么2Windows下载安装Redis3Ubuntu下载安装Redis4Redis配置文件5Redis数据类型6Redis ...

  8. Spring Cloud认知学习(二):Feign的使用、熔断器Hystrix

    Feign Feign用于声明式调用服务在上面的服务调用中,我们始终还是没有摆脱restTemplate,我们调用别的服务始终要使用restTemplate来发起.想想我们以前是怎么开发的(三层架构, ...

  9. docker没有vi不能执行yum报Device or resource busy

    最近在使用docker的过程中发现一个问题,就是想用vim编辑器编辑一个文件,发现连vi都没有. 于是想到一个办法用docker cp来解决问题: 首先执行docker ps -a查看容器的id 然后 ...

  10. java中的集合ArrayList

    创建集合对象有3种形式 1,不需要传递构造参数,直接new就可以,此时底层数组为空数组. 2,构造参数需要传递一个int类型的值, 用于设置底层数组的长度 3,构造参数需要传递一个Collection ...