windows下的虚拟内存分配分析
让我们从原始的进程创建开始分析吧。当进程创建后,操作系统给该进程分配4GB的虚拟地址空间,这部分虚拟内存是你的应用程序看的到的区域(注意很大一部分是不能访问的,比如:内核区域,这部分加载了操作系统中的内存管理,线程调度,文件系统和所有的设备驱动程序的代码,他们是所有进程共享的地址空间,但是不能访问)。当分配完了虚拟地址空间后,其实这些地址空间还是空闲的,自由的,你此时还是不能使用这些空间,那怎么才能使用这些空间呢?保留。。保留是什么呢?(virtualAlloc)
保留: 要求操作系统在本进程的虚拟地址空间里将指定的一段空出来,暂时不要给别的东西占用了,我先把这部分占好了,我以后来用。
现在我们只是进行了保留操作,我们只是占有了这段内存区域,怎么来使用呢?我们必须提交物理存储器。麻烦又来了,物理存储器是什么呢?我也没在网上找到很多资料,下面只是个人的理解。
物理存储器包括:计算机的内存,操作系统的页文件或你的exe/dll文件(用于内存映射文件),一般说的最多的是页文件。
顺便解释下页文件是什么:我们都知道虚拟内存有4GB,但是我们的物理内存是没有那么大的,此时我们需要把那些暂时不用的东西放到磁盘上去,Windows里面通常是存到一个叫pagefile.sys的文件里面,这个文件应该就是页文件。
上面提到提交物理存储器其实就是将物理存储器映射到那部分保留的地址空间(VirtualAlloc)。当你的应用程序不需要访问这部分保留的地址空间的物理存储器时,就可以把它释放了(VirtualFree)。
下面一个图来进一步的分析一下具体过程:
只要把这个看懂了,就基本上知道了windows下的基本虚拟内存地址和物理内存地址的映射了,进程如何访问虚拟内存了。
最后来了解一下应用程序启动的情况:
估计你会这样认为:系统必须将进程的代码和数据保留地址空间的一些区域,将屋里存储器提交给这些区域,然后将代码和数据从硬盘上的可执行程序文件中拷贝到页文件中已提交的物理存储器中,然后再根据上面那幅图来进行页交换,地址映射这些,这样就完成了一个进程的启动和运行。
但真实的情况并不是这样。启动应用程序后,操作系统打开该应用程序的exe文件,确定该应用程序的代码和数据的大小,然后系统要保留一部分地址空间,并指明与该区域相关联的物理存储器是在exe文件本身中,即系统并不是从页文件中分配地址空间,不是从页文件中拿出物理存储器来提交到该保留区域,而是将exe文件映像(该文件的实际内容:全部二进制代码,全局变量/静态变量,导入段等)用作这部分保留区域。这样程序就会加载的很快。其实这就是内存映射文件的例子。
windows下的虚拟内存分配分析的更多相关文章
- 【windows下进程searchfilterhost.exe分析】
searchfilterhost.exe [进程信息] 进程文件: searchfilterhost.exe 进程名称: n/a 英文描述: searchfilterhost.exe is a pro ...
- windows下安装awstats来分析apache的访问日志
一.啰嗦两句 之前在Windows下用Apache时,也曾经配置过Awstats,然后换了工作,改用Linux+nginx,渐渐把Apache忘记了.又换了工作,又得用Apache,这回版本更新到2. ...
- windows下的volatility取证分析与讲解
volatility(win64) 1.下载 volatility 下载地址:(我下载的版本2.6,并把名字稍微改了一下) Release Downloads | Volatility Foundat ...
- windows下安装php性能分析工具XHProf
一.安装扩展 下载XHProf扩展:http://dev.freshsite.pl/php-extensions/xhprof.html 放入扩展文件:下载后解压出.dll文件,拷贝它到php的ext ...
- Windows下使用doxygen阅读和分析C/C++代码
Windows下使用doxygen阅读和分析C/C++代码 转自:http://blog.sina.com.cn/s/blog_63d902570100gwk6.html 虽然使用各种IDE或者Sou ...
- QTimer源码分析(以Windows下实现为例)
QTimer源码分析(以Windows下实现为例) 分类: Qt2011-04-13 21:32 5026人阅读 评论(0) 收藏 举报 windowstimerqtoptimizationcallb ...
- 深刻:截获windows的消息并分析实例(DefWindowProc),以WM_NCHITTEST举例(Windows下每一个鼠标消息都是由 WM_NCHITTEST 消息产生的,这个消息的参数包含了鼠标位置的信息)
1,回调函数工作机制 回调函数由操作系统自动调用,回调函数的返回值当然也是返回给操作系统了. 2,截获操作系统发出的消息,截获到后,将另外一个消息返回给操作系统,已达到欺骗操作系统的目的. 下面还是以 ...
- 【已解决】Windows下 MySQL大小写敏感 解决方案及分析
Windows下 MySQL大小写敏感配置 zoerywzhou@163.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2017-3-27 最近在window ...
- Windows下return,exit和ExitProcess的区别和分析
通常,我们为了使自己的程序结束,会在主函数中使用return或调用exit().在windows下还有ExitProcess()和TerminateProcess()等函数. 本文的目的是比较以上几种 ...
随机推荐
- SQL Server Management Studio 教程一:设置sa用户登录
今天在net项目中添加数据库过程中出现了小问题,就是使用sql server身份验证没登录成功,经过一番调试,终于解决问题. 使用sa账户登录sql server 2008 的方法步骤如下: 1.首先 ...
- SVN服务器与客户端下载地址_搭建使用
下载地址: http://subversion.apache.org/packages.html Windows CollabNet (supported and certified by Colla ...
- 移动平台的WebApp之Meta标签
对于桌面平台web布局中大家对meta标签再熟悉不过了,它永远位于 head 元素内部,对做SEO的朋友一定对meta有种特殊的感情吧,今天我们就来说说移动平台的meta标签,在移动平台meta标签究 ...
- A profile to detect when a SMS database has been changed
http://webmail.dev411.com/t/gg/tasker/12bdddbsak/a-profile-to-detect-when-a-sms-has-been-sent A bela ...
- 关于OPC Client 编写
昨天又有人问我 OPC Client 编写,实际是他们不了解OPC 客户端的工作原理,要想写客户端程序,必须知道OPC对象, OPC逻辑对象模型包括3类对象:OPC server对象.OPC grou ...
- Ext ComboBox 动态查询
Ext中的combobox有属性typeAhead:true 可以实现模糊匹配,但是是从开始匹配的,如果需要自定的的匹配,则需要监听beforequery方法,实现自己的匹配查询方法: var gfx ...
- easyui datatimebox 取值和赋值
1.取值 var time = $('.easyui-datetimebox').datetimebox('getValue'); 全部代码如下: <script type="text ...
- tcp_client.c tcp_server.c
#include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> ...
- Git 学习(五)远程仓库
Git 学习(五)远程仓库 之前的章节所说的是本地Git仓库的操作,版本管理的优越性显然不会仅仅在本地.远程仓库也就是服务器或是网络端的仓库操作也是必须的. 本文具体说明 Git 的远程仓库操作,示例 ...
- std::tr1::function
转自:https://www.cnblogs.com/qlee/archive/2011/07/04/2097594.html 在C++的TR1中(Technology Report)中包含一个fun ...