12、Windows API 内存管理(2)

简介: 4、进程的内存空间 1)进程虚拟地址空间的实现     Windows系统中每个进程都有一个私有的虚拟地址空间,系统需要将每个进程的虚拟地址都映射到物理内存地址上。为了实现系统中每个进程都有一个私有的虚拟地址空间,系统为每一个进程都创建一个页目录( Directory)和一组页表。

4、进程的内存空间<?xml:namespace prefix = o />

1)进程虚拟地址空间的实现

    Windows系统中每个进程都有一个私有的虚拟地址空间,系统需要将每个进程的虚拟地址都映射到物理内存地址上。为了实现系统中每个进程都有一个私有的虚拟地址空间,系统为每一个进程都创建一个页目录( Directory)和一组页表。每个进程的页表是独立的,而内核空间的页表是所有进程共享的。

   在x86平台上,CR3寄存器标识了页目录所在的物理地址。Windows系统上的第一个进程都有独立的页目录,因此系统运行时,CR3寄存器中保存的页目录地址是会变化的,其值为当前运行的进程的页目录地址。当系统要进行进程切换时,会将CR3寄存器中保存的页目录地址设置为将要切换过去并开始运行的进程的页目录地址。Windows平台的每一个进程都有一个KPROCESS结构的数据块,其中包括了其进程页目录的地址。

2数据共享与保护

    有一些进程间共享的数据、系统的可执行代码(系统DLL)等,在各个进程间都是一致的,因此没有必要在物理内存中为这些数据保存多份,不同进程的虚拟内存分页可以映射为同样的物理内存分页,这样可以节省物理内存的使用。

    同时,为了保证这种在映射到相同物理内存页上的内存分页在进程上仍然是私有的,系统还提供了一些保护机制。如果某个进程将某个系统DLL加载入进程内存空间以后,对该DLL中的数据进行了写操作,系统就会监视到该操作,并在数据写入之前,将要写入的进程虚拟内存分页映射到另一个新的物理分页,并将原分页中系统DLL的内容复制到这个分页中,进程间不共享这个新物理内存分页,最后进程完成写操作,将数据写入这个新分页中。这种对内存中系统DLL数据的写入操作不会影响到其他进程,因此保护了各个进程中数据的独立性,这种机制叫Copy-On-Write。如果系统确实需要在进程间共享数据,也可以对特定的页面不使用Copy-On-Write。

wps_clip_image-5480wps_clip_image-426

3)注意点

    开发人员只需要了解以下内容。

(1)虚拟地址空间中的数据是分页管理的。

(2)应用程序不用考虑系统中其他应用程序的内存使用情况,如占用了多少内存、占用了哪些内存等。

(3)虚拟地址并不是物理地址空间中的地址,不是数据在内存中真实存在的地址,操作系统会将进程的虚拟地址映射到真实的物理内存的地址。

(4)进程也不用考虑真实的物理内存有多大,只需要了解可以使用2GB(一般情况下)的内存,操作系统负责转换。

(5)如果系统中没有足够的物理内存供使用,那么操作系统会将当前没有使用的内存分页“调度”到硬盘上保存起来。页面调度不会造成内存中的数据在虚拟地址空间中地址的改变,所以进程不需要知道内存分页是如何调度的,不需要知道内存中保存的数据是在内存中还是在硬盘上,只需要知道其虚拟地址就可以了。

5、虚拟内存布局、内存的分工

    进程的虚拟内存空间分为两个部分,低2GB(或3GB)由应用程序使用,高2GB(或1GB)由系统内核程序使用。

    系统内核的内存空间中包括驱动程序,系统内核可执行程序、用于内存管理的数据结构(页目录、页表等),用于进程管理、线程调度的数据结构、各种中断处理程序,系统缓存等。

    应用程序可使用的低地址空间中包括了应用程序的代码、数据(全局变量等)、系统和用户DLL的代码、各线程的栈、堆等。

    栈和堆是两种重要的内在管理形式。

    进程的每个线程都有自己的栈,栈与函数的调用、执行和返回及局部变量的保存相关,一般情况下,栈中保存着函数的参数、返回地址和局部变量,调用函数将参数入栈,调用指令将函数返回地址入栈,被调用函数负责保存调用函数的相关栈指针,为局部变量分配空间等,而堆是一种可以动态分配和释放的内存,由堆管理器进行管理,用户在程序中使用的内存分配函数都是通过堆进行分配的。

