内存工作设置(工作集)、提交大小概念简述

本文介绍了Windows操作系统中关于内存管理的关键概念,包括工作集(Working Set)、专用工作集、提交大小等,并探讨了它们在任务管理器和相关工具中的表现。文章还讨论了内存优化的重点指标,并提醒了不恰当使用SetProcessWorkingSet和EmptyWorkingSet函数可能导致的性能影响。此外,推荐了VMMap工具用于深入分析内存使用情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内存工作设置(工作集)、提交大小概念简述

前言

Windows7的任务管理器(以中文版为例)里面"进程"Tab页的列里面跟内存相关的展示项有7项(分页池和非页面缓冲池跟内核内存有关,暂不讨论),做软件工程师多年,大家真的懂任务管理器中这些内存相关的列吗?譬如什么工作集,专用工作集等等,另外像其它的一些常用工具,譬如ProcessExplorer里面可能又是叫Working Set,Private Bytes。

另外像SetProcessWorkingSet,EmptyWorkingSet这些函数真的是洪水猛兽,完全不能使用吗?本文将简单讨论下这些问题,另外简单介绍下VMMap工具的使用。

<think>好的,用户现在想了解内存管理中专用工作集和共享工作集的区别和作用。首先,我需要回忆一下这两个术语的定义和它们在Windows内存管理中的角色。 根据之前用户提供的引用内容,专用工作集(WS Private)指的是进程独占的物理内存部分,而共享工作集(WS Shared)则是多个进程共享的内存部分,比如系统DLL或共享库。这可能涉及到内存使用效率的问题,因为共享内存可以减少重复加载相同资源的情况,节省物理内存。 接下来,我需要确认这两个概念的具体作用。专用工作集确保每个进程有自己的独立内存空间,避免相互干扰,提高稳定性。而共享工作集优化内存使用,允许不同进程共用相同的代码或数据,这在多进程环境中尤为重要。 用户可能还关心如何查看这些信息。任务管理器里的“内存专用工作集”和Process Explorer中的“WS Private”对应,而共享工作集可能需要通过工具如VMMap来查看。此外,用户之前提到获取专用工作集的数据和任务管理器显示的有差异,这可能涉及到API的使用问题,比如GetMemoryInfo可能没有直接提供专用工作集的数据,需要通过其他方式计算,比如用工作集总量减去共享部分。 需要解释清楚两者的区别,可能还需要举例说明,比如多个进程使用同一个DLL时,该DLL在物理内存中只有一份,属于共享工作集。而每个进程的堆栈和私有数据则属于专用工作集。 另外,用户可能在实际开发或系统优化中遇到问题,比如内存泄漏时,专用工作集的增长可能更值得关注,而共享工作集的波动可能反映系统资源的共用情况。同时,性能分析时需要区分这两部分,以准确评估进程的实际内存占用。 最后,要确保回答结构清晰,分点说明概念、区别、作用,并可能提供查看方法或工具的建议,帮助用户全面理解。</think>### 专用工作集与共享工作集的区别及作用 #### 1. **基本概念** - **专用工作集(Private Working Set)** 指进程独占的物理内存部分,其他进程无法直接访问。例如: - 进程堆栈、堆内存 - 私有数据(如全局变量、用户数据) 公式示例:若进程总工作集为 $W_{\text{total}}$,共享工作集为 $W_{\text{shared}}$,则专用工作集可表示为: $$W_{\text{private}} = W_{\text{total}} - W_{\text{shared}}$$ - **共享工作集(Shared Working Set)** 指多个进程共同使用的物理内存部分,例如: - 系统DLL(如`kernel32.dll`) - 内存映射文件(如共享库) - 图形渲染资源(如DirectX组件) #### 2. **核心区别** | 特性 | 专用工作集 | 共享工作集 | |---------------------|-----------------------------------|-----------------------------------| | **访问权限** | 仅当前进程可修改 | 多个进程可读取或映射到相同物理页 | | **内存释放时机** | 进程终止时自动释放 | 引用计数归零后由系统回收 | | **典型内容** | 私有数据、动态分配内存 | 系统资源、公共代码段 | | **对系统性能影响** | 高占用可能引发内存不足 | 减少重复加载,优化整体内存利用率 | #### 3. **实际作用** - **专用工作集** - 保障进程独立性,防止数据被意外篡改 - 直接影响进程的**稳定性**(如内存泄漏时$W_{\text{private}}$持续增长) - 示例:浏览器标签页的私有渲染数据[^2] - **共享工作集** - 提升内存使用效率(如100个进程共享同一DLL时,物理内存仅需1份拷贝) - 加速进程启动(避免重复加载系统资源) - 示例:多个Python进程共享`python39.dll`[^1] #### 4. **查看方法** - **工具对比** | 工具名称 | 专用工作集显示项 | 共享工作集显示项 | |-------------------|------------------|------------------| | 任务管理器 | 内存专用工作集) | 无直接显示 | | Process Explorer | WS Private | WS Shared | | VMMap | Private WS | Shareable WS | - **编程获取(C++示例)** ```cpp #include <windows.h> #include <psapi.h> void GetMemoryInfo(DWORD processID) { PROCESS_MEMORY_COUNTERS_EX pmc; if (GetProcessMemoryInfo(OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, processID), (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc))) { printf("专用工作集: %zu KB\n", pmc.PrivateUsage / 1024); // 共享工作集需通过其他API计算 } } ``` 注:共享工作集通常需通过`GetProcessMemoryInfo`结合`QueryWorkingSetEx`计算得到[^1]。 #### 5. **性能优化启示** - **专用工作集过大** - 检查内存泄漏(如未释放的堆分配) - 优化数据结构(如用指针共享代替副本复制) - **共享工作集异常** - 排查恶意DLL注入 - 评估共享资源使用效率(如是否过度依赖内存映射文件)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值