我们知道每个Windows进程都拥有4G的地址空间,但是你的机器显然没有4G的物理内存。
在多任务环境下,所有进程使用的内存总和可以超过计算机的物理内存。
在特定的情况下,进程的一部分可能会从物理内存中删除而被暂存在硬盘的文件里(pagefile),当进程试图访问这些被交换到pagefile里的内存的时候,系统会产生一个缺页中断(page fault),这时候Windows内存管理器会负责把对应的内存页重新从硬盘调入物理内存。
注意:
1)在某个时间内,一个进程可以直接访问到的物理内存(不发生缺页中断)叫做这个进程的Working Set;
2)而一个进程从4G的地址空间当中实际分配(commit)了的、可访问的内存称为Committed Virtual Memory。
3)Committed VM可能存在于Page File当中,WorkingSet则一定位于物理内存。
Mem Usage这个名字多少有些误导。它只表示这个进程当前占用的物理内存,也就是WorkingSet。WorkingSet不表示进程当前“占用”的所有虚拟内存,该进程可能还有一部分数据被交换到pagefile当中。这些数据只有在被访问的时候才会被加载到物理内存。
Task Manager有另一列数据:VM Size,表示了一个进程分配的虚存(Committed Visual Memory)—实际的定义要比这个复杂一些,但我们可以暂时看成“一个进程分配的虚存”。
当一个Windows程序被最小化的时候,Windows内存管理器把该进程的WorkingSet减到最小(根据先进先出FIFO或者最近最少使用LRU),把大部分数据交换到pagefile里。
这很容易理解:我们通常总是希望为前台的应用程序留出更多物理内存,从而具有更好的性能。当该程序从最小化恢复的时候,Windows也不会完全加载程序的所有虚存,只是加载了必要的部分。这也很容易理解:程序启动阶段的代码通常在启动之后很少访问(对.NET程序尤其如此,向fusion这样的模块在程序正常加载之后如果没有用到Reflection通常用不到)。
但是在虚存的问题上却没这么简单。如果WorkingSet太小,程序运行过程中会产生很多缺页中断,这会严重影响程序的性能。另一方面,WorkingSet太大会浪费“宝贵的”物理内存,降低整个系统的性能。
通常情况下(除非是对性能非常敏感的应用程序,并且你对Windows的内存管理了如指掌),建议不要在程序中自己调整WorkingSet的大小,而把这个任务交给Windows内存管理器
我们知道DLL的一个特点是代码共享,以NTDLL.DLL为例,整个Windows系统的几乎所有应用程序(具体地说,Win32子系统的所有程序)都需要引用NTDLL.DLL,如果每人一份,光这个文件就的占用几十兆内存。
Windows地解决办法是只在物理内存中保存一份NTDLL.DLL的COPY,所有引用这个DLL的程序都把这一份COPY映射到自己的内存空间里面,共享NTDLL.DLL的代码段(每个进程的数据段仍然是独立的)。
所以虽然NTDLL.DLL的大小被计算在你的程序的WorkingSet里面,但是从你的程序中去掉对这个DLL的引用并不会真的释放多少物理内存——你不用,别人还在用呢!
所以,你的程序“独占”的物理内存远没有Mem Usage所表示的那么多,需要从Mem Usage里面扣除很多Shared Code Page (vadump里面可以看到)。
重要结论:
不要参考Task Manager的Mem Usage数据,那个数据的大小对程序性能没有直接影响。
分享到:
相关推荐
- **内存管理子系统**:详细解释了Windows如何管理和分配内存资源,包括物理内存管理、虚拟内存管理等。 - **缓存管理器**:分析了Windows如何使用缓存来提高数据访问效率。 - **文件系统**:讨论了Windows支持的...
1. **利用VxD和VMM**:Windows 95/98操作系统使用了虚拟设备驱动(VxD)和虚拟内存管理器(VMM)来处理物理内存的映射。CIH病毒利用了VxD中的一个API——`VMM_MapPhysToLinear`来实现物理地址到线性地址的转换。 2. **...
由于内存资源有限,操作系统使用虚拟内存技术,将不常用的数据存储到磁盘上。当需要访问的数据不在内存时,就需要选择一个页面进行替换。常见的页面置换算法有:最佳(Optimal)、先进先出(FIFO)、最近最少使用(LRU)和...
内存扫描原理是计算机科学中的一个重要概念,特别是在操作系统和软件开发领域。它涉及到如何在计算机的物理内存中查找特定的数据或模式。以下是对“内存扫描原理”这一主题的深入解析,基于给定的文件信息。 ### ...
通用操作系统普遍采用虚拟内存管理技术,通过页表和地址转换等机制实现物理内存和虚拟地址空间之间的映射。虽然这种机制提高了内存的利用率和程序的灵活性,但也可能引入额外的延迟,特别是在进行页置换操作时。此外...
为了确保操作系统和用户进程之间的安全隔离,Windows将进程的地址空间划分为几个不同的区域: - **NULL指针分区**:范围从`0x00000000`至`0x0000FFFF`,主要用于保护内存免受非法访问。例如,在内存分配失败时返回...
在32位系统中,操作系统提供了一个4GB的虚拟地址空间,使得程序可以访问整个地址空间,而不必关心物理内存的实际大小。 - **进程的内存空间**在Windows中进一步细分为用户内存空间和内核内存空间。通常,32位系统将...
在Windows CE中,内存管理的主要目的是屏蔽硬件地址,为应用程序和内核程序提供各自2GB(总共4GB)的虚拟内存地址空间。借助MMU(Memory Management Unit)硬件的支持,操作系统能够实现虚拟地址到物理地址的多对一...
#### 一、虚拟内存原理简介 **虚拟内存**是一种内存管理技术,其核心思想是在物理内存不足时,将暂时不使用的程序或数据存放到硬盘上的虚拟空间中,以便为新的程序腾出空间。这一过程涉及操作系统将部分内存中的...
Windows内核是微软Windows操作系统的核心组件之一,负责管理系统的内存、进程、安全等核心功能。它为用户空间的应用程序提供了一个抽象的运行环境,并通过一系列API(应用程序编程接口)与硬件交互。Windows内核的...
通过对这两个实验报告文档的详细阅读和分析,学生可以深入理解Windows操作系统的内部工作原理,同时提高问题解决能力和动手实践能力。这样的实验不仅巩固了课堂上的理论知识,还为将来从事相关领域的专业工作奠定了...
了解操作系统的基本原理和技术对于深入理解计算机工作原理以及开发高效的软件系统具有重要意义。挪威奥斯洛大学学院提供的操作系统入门讲义是一个很好的学习资源,有兴趣的朋友可以通过提供的链接进行深入学习。 --...
- **虚拟内存管理**:理解虚拟内存如何映射到物理内存以及分页机制的工作原理。 - **堆管理器**:分析Windows 2000中用于动态内存分配的核心组件——堆管理器的设计思路。 #### 文件系统 - **NTFS文件系统**:深入...
书中详细分析了虚拟内存管理器的工作原理,包括分页、页面调度算法、物理内存分配策略等内容。 4. **文件系统**:探讨了NTFS文件系统的内部实现细节,包括元数据管理、事务日志记录、压缩与加密等功能。同时,还...
2. Windows 2000/XP 的内存管理机制:Windows 2000/XP 的内存管理机制主要包括虚拟内存管理和物理内存管理两部分。 3. 页式虚拟存储技术:页式虚拟存储技术是一种将虚拟内存分割成固定大小的页的方法,程序可以申请...
本章总结了Windows操作系统架构的关键特性,并强调了它们对于理解Windows内部工作原理的重要性。 #### 三、系统机制 第三章详细介绍了Windows内部的一些核心机制,包括陷阱分发、对象管理、同步机制等。 ##### ...