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()等函数. 本文的目的是比较以上几种 ...
随机推荐
- Codeforces Round #297 (Div. 2)D. Arthur and Walls 暴力搜索
Codeforces Round #297 (Div. 2)D. Arthur and Walls Time Limit: 2 Sec Memory Limit: 512 MBSubmit: xxx ...
- 手把手教你搭建Docker私有仓库
章节一:centos7 docker安装和使用_入门教程 章节二:使用docker部署Asp.net core web应用程序 有了前面的基础,接下来的操作就比较简单了.先准备两台虚拟机,两台机器上都 ...
- 从零开始搭建linux下laravel 5.5所需环境(二)
我们已经装好了nginx,现在我们开始装mysql和php 我们同样使用yum来安装. 先安装MySQL软件(客户端.服务器端.依赖库) yum install -y mysql mysql-serv ...
- Maven学习-使用Nexus搭建Maven私服
为什么要搭建nexus私服,原因很简单,有些公司都不提供外网给项目组人员,因此就不能使用maven访问远程的仓库地址,所以很有必要在局域网里找一台有外网权限的机器,搭建nexus私服,然后开发人员连到 ...
- SYSCALL_DEFINE3
http://blog.csdn.net/yueyingshaqiu01/article/details/48786961
- mysql 源代码讲解
http://www.zhdba.com/mysqlops/category/mysql-source-code/
- 如何在windows server 2008上配置NLB群集
参考:http://zlwdouhao.blog.51cto.com/731028/781828 前些天写了一篇关于NLB群集模式多播和单播的简单介绍.那么下面我们一起来探讨一下,如何在windows ...
- 原生js实现图片预览并上传
最近主导的PC客户端网站重构工程告一段落,下一阶段开始给公司APP开发H5页面,技术栈是react.最近碰到一个需求:需要在H5页面上添加身份证照片,预览并上传.因为要兼容安卓4.4以下版本的手机,所 ...
- Swift之沙盒与数据存储
应用沙盒结构分析 1.应用程序包:包含了所有的资源文件和可执行文件 2.Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录 3.tmp:保存应用运行时所需要的 ...
- Unity中一键创建常用文件夹
Unity中一键创建常用文件夹 说明 项目测试版本Unity5.3. 这个一个小工具:功能非常简单,就是一键给新建工程添加所有文件夹.到此结束. 但是具体咋操作呢? 与把大象装进冰箱一样,三步,下载代 ...