zoukankan      html  css  js  c++  java
  • windows 地址空间分配

      

    当系统创建一个进程同时为其创建它地址空间时,此地址空间中大部分都是闲置的。为了使用这部分地址空间,我们必须调用VirtualAlloc来分配其中的区域。分配区域的操作被称为预定。
    当应用程序预定地址空间区域时,系统会确保预定的区域的起始地址正好是分配粒度的整数倍。分配粒度根据不同的平台而有所不同。现在所有的平台都是用相同的分配粒度。大小为64KB。
    而对于预定的地址空间的大小,系统会确保区域的大小正好是系统页面大小的整数倍。X86和x64系统使用的页面大小为4KB。
    如果应用程序预定一块大小为10KB的地址空间区域。那么系统会将该请求取整到页面大小的整数倍。在x86和x64系统中系统会预定一块大小为12KB的区域。
    当程序不再需要访问所预定的地址空间区域时,应该释放该区域可以调用VirtualFree函数来完成。

    调拨物理存储区
    前面预定的地址空间仅仅是标记此块空间已有人使用,其他程序不能再次预定此块区域。为了使用所预定的地址空间区域,我们还必须分配物理存储器,并将存储器映射到所预定的区域。这个过程叫做调拨物理存储器。
    可以通过调用VirtualAlloc来调拨物理存储器。物理存储器的调拨是以页面为单位来调拨的。并不需要为所有预定的区域都调拨物理空间。可以仅调拨需要使用的区域。调拨后程序就可以访问内存空间了。
    当程序不需要访问所预定的区域中已调拨的物理存储器,应该释放物理存储器。这个过程被称为撤销调拨物理存储器。这是通过调用VirtualFreee函数来完成。
    物理存储器和页交换文件
    如今的操作系统可以对磁盘进行虚化,来扩展内存,这部分区域被称为分页文件或页交换文件,其中包含虚拟内存,可用程序使用。

    内存和磁分页文件共同构成了总内存。

    页交换文件增大了应用程序可用内存的总量。实际上,这时操作系统与cpu分工协作,把内存中的一部分保存到页交换文件,并在应用程序的时候再将页交换文件中的对应部分载入内存。
    当应用程序调用VirtualAlloc函数来把物理存储器调拨给地址空间区域时,该空间实际上是从硬盘的页交换文件中得到的。
    为了能够使用虚拟内存,当线程试图访问存储器中的一个字节中,cpu必须知道该字节是在内存中还是在磁盘上。
    当线程试图访问所属进程地址空间中的一块区域时,有可能出现两种情况:
    一:要访问的区域就在内存中。此时cpu会把数据的虚拟地址映射到内存的物理地址,然后访问内存。
    二:不在内存中,而是位于页交换文件中。这次不成功的访问将会触发缺页中断。发生缺页中断时中断处理程序会在内存中找到一个闲置的页面,然后将数据从页交换文件复制到内存中。

    当用户执行一个程序时,系统会打开应用程序对应的exe文件。计算出应用程序的代码和数据的大小。然后系统会预定一块地址空间,并注明与该区域相关联的物理存储器就是exe文件本身。系统并没有从页交换文件中分配空间,而是将exe文件作为程序预定空间的后备存储器。这样一来,程序载入很快,页交换文件也可以保持在一个合理的大小。

    当一个程序位于硬盘上的文件映像作为地址空间区域对应的物理存储器时,我们称这个文件映像为内存映射文件。当载入一个dll或exe时,系统会自动预定地址空间并把文件映像映射到该区域。除此之外系统还允许我们手动将数据文件映射到地址空间。
    Windows可以使用多个页交换文件。如果多个页交换文件位于不同的物理硬盘上,那么系统就可以运行得更快。我们可以在设置页交换文件大小。

  • 相关阅读:
    ubuntu 安装 systemback
    嵌入式gdb远程调试
    pecl 安装 phpredis
    Linux服务器内存池技术是如何实现的
    统一登录的几种常用设计模式
    数据库并发控制
    抽取一部分服务端做BFF(Backend For Frontend服务于前端的后端)
    干货 | 质量保障新手段,携程回归测试平台实践 原创 Sedro 携程技术 2021-01-21
    服务端绘图
    中间件技术在百度云原生测试中的应用实践 原创 路由器 百度智能化测试 今天
  • 原文地址:https://www.cnblogs.com/wangsicongde/p/7599324.html
Copyright © 2011-2022 走看看