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

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

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

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

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

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

windows 地址空间分配的更多相关文章

  1. 为什么地址空间分配粒度为64K?Why is address space allocation granularity 64K?

    您可能想知道为什么VirtualAlloc在64K边界分配内存,即使页面粒度为4K. 你有Alpha AXP处理器,感谢你. 在Alpha AXP上,没有“加载32位整数”指令.要加载32位整数,实际 ...

  2. windows地址转发

    netsh interface portproxy add v4tov4 listenport=8080 connectaddress=192.168.8.108 connectport=8080 把 ...

  3. [百度空间] [转]将程序移植到64位Windows

    from : http://goooder.bokee.com/2000373.html (雷立辉 整理) 简介:本文对如何将32位Windows程序平滑的支持和过渡到64位Windows操作系统做出 ...

  4. 【windows核心编程】 第六章 线程基础

    Windows核心编程 第六章 线程基础 欢迎转载 转载请注明出处:http://www.cnblogs.com/cuish/p/3145214.html 1. 线程的组成 ①    一个是线程的内核 ...

  5. Windows API 之 VirtualAlloc

    Reserves, commits, or changes the state of a region of pages in the virtual address space of the cal ...

  6. Windows Internals 笔记——线程

    1.进程有两个组成部分,一个进程内核对象和一个地址空间.线程也有两个组成部分: 一个是线程的内核对象,操作系统用它管理线程.系统还用内核对象来存放线程统计信息的地方. 一个线程栈,用于维护线程执行时所 ...

  7. 《windows核心编程系列》十九谈谈使用远程线程来注入DLL。

    windows内的各个进程有各自的地址空间.它们相互独立互不干扰保证了系统的安全性.但是windows也为调试器或是其他工具设计了一些函数,这些函数可以让一个进程对另一个进程进行操作.虽然他们是为调试 ...

  8. IPv6笔记-地址结构与分类

    1.地址基础 IPv6地址由被划分为8个16位块的128位组成. 然后将每个块转换为由冒号符号分隔的4位十六进制数字. 2001::3238:00E1:0063:0000:0000:FEFB 每一块多 ...

  9. Linux 与 Linux Windows 文件共享 小知识

    Linux 与 Linux Windows 文件共享   前提说明:windows主机信息:192.168.1.100 帐号:abc 密码:123 共享文件夹:sharelinux主机信息:192.1 ...

随机推荐

  1. p1349星屑幻想

    这道题的原题目我也不知道是什么. 大致题意是有一个图,有些点的权值已确定,要求你确定其他点的权值使所有边两个点的权值的xor和最小,输出所有点的最终权值,输出有spj: 解法是最小割,由于题目要求的使 ...

  2. Zju1290 Word-Search Wonder(http://begin.lydsy.com/JudgeOnline/problem.php?id=2768)

    2768: Zju1290 Word-Search Wonder Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 4  Solved: 2[Submit] ...

  3. jquery textarea输入字符字数提示

    效果: html代码: <textarea id="assayInfo" name="assayInfo" rows="3" cols ...

  4. iOS 之 时间格式与字符串转换

    这个知识点涉及到三个类:NSDate.NSString,另外是一个最重要的类NSDateFormatter.它起到格式转换的作用,至于方法查看头文件就好了.时间格式注意下:yyyyMMddHHmmss

  5. javac不是内部或外部命令

    1.描述 在命令行输入javac,提示“不是内部或外部命令”. 2.解决过程 2.1.解决方案一 2.1.1.检查并添加环境变量 通常就是这个原因导致. 2.1.2.过程一 确实还是环境变量没有写对. ...

  6. Delphi中String类型原理介绍

    Delphi中字符串的操作很简单,但幕后情况却相当复杂.Pascal传统的字符串操作方法与Windows不同,Windows吸取了C语言的字符串操作方法.32位Delphi中增加了长字符串类型,该类型 ...

  7. oracle存储过程的基本语法

    1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字(    参数1 IN NUMBER,    参数2 IN NUMBER) IS变量1 INTEGER :=0;变量2 ...

  8. Flex 各种校验

    Flex 各种校验: 参考:http://blog.csdn.net/jerry_bj/article/details/5650469 参考正则表达式:http://www.cnblogs.com/f ...

  9. Flex timer使用 keydown事件注册到stage

    Flex timer使用 keydown事件注册到stage: <?xml version="1.0" encoding="utf-8"?> < ...

  10. jQuery trigger one用法

    jQuery trigger one用法: <%@ page language="java" import="java.util.*" pageEncod ...