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()等函数. 本文的目的是比较以上几种 ...
随机推荐
- UVALive 4869 Profits DP
G - Profits Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Status ...
- vue 组件开发 props 验证
使用props 在Vue中父组件向子组件中传送数据是通过props实现的,一个简单的使用props的例子: <!DOCTYPE html> <html> <head> ...
- ControllerEvent
1.TouchDown --->按下去 响应事件 2.TouchRepeat --->重复点击 ,从第二次点击开始响应事件 3.TouchDragInside ---->在组建范 ...
- HTML5学习笔记4
10.表单元素表单元素用于获取用户的输入数据form 表示HTML表单属性: action 表示表单提交的页面 method 表示表单提交的请求方式:有POST和GET两种,默认GET(P ...
- 自定义MVC视图引擎ViewEngine 创建Model的专属视图
MVC内置的视图引擎有WebForm view engine和Razor view engine,当然也可以自定义视图引擎ViewEngine.本文想针对某个Model,自定义该Model的专属视图. ...
- MVC扩展ModelBinder,通过继承DefaultModelBinder把表单数据封装成类作为action参数
把视图省.市.街道表单数据,封装成一个类,作为action参数.如下: action方法参数类型: namespace MvcApplication1.Models{ public class ...
- iOS 调用短信、电话、邮件、浏览器等
1.调用 自带mail[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://admin@hzl ...
- interlliJ idea 不识别文件类型的解决方式
idea 支持非常多种文件类型.然而总有想不到. 近期开发jenkins 插件,jenkins 插件的页面开发大多用jelly 如何让idea识别jelly呢? ctrl+alt+s 快捷键打开配置页 ...
- mongodb 只查询一个字段
db.users.find({}, {"userName":1,"_id":0}) ; "_id":0表示不显示_id
- Spring3数据源的6种配置方法
在Spring3中,配置DataSource的方法有五种. 第一种:beans.xml <bean id="dataSource" class="org.apach ...