操作系统真实的虚拟内存是什么样的

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,那将是它能管理的地址空间范围:


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436029.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

约瑟夫问题c语言链表解法,约瑟夫环问题 --链表 C语言

总共有m个人在圆桌上,依次报名,数到第n个数的人退出圆桌,下一个由退出人下一个开始继续报名,循环直到最后一个停止将编号输出#include #include typedef struct Head * PHead;typedef struct Node * PNode;struct Head{PNode Next…

【转】用fo-dicom实现print scu的注意事项!!!!!!!!!

转自:https://blog.csdn.net/tvsofa2008/article/details/50245357 用fo-dicom实现print scu的注意事项 fo-dicom是一个开源的协议库,开发语言是c#。网上针对fo-dicom的分析也有不少,但是专门针对dicom print的文章还是太少了。 近几天需要…

DELPHI串口通讯编程

spcomm更加简单 转贴 Delphi中串口通信的实现 河南省计算中心 张海航 -------------------------------------------------------------------------------- Delphi是一种具有功能强大、简便易用和代码执行速度快等优点的可视化快速应用开发工具,它在…

设计模式C++实现 ——观察者模式

观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。它还有两个别名,依赖(Dependents),发布-订阅(Publish-Subsrcibe)。可以举个博客订阅的例子&…

【转】DCMTK开源库的学习笔记1:将DCM文件保存成BMP文件或数据流(即数组)

转自:https://blog.csdn.net/zssureqh/article/details/8784980 DCMTK开源库介绍: DCMTK是目前最全面实现DICOM3.0标准的开源库,通过结合DCMTK开源库和CxImage图像开源库,能够很方便的开发属于自己的DCM文件编辑浏览软件。 DCMT…

如何将C语言翻译成汇编语言,如何把汇编语言转换成C语言

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼程序:ORG 0000HLJMP MAINORG 000BHLJMP TIMEORG 1000HHOUR1 EQU 10hHOUR2 EQU 12hMIN1 EQU 14hMIN2 EQU 16hSEC1 EQU 18HCOUNT EQU 20HNUM1 EQU 22HNUM2 EQU 24HLL4 EQU 26Hs1 bit P1.0s2 bit P1.1s3 bit P1.2s4 bit P1.3A1 EQU 36…

数据库-Oracle【Oracle数据库设置默认表空间问题及Oracle,SQL,MySQL的自增变量设置】...

一、 Oracle数据库设置默认表空间问题 DBA们经常会遇到一个这样令人头疼的问题:不知道谁在Oracle上创建了一个用户,创建时,没有给这个用户指定默认表空间,所以这个用户就会采用默认的表空间——system表空间。导致系统表空间迅速被…

设计模式——Iterator模式实现研究

导读:软件设计模式是一种表达、记录和重用软件设计结构和设计经验的新方法,它对反复出现的设计结构的关键特征进行识别、抽象和命名,使重用成功设计和结构更加容易。本文介绍了软件设计模式的特点、描述方式以及在设计中使用模式带来的好处&a…

【转】DCMTK 开源库的学习笔记2:直接操作dcm文件中像素数据的尝试

转自:https://blog.csdn.net/zssureqh/article/details/8785132 DCMTK官网给出了JPEG格式压缩的DCM文件解压缩的方法(http://support.dcmtk.org/docs/mod_dcmjpeg.html),代码摘录如下: DJDecoderRegistration::regist…

R语言处理非线性回归模型C-D方程,使用R语言进行多项式回归、非线性回归模型曲线拟合...

对于线性关系,我们可以进行简单的线性回归。对于其他关系,我们可以尝试拟合一条曲线。曲线拟合是构建一条曲线或数学函数的过程,它对一系列数据点具有最佳的拟合效果。使用示例数据集#我们将使Y成为因变量,X成为预测变量#因变量通…

认识IL

1.要编译的代码如下: using System; using System.Collections.Generic; using System.Text; namespace HellowWorld { class Program { static void Main() { Console.Write("Hello World!"); } } } 2…

c语言之多线程函数,如何用C语言实现多线程

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Windows操作系统,C语言实现多线程:#include #include DWORD APIENTRY ThreadOne ( LPVOID threadArg ){printf ( "线程开始啦,参数是:%s\n" , (char *)threadArg );return …

Iterator模式

Iterator模式的几种用法 在网络上看帖子时发现不少模式的初学者对Iterator模式的理解仅仅停留在从类库的容器类取得Iterator来遍历容器中的内容的程度。 因此在这里写几个例子,来加深大家对Iterator模式的理解。 对容器中元素的访问涉及到3个方面。 1.容…

【转】DCMTK开源库的学习笔记3:dcmtk文件中数据元的修改

转自:https://blog.csdn.net/zssureqh/article/details/8804736 dcm文件是医学领域DICOM3.0标准所对应的主要的文件格式。前两篇学习笔记中,学习了读取dcm文件的相关信息,如信息头MetaInformation元素、像素数据元素,只停留在了读…

设计模式C++实现 —— 外观模式、组合模式

外观模式应该是用的很多的一种模式,特别是当一个系统很复杂时,系统提供给客户的是一个简单的对外接口,而把里面复杂的结构都封装了起来。客户只需使用这些简单接口就能使用这个系统,而不需要关注内部复杂的结构。DP一书的定义&…

rsync的原理和安装使用及配制详解(三)(转)

5、示例脚本 这里这些脚本都是rsync网站上的例子: 1、每隔七天将数据往中心服务器做增量备份 #!/bin/sh# This script does personal backups to a rsync backup server. You will end up# with a 7 day rotating incremental backup. The incrementals will go# in…

单片机c语言控制显示器,单片机实现LCD液晶显示器控制原理..docx

摘 要LCD液晶显示已经是人机界面的关键技术。 本文对基于单片机的LCD夜晶显示器 控制系统进行了研究。首先在绪论中介绍了本课题的课题背景、 研究意义及完成的功能。本系统是以单 片机的基本语言C语言来进行软件设计,51的编程语言常用的有二种,一种是汇…

【转】DCMTK开源库的学习笔记4:利用ini配置文件对dcm影像进行归档

转自:https://blog.csdn.net/zssureqh/article/details/8846337 背景介绍: 医学影像PACS工作站的服务端需要对大量的dcm文件进行归档,写入数据库处理。由于医学图像的特殊性,每一个患者(即所谓的Patient)…

linux ( )含义,Linux的shell中$()、$[] 、${}分别是什么意思?

在bash中,$( )与 (反引号)都是用来作命令替换的。命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行。exp 1[rootlocalhost ~]# echo today is $(date &q…

导师评语(转)

星期一到了……小英在交完作业後,中午马上被老师叫去罚站,附加念500遍「我以後不敢编谎话欺骗老师了」。 why?为何这名老师要残忍的对待这名柔弱的小学生?我们来瞧瞧她的作文是怎麽写的…… ━━━━━━━━━━━━━━━━━━…