1. 内存及虚存基本布局

提起虚存,大都能说出几条来。

对于32位系统,大多数操作系统都会将4GB的内存空间的一部分挪给内核使用,应用程序无法直接访问这一段内存,这部分内存空间称为内核空间。Windows默认情况下会将高地址的2GB分配给内核(也可配置为1GB),而Linux默认情况下将高地址的1GB空间分配给内核。参考阅读:《程序员的自我修养—链接、装载与库》第10章--内存
Linux进程地址空间分布图]:

windows进程地址空间分布图如下图所示:

2. Windows上的虚存概况

以windows平台为例,应用程序可以调用堆API、.NET的垃圾回收器或者C运行时malloc相关API来分配虚拟内存,但是所有这些实现都依赖于VirtualAlloc API的实现。当应用用完地址空间的时候,接着会调用VirtualAlloc,然后可能会报错(返回NULL地址). 使用TestLimit工具,http://download.sysinternals.com/files/TestLimit.zip, 该工具带命令行参数-r 会不断的调用VirtualAlloc,直至出错。当在32位操作系统下运行时,会耗掉整个2GB的地址空间:

我们注意到2010MB并不等于2GB,但是Testlimit的其它代码和数据,包括可执行码和系统DLL,应该是是造成结果不同的原因,使用进程管理器,可能会看到实际虚存消耗:

有些应用,像SQL Server或者微软的Active Directory,管理了大量的数据结构,如果加载到地址空间的数据越多,表现得会越好。因此,在Windows NT4 SP3 当中引入了boot启动选项,/3GB,它允许将4GB的地址空间中的3GB提供给用户态,也就是让系统(内核)地址空间减少了1GB。Windows XP和win2003还引入了选项 /userva,来迁移2GB和3GB之间的内存碎片。详见下图:

如果要充分利用2G以上的空间,进程必须在exe文件中设定大地址标识。因为2GB空间的高位始终是0,这个高位同时也是用户态自己的标识。如果超过了2G,高位将变成1,如果没有相关处理,将会出错。

所有的微软服务器产品以及一些数据集中的程序都设定了大地址标识,如chkdsk.exe, lsass.exe (目录服务会用到),Smss.exe(会话管理器进程), esentutl.exe(目录Jet数据库修复工具), 我们可以使用dumpbin工具来检查exe中的该标志值, dumpbin是Visual Studio自带的工具,如下图所示:

Testlimit同样也用上了大地址标识:

3. 64位环境下的虚存

64位windows下,地址空间远远不止4GB,  这时,windows可以把32位进程序的最大的4GB全部用上,而剩余的地址空间都留给操作系统的虚存。如果您在64位的windows下运行Testlimit,可以看到它可以利用所有的32位地址空间:

64位进程序使用的是64位字长的指针,它们的理论最大地址空间为2^^64,然而windows并没有为用户进程序和操作系统提供比较平均的地址空间,而是在此空间中划分了一部分区域给用户进程,另一部分划给不同的系统内存资源,如系统页表的入口(PTE),文件缓存,页缓冲池和非页缓冲池。

IA64和x64体系下的进程地址空间大小是不同的,其大小取决于应用程序对内存用于支撑地址空间的总体需要(页表中的页和缓冲翻译表 TLB)。对于x64体系(AMD),是8T的量,而IA64下,则是7168GB(7T)的量,中间有1T的差异,主要源于IA64下,有1TB的空间用于顶级页目录用于为系统的Wow64映射表保留。 IA64和x64版本的windows, 各种资源的地址空间,大概都是128GB (如非页池,分配的就是的28GB的地址空间),只有一个例外,文件缓冲,它分配的是1TB的地址空间。总体来看,64位进程的地址空间,看起来如下图所示:

可以明显的看出,图里边有很大的地址空间空档,可能会用于将来的地址扩展。当您运行64位版本的Testlimit,它会消耗8TB,那将是它能管理的地址空间范围:

