第13章Windows内存体系架构下

1、物理存储与页文件

在以前的操作系统中,物理存储被认为是你机器上拥有RAM的数量。换句话说,如果你机器上有16MB的RAM,你能够加载和运行的程序最多使用16MB的RAM。目前的操作系统已经使硬盘空间看起来像内存。在硬盘中的文件被称作页文件它包含可供所有进程使用的虚拟内存。
操作系统与CPU合作存储存储部分RAM到页文件和加载部分页文件(运行的程序需要的)到RAM,最好把物理存储当做存储在硬盘中的页文件中的数据。因此当应用程序调用VirtualAlloc函数提交物理存储到内存空间的预留区时,地址空间实际上是从硬盘上的一个文件中进行分配。
物理存储与页文件
注意:虚拟内存和页文件:
虚拟内存别称虚拟存储器(Virtual Memory)。电脑中所运行的程序均需经由内存执行,若执行的程序占用内存很大 或很多,则会导致内存消耗殆尽。为解决该问题,Windows运用了虚拟内存技术,即匀出一部分硬盘空间来充当内存使用。当内存耗尽时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。若计算机运行程序或操作所需的随机存储器(RAM)不足时,则 Windows 会用虚拟存储器进行补偿。它将计算机的RAM和硬盘上的临时空间组合。当RAM运行速率缓慢时,它便将数据从RAM移动到称为“分页文件”的空间中。将数据移入分页文件可释放RAM,以便完成工作。 一般而言,计算机的RAM容量越大,程序运行得越快。若计算机的速率由于RAM可用空间匮乏而减缓,则可尝试通过增加虚拟内存来进行补偿。但是,计算机从RAM读取数据的速率要比从硬盘读取数据的速率快,因而扩增RAM容量(可加内存条)是最佳选择。
虚拟内存是Windows 为作为内存使用的一部分硬盘空间。虚拟内存在硬盘上其实就是为一个硕大无比的文件,文件名是PageFile.Sys,通常状态下是看不到的。必须关闭资源管理器对系统文件的保护功能才能看到这个文件。虚拟内存有时候也被称为是“页面文件”就是从这个文件的文件名中来的。
页面文件是指操作系统用来虚拟内存的硬盘空间。
页面文件,也称交换文件,俗称虚拟内存,是计算机硬盘上的一个文件,通常是C:\pagefile.sys,并且具有系统和隐藏属性,在Windows资源管理器默认设置下不会显示。
这里写图片描述
在计算机运行时,会把文件、程序和其他数据存放在RAM(内存)中。内存的速度比硬盘快得多。
程序也会把正在处理的数据存放在内存里。比如,浏览网页时,浏览器会下载网页并把加载进内存里。在观看视频时,视频也会被加载进内存。在内存快被占满时,Windows会把其中的一部分数据移出来,存放在硬盘上的页面文件(虚拟内存)中。
在硬盘上的页面文件中写入这些数据比操作内存慢得多,但这是必需的——如果随便就把内存中的数据丢弃掉,可能会导致程序崩溃或者系统不稳定。

当启动一个应用程序的时候,系统将打开该应用程序的.exe文件,确定该应用程序的代码和数据的大小。然后系统保留一个地址空间的区域,并指明与该区域相关联的物理存储器是在.exe文件本身中。这是正确的,不是使用页文件分配空间,系统使用.exe文件的实际的内容或者影像来作为程序地址空间的预留区域。当然,这将使得加载应用程序非常快,并使得页文件能够保持非常的小。
当硬盘上的一个程序的文件映像(这是个.exe文件或者.DLL文件)用作地址空间区域的物理存储器时,它称为内存映射文件。 当一个.exe文件或者DLL文件被加载时,系统将自动保留一个地址空间区域,并将该文件映像映射到该区域中。但是,系统也提供了一组函数,使你能够将数据文件映射到一个地址空间的区域中。

2、保护属性

已经被分配物理存储的单独的页可以被赋予不同的保护属性,保护属性即下列:

页面属性

  • 写时复制访问:上表列出的保护属性非常容易理解,不过最后两个属性需要作一些说明,一个是:PAGE_WRITECOPY,另一个PAGE_EXECUTE_WRITECOPY。这两个属性的作用是为了节省RAM的使用量和页文件的空间。Windows支持一种机制,使得两个或者多个进程能够共享单个内存块。因此,如果10个Notepad实例正在运行,那么所有实例可以共享应用程序的代码和数据页面。让所有实例共享同样的内存页面将能够大大提高系统的性能,但是这要求所有实例都将该内存视为只读或者只执行的内存。如果一个实例中的线程将数据写入内存修改它,那么其他实例看到的这个内存也将被修改,从而造成一片混乱。
    为了防止出现这种混乱,操作系统给共享内存块赋予了Copy-On-Write保护属性。当一个.exe或DLL模块被映射到一个内存地址时,系统将计算有多少页面是可以写入的(通常包含代码的页面标为PAGE_EXECUTE_READ,而包含数据的页面则标为PAGE_READWRITE)。然后,系统从页文件中分配内存,以容纳这些可写入的页面的需要。除非该模块的可写入页实际被写入,否则的话该页文件存储不会被使用。
    ①系统在内存中找到一个空闲页面。注意,该空闲页被支持从页文件之中被已分配的一个页。它是系统最初将模块映射到进程的地址空间时分配的。由于是第1次映射时就分配了所需的页交换文件空间。所以这步不可能失败。
    ②系统将要修改的页面内容复制到第1步找到的空闲页面,然后给这些空闲页面指定PAGE_READWRITE或PAGE_EXECUTE_READWRITE属性。(注意系统不会修改原始页面的保护属性和数据)
    ③然后系统更新进程的页面表,这样,原来的虚拟地址现在就对应到内存中一个新的页面了。以后进程就可以访问它自己的副本了。
    在预订地址空间或提交物理存储器时,不能使用PAGE_WRITECOPY或PAGE_EXECUTE_WRITECOPY保护属性,否则VirtualAlloc会失败,GetLastError将返回ERROR_INVALID_PARAMETER。

3、数据对齐的重要性

数据对齐并不是操作系统的内存结构的一部分,而是CPU结构的一部分。当CPU访问正确的对齐的数据时,它的运行效率最高。
数据对齐:当数据的内存地址模上数据大小结果为0时,则数据对齐。将数据的地址 % 数据大小 = 0时的数据是对齐的;
例如,一个WORD值的内存地址能够能被2除,一个DWORD值得内存地址能够被4除等等。当CPU试图读取的数据值没有正确对齐时,CPU要么可以产生一个异常,要么可以执行多次对齐的内存访问以便完全读取非对齐数据值。
下例读取未对齐数据:

VOID SomeFunc(PVOID pvDataBuffer)
{
   //the first byte in the buffer is some byte of information
   char c=*(PBYTE)pvDataBuffer;
   //Increment past the first byte in the buffer
   pvDataBuffer=(PVOID)((PBYTE)pvDataBuffer +1);
   //byte 2-5 contain a double-word value
   DWORD dw=*(DWORD*)pvDataBuffer;
   //the line above raises a data misalignment exception on some CPUs
   ....
}

显然,如果CPU执行多次内存访问,应用程序的运行速度就会放慢。在最好的情况下,系统访问未对齐的数据所需要的时间将是访问对齐数据的时间的两倍,不过在有些情况下,访问时间可能更长。为了使应用程序获得最佳的运行性能,编写的代码必须使数据正确地对齐。

  • x86CPU操作数据对齐,x86CPU包含一个特殊的bit标志称作AC(alignment check)标志,它在EFLAGS寄存器中。缺省时,当CPU第一次通电工作时,该标志被设置为0。当该标志是0时, CPU能够自动执行它应该执行的操作,以便成功地访问未对齐的数据值。然而,如果该标志被设置为 1,每当系统试图访问未对齐的数据时,CPU就会发出一个INT 17H中断。 x 86的Windows从来不改变这个CPU标志位。因此,当应用程序在 x 86处理器上运行时,你根本看不到应用程序中出现数据未对齐
    的异常条件。
  • IA-64CPU,IA-64CPU不能自动更正未对齐数据的存取。相反的,当未对齐数据存取发生时,CPU会通知操作系统,Windows在决定是否应该抛出异常,因此当访问错位数据时,会抛出一个EXECPTION_DATATYPE_MISALIGNMENT异常,我们通用SetErrorMode函数并传为SEM_NOALIGNMENTFAULTEXCEPT标志,让系统自动修正数据错位的错误。(注意传入这个标志会影响进程中所有的线程,而且这个错误模式会被进程的子进程继承)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值