6、内存的保护属性和存取权限

系统为每个内存分页提供保护属性和存取权限,内存的保护属性和存取权限的最小单位是分页,同一个分页中的内存具有相同的保护属性和存取权限。用户地址空间中内存分页有多种保护属性和存取权限,如PAGE_EXECUTE等

http://msdn.microsoft.com/en-us/library/aa366786%28VS.85%29.aspx

7、相关API

wps_clip_image-12865

wps_clip_image-13077

wps_clip_image-24765

目录
相关文章
|
1月前
|
人工智能 测试技术 API
Windows用户必备:Postman v11详细安装指南与API测试入门教程(附官网下载
Postman是全球领先的API开发与测试工具,支持REST、SOAP、GraphQL等协议调试。2025年最新版v11新增AI智能生成测试用例、多环境变量同步等功能,适用于前后端分离开发、自动化测试、接口文档自动生成及团队协作共享API资源。本文详细介绍Postman的软件定位、核心功能、安装步骤、首次配置、基础使用及常见问题解答,帮助用户快速上手并高效利用该工具进行API开发与测试。
|
5月前
|
C# Windows
【Azure App Service】在App Service for Windows上验证能占用的内存最大值
根据以上测验,当使用App Service内存没有达到预期的值,且应用异常日志出现OutOfMemory时,就需要检查Platform的设置是否位64bit。
87 11
|
6月前
|
弹性计算 关系型数据库 数据安全/隐私保护
阿里云国际版如何配置Windows服务器的虚拟内存
阿里云国际版如何配置Windows服务器的虚拟内存
|
6月前
|
开发框架 .NET API
Windows Forms应用程序中集成一个ASP.NET API服务
Windows Forms应用程序中集成一个ASP.NET API服务
142 9
|
6月前
|
C# 开发工具 Windows
C# 获取Windows系统信息以及CPU、内存和磁盘使用情况
C# 获取Windows系统信息以及CPU、内存和磁盘使用情况
158 0
|
6月前
|
程序员 Windows
程序员必备文件搜索工具 Everything 带安装包!!! 比windows自带的文件搜索快几百倍!!! 超级好用的文件搜索工具,仅几兆,不占内存,打开即用
文章推荐了程序员必备的文件搜索工具Everything,并提供了安装包下载链接,强调其比Windows自带搜索快且占用内存少。
156 0
|
7月前
|
网络协议 API Windows
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
|
7月前
|
监控 Java 大数据
【Java内存管理新突破】JDK 22:细粒度内存管理API,精准控制每一块内存!
【9月更文挑战第9天】虽然目前JDK 22的确切内容尚未公布,但我们可以根据Java语言的发展趋势和社区的需求,预测细粒度内存管理API可能成为未来Java内存管理领域的新突破。这套API将为开发者提供前所未有的内存控制能力,助力Java应用在更多领域发挥更大作用。我们期待JDK 22的发布,期待Java语言在内存管理领域的持续创新和发展。
|
9月前
|
XML Ubuntu Linux
部署08---扩展-Win10配置WSL(Ubuntu)环境,WSL系统是什么意思,是Windows系统上的一个子系统, xml的一大特点是直链系统,直接链接你的CPU,硬盘和内存,如何用 WSL部署
部署08---扩展-Win10配置WSL(Ubuntu)环境,WSL系统是什么意思,是Windows系统上的一个子系统, xml的一大特点是直链系统,直接链接你的CPU,硬盘和内存,如何用 WSL部署
|
10月前
|
网络安全 Windows
windows Windows Defender彻底删除屏蔽后台启动占用内存 win10防火墙 windows10防火墙
windows Windows Defender彻底删除屏蔽后台启动占用内存 win10防火墙 windows10防火墙
143 0

热门文章

最新文章