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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. [转]用Middleware给ASP.NET Core Web API添加自己的授权验证
  2. Autofac 同时支持MVC 与Webapi
  3. 解决:HTML中多文本域(textarea)回车后数据存入数据库,EL表达式取出异常。
  4. express创建项目
  5. 解决:Detected memory leaks
  6. Python Paramiko模块安装和使用
  7. 学习KnockOut第三篇之List
  8. tuxedo入门
  9. Oracle11g数据库导入到oracle10g的解决方法
  10. Callback函数详解(我感觉,回掉函数的本质是函数指针,在业务做循环处理的时候,调用一下通知外部)
  11. Scrapy框架安装配置小结
  12. AtomicInteger相关类
  13. Android实现系统ROOT, 并能赋予app root权限
  14. js点击出现二级菜单,点击二级菜单主菜单换成二级菜单
  15. Servlet--HttpServlet实现doGet和doPost请求的原理
  16. win10 64 + VS2010 + Opencv 2.4.9 + HIKVISION(海康)
  17. Python爬虫之selenium的使用(八)
  18. redis的数据类型命令
  19. P5091 【模板】欧拉定理
  20. Win7查看开关机记录

热门文章

  1. poj 3660 Cow Contest Flyod
  2. Jmeter学习之— 参数化、关联、断言、数据库的操作
  3. 读书笔记_Effective_C++_条款三十五:考虑virtual函数以外的其他选择
  4. SpringMVC 方法参数设置
  5. 利用Everything开启http服务测试移动端浏览器环境
  6. Spring Boot项目的Logback配置文件使用yaml格式
  7. 如何设置Android手机的sqlite3命令环境
  8. mysql 审计插件编写
  9. ajax访问遇到Session失效问题
  10. springboot2.X 在项目启动后执行一段自定义代码