《Windowss核心编程》之八 - Windows内存结构

1.地址空间中的区域:

        当进程创建并被分配空间时,该可用的地址空间主体是空闲的,即未分配。要使用空间,可以用VirtualAlloc函数来分配它的各个区域。Windows分配有个粒度边界,系统是以64KB这个粒度来进行分配区域的。

        另外,系统管理内存也有一个单位粒度,也就是经常提到的页面,页面的大小在X86中为4KB,在操作系统的虚拟内存中,有页面置换功能(即把硬盘(虚拟内存)的数据调入内存),就是以页面为单位来执行的。

        比如:如果想保留一个10 KB的地址空间区域,系统将自动对你的请求进行四舍五入,使保留的地址空间区域的大小是页面大小的倍数。这意味着,在x 8 6平台上,系统将保留一个1 2 K B的区域

         当不再需要空间区域,只需用VirtualFree函数释放。



2.物理存储器与页文件:

            进程中的线程访问它的地址空间中的数据块时,会发生两种情形:

            在第一种情况中,线程试图访问的数据是在R A M中。在这种情况下, C P U将数据的虚拟内存地址映射到内存的物理地址中,然后执行需要的访问。 
            在第二种情况中,线程试图访问的数据不在R A M中,而是存放在页文件中的某个地方。这时,试图访问就称为页面失效, C P U将把试图进行的访问通知操作系统。这时操作系统就寻找R A M中的一个内存空页。如果找不到空页,系统必须释放一个空页。如果一个页面尚未被修改,系统就可以释放该页面。但是,如果系统需要释放一个已经修改的页面,那么它必须首先将该页面从R A M拷贝到页交换文件中,然后系统进入该页文件,找出需要访问的数据块,并将数据加载到空闲的内存页面。然后,操作系统更新它的用于指明数据的虚拟内存地址现在已经映射到R A M中的相应的物理存储器地址中的表。这时C P U重新运行生成初始页面失效的指令,但是这次C P U能够将虚拟内存地址映射到一个物理R A M地址,并访问该数据块。
        
           

posted @ 2005-09-06 17:14  shipfi  阅读(627)  评论(0编辑  收藏  举报