让我们从原始的进程创建开始分析吧。当进程创建后,操作系统给该进程分配4GB的虚拟地址空间,这部分虚拟内存是你的应用程序看的到的区域(注意很大一部分是不能访问的,比如:内核区域,这部分加载了操作系统中的内存管理,线程调度,文件系统和所有的设备驱动程序的代码,他们是所有进程共享的地址空间,但是不能访问)。当分配完了虚拟地址空间后,其实这些地址空间还是空闲的,自由的,你此时还是不能使用这些空间,那怎么才能使用这些空间呢?保留。。保留是什么呢?(virtualAlloc)

保留: 要求操作系统在本进程的虚拟地址空间里将指定的一段空出来,暂时不要给别的东西占用了,我先把这部分占好了,我以后来用。

现在我们只是进行了保留操作,我们只是占有了这段内存区域,怎么来使用呢?我们必须提交物理存储器。麻烦又来了,物理存储器是什么呢?我也没在网上找到很多资料,下面只是个人的理解。

物理存储器包括:计算机的内存,操作系统的页文件或你的exe/dll文件(用于内存映射文件),一般说的最多的是页文件。

顺便解释下页文件是什么:我们都知道虚拟内存有4GB,但是我们的物理内存是没有那么大的,此时我们需要把那些暂时不用的东西放到磁盘上去,Windows里面通常是存到一个叫pagefile.sys的文件里面,这个文件应该就是页文件。

上面提到提交物理存储器其实就是将物理存储器映射到那部分保留的地址空间(VirtualAlloc)。当你的应用程序不需要访问这部分保留的地址空间的物理存储器时,就可以把它释放了(VirtualFree)。

下面一个图来进一步的分析一下具体过程:

只要把这个看懂了,就基本上知道了windows下的基本虚拟内存地址和物理内存地址的映射了,进程如何访问虚拟内存了。

最后来了解一下应用程序启动的情况:

估计你会这样认为:系统必须将进程的代码和数据保留地址空间的一些区域,将屋里存储器提交给这些区域,然后将代码和数据从硬盘上的可执行程序文件中拷贝到页文件中已提交的物理存储器中,然后再根据上面那幅图来进行页交换,地址映射这些,这样就完成了一个进程的启动和运行。

但真实的情况并不是这样。启动应用程序后,操作系统打开该应用程序的exe文件,确定该应用程序的代码和数据的大小,然后系统要保留一部分地址空间,并指明与该区域相关联的物理存储器是在exe文件本身中,即系统并不是从页文件中分配地址空间,不是从页文件中拿出物理存储器来提交到该保留区域,而是将exe文件映像(该文件的实际内容:全部二进制代码,全局变量/静态变量,导入段等)用作这部分保留区域。这样程序就会加载的很快。其实这就是内存映射文件的例子。

windows下的虚拟内存分配分析的更多相关文章

  1. 【windows下进程searchfilterhost.exe分析】

    searchfilterhost.exe [进程信息] 进程文件: searchfilterhost.exe 进程名称: n/a 英文描述: searchfilterhost.exe is a pro ...

  2. windows下安装awstats来分析apache的访问日志

    一.啰嗦两句 之前在Windows下用Apache时,也曾经配置过Awstats,然后换了工作,改用Linux+nginx,渐渐把Apache忘记了.又换了工作,又得用Apache,这回版本更新到2. ...

  3. windows下的volatility取证分析与讲解

    volatility(win64) 1.下载 volatility 下载地址:(我下载的版本2.6,并把名字稍微改了一下) Release Downloads | Volatility Foundat ...

  4. windows下安装php性能分析工具XHProf

    一.安装扩展 下载XHProf扩展:http://dev.freshsite.pl/php-extensions/xhprof.html 放入扩展文件:下载后解压出.dll文件,拷贝它到php的ext ...

  5. Windows下使用doxygen阅读和分析C/C++代码

    Windows下使用doxygen阅读和分析C/C++代码 转自:http://blog.sina.com.cn/s/blog_63d902570100gwk6.html 虽然使用各种IDE或者Sou ...

  6. QTimer源码分析(以Windows下实现为例)

    QTimer源码分析(以Windows下实现为例) 分类: Qt2011-04-13 21:32 5026人阅读 评论(0) 收藏 举报 windowstimerqtoptimizationcallb ...

  7. 深刻:截获windows的消息并分析实例(DefWindowProc),以WM_NCHITTEST举例(Windows下每一个鼠标消息都是由 WM_NCHITTEST 消息产生的,这个消息的参数包含了鼠标位置的信息)

    1,回调函数工作机制 回调函数由操作系统自动调用,回调函数的返回值当然也是返回给操作系统了. 2,截获操作系统发出的消息,截获到后,将另外一个消息返回给操作系统,已达到欺骗操作系统的目的. 下面还是以 ...

  8. 【已解决】Windows下 MySQL大小写敏感 解决方案及分析

    Windows下 MySQL大小写敏感配置 zoerywzhou@163.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2017-3-27 最近在window ...

  9. Windows下return,exit和ExitProcess的区别和分析

    通常,我们为了使自己的程序结束,会在主函数中使用return或调用exit().在windows下还有ExitProcess()和TerminateProcess()等函数. 本文的目的是比较以上几种 ...

随机推荐

  1. hdoj 1753 大明A+B 高精度/java

    大明A+B Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  2. Linux下生成随机密码(转)

    1.使用SHA算法来加密日期,并输出结果的前32个字符: date +%s |sha256sum |base64 |head -c 32 ;echo 生成结果如下: ZTNiMGM0NDI5OGZjM ...

  3. [Linux] tmux 终端复用命令行工具

    tmux 终端复用命令行工具 tmux 是一款终端复用命令行工具,通常用于 Terminal 的窗口管理.可以在终端软件重启后通过命令行恢复上次的 session. 安装运行 macOS 上使用 Ho ...

  4. CAN 总线通信控制芯片SJA1000 的读写

    SJA1000 控制信号的产生 CAN总线通信控制芯片SJA1000 没有提供单独的地址线,而使用可以与Intel 和Motorola系列微控制器兼容的分时复用地址/ 数据线.在一个读写周期内,微控制 ...

  5. java的(PO,VO,TO,BO,DAO,POJO)解释1

    java的(PO,VO,TO,BO,DAO,POJO)解释  O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定 ...

  6. %( $# > 1 %? if (tid() in trace) %) 是什么意思

    http://blog.csdn.net/sunnybeike/article/details/7769663 http://blog.163.com/digoal@126/blog/static/1 ...

  7. cocos2d-x 3.0 将cpp-tests编译成Android版本号APK文件

    cmd模式 进入到 E:\cocos2d-x-3.0rc1\cocos2d-x-3.0rc1\build 输入命令 android list targets 在输入: android-build.py ...

  8. 使用Redis实现抢购的一种思路(list队列实现)

    原文:https://my.oschina.net/chinaxy/blog/1829233 抢购是如今很常见的一个应用场景,主要需要解决的问题有两个: 1 高并发对数据库产生的压力 2 竞争状态下如 ...

  9. rman多通道全备份脚本

     run{ allocate channel d1 type disk; allocate channel d2 type disk; allocate channel d3 type disk; ...

  10. [Android Pro] activity-alias的使用

    activity-alias是android里为了重复使用Activity而设计的. 当在Activity的onCreate()方法里,执行getIntent().getComponent().get ...