【转】windows任务管理器中的工作设置内存,内存专用工作集,提交大小详解

windows任务管理器中的工作设置内存,内存专用工作集,提交大小详解

各字段官方解释:

  • 提交:操作系统为进程保存的虚拟内存量;
  • 工作集:进程当前正在使用的物理内存量;
  • 可共享:进程当前使用的可与其他进程共享的物理内存量;
  • 专用:进程当前使用的不能被其他进程共享的物理内存量;
    在这里插入图片描述

对各字段的分析:

使用下面的代码进行测试

#include<windows.h>
 
#define UNIT_SIZE (1024 * 1024)
 
int main(int argc, char* argv[])
{
	PVOID bookMem = (PVOID)VirtualAlloc(NULL, 64 * UNIT_SIZE, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
	ZeroMemory(bookMem, 64 * UNIT_SIZE);
 
	HANDLE heap = HeapCreate(0, 64 * UNIT_SIZE, 1024 * UNIT_SIZE);
	PVOID heapMem = HeapAlloc(heap, HEAP_ZERO_MEMORY, 32 * UNIT_SIZE);
 
	char* p = (char *)malloc(64 * UNIT_SIZE);
 
 
	HeapFree(heap, 0, heapMem);
	HeapDestroy(heap);
	free(p);
	
	return 0;
}

首先时VirtualAlloc(…)函数使用MEM_REVERSE | MEM_COMMIT标志同时预定和调拨64MB的物理内存,但是注意,这里调拨的内存是从系统页交换文件进行调拨的,属于保存的虚拟内存,因此这个时候"提交"项的值会增长大概64MB左右。当进程真正使用这段内存的时候系统才会为其分配真正的物理内存,所以执行完ZeroMemory函数后其他三项的值才会增长,另外这里有一个关系是:工作集 = 可共享 + 专用。

VirtualAlloc、HeapAlloc、malloc和new的调用关系如下所示:
在这里插入图片描述

malloc和new都是c运行库中的函数, 当c库被加载进进程地址空间后会首先调用HeapCreate函数创建自建堆,malloc函数和new的调用底层调用了HeapAlloc,但是HeapAlloc也是在页交换文件中进行物理内存的调拨的,为什么malloc函数和new开辟内存的时候工作集的值会增加呢?这是因为malloc函数和new封装了内存初始化的过程,在初始化过程中系统的缺页中断就会导致开辟实际的物理内存了。

————————————————
版权声明:本文为CSDN博主「paradox_1_0」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/paradox_1_0/article/details/103514361

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值