操作系统真实的虚拟内存是什么样的相关推荐

  1. 操作系统真实的虚拟内存是什么样的(一)

    1. 内存及虚存基本布局 提起虚存,大都能说出几条来. 对于32位系统,大多数操作系统都会将4GB的内存空间的一部分挪给内核使用,应用程序无法直接访问这一段内存,这部分内存空间称为内核空间.Windo ...

  2. 操作系统:Linux虚拟内存知识介绍

    今天给大家分享Linux虚拟内存相关的知识,希望的对大家能有所帮助! 1.虚拟内存 毋庸置疑,虚拟内存是操作系统中最重要的概念之一.我想主要是由于内存的重要"战略地位".CPU太快 ...

  3. 操作系统-第九章虚拟内存

    操作系统-第九章虚拟内存 虚拟内存 内存共享 按需调页 虚拟存储需要解决的几个问题 页表中须指明对应的页是否在内存中 如何具体的区分当发生页错误时 page is invalid or isvalid ...

  4. 操作系统中的虚拟内存详解

    https://blog.csdn.net/dan15188387481/article/details/49536317 操作系统中的内存管理技术是十分复杂的.现在的操作系统基本都使用逻辑地址和物理 ...

  5. 操作系统学习笔记-虚拟内存

    虚拟内存是什么呢?举个例子,在学习c语言的时候我们尝试输出过一个指针的地址,其实这里打印出来的地址就是虚拟地址,也就是说我们好像从未真正的了解过计算机,从未见过他的真实地址在内存的映射,如果你对它有兴 ...

  6. 操作系统—物理内存与虚拟内存

    概念解析 物理内存,在应用中,自然是顾名思义,物理上,真实的插在板子上的内存是多大就是多大了.而在CPU中的概念,物理内存就是CPU的地址线可以直接进行寻址的内存空间大小.比如8086只有20根地址线 ...

  7. 操作系统课设--虚拟内存

    山东大学操作系统课设lab7 实验七 虚拟内存(lab7) 实验目的 实验环境 实验思路 关键源代码注释以及程序说明 调试记录 实验七 虚拟内存(lab7) 实验目的 在未实现虚拟内存管理之前,Nac ...

  8. 清华操作系统笔记4——虚拟内存技术

    CSDN话题挑战赛第2期 参赛话题:学习笔记 系列文章目录 文章目录 系列文章目录 前言 一. 虚拟内存的需求背景 起因 问题 二.覆盖技术 (1)目标 (2)原理 缺点 三.交换技术 (1)目标 ( ...

  9. 操作系统-内存管理-虚拟内存管理

    目录 一.虚拟内存定义和特征 二.请求分页管理 页表机制 缺页中断机构 地址变换机构 三.页面置换算法 3.1最佳置换算法(OPT) 3.2先进先出置换算法(FIFO) 3.3最近最久未使用置换算法( ...

最新文章

  1. python对视频画框标记后保存
  2. jQuery获取和设置元素
  3. android gridview控件使用详解_作为Android 开发者该如何进阶?
  4. 电脑新手:一次了解电脑键盘上每个键的含义!
  5. .NET CORE 多语言实现方案
  6. 【VBS】一款无聊的 Visual Basic Script 表白程序
  7. CSS快速学习7:定位锚点
  8. 【Java虚拟机】运行时数据区
  9. OSPF特殊区域及LSA类型详解
  10. python 闭包,装饰器,random,os,sys,shutil,shelve,ConfigParser,hashlib模块
  11. 什么软件画er图方便_er图绘制工具|er图绘制工具(powerdesigner) v16.5 免费版 - 软件下载 - 绿茶软件园|33LC.com...
  12. 计算机公共基础课网络教学平台,“计算机基础”教学中网络教学平台应用研究.doc...
  13. 【一牛鸣】大盘将持续震荡9.13
  14. oracle9i12535错误,11gr2 alert日志中报TNS-12535 TNS-00505原因及解决方法
  15. 高中计算机操作题frontpage步骤,计算机一级Frontpage操作试题
  16. OpenCV开发笔记(四十五):红胖子8分钟带你深入了解重映射(图文并茂+浅显易懂+程序源码)
  17. Origin绘图后导出图片的方法
  18. Fundamental of 4G LTE - 学习笔记(3)OFDMA/OFDM in 4G LTE (Part1)
  19. 第一台计算机如何工作原理,世界上第一台计算机是什么原理_世界上第一台计算机...
  20. python3的自学之路--3_python的数据类型

热门文章

  1. fckeditor for php 下载,FCKeditor2.3 For PHP 详细整理的使用参考
  2. 使用JWT实现单点登录(完全跨域方案)
  3. 荐 Intellij IDEA创建Maven Web项目(带有webapp文件夹目录的项目)
  4. Linux基本命令 (一)
  5. 第13章 程序的动态加载和执行(二,用户代码)
  6. spring体系思维导图
  7. Visual Studio 2005 Tip:编辑项目文件
  8. canvas填充规则
  9. keras中的mini-batch gradient descent (转)
  10. 【Android实战】Gallary+ImageSwicther图片查看器