GlobalAlloc函数GMEM_ZEROINIT参数的疑问

sunchaohuang 2010-01-27 05:44:43
invoke GlobalAlloc,GPTR,1000000 API中GMEM_ZEROINIT表示需要将内存块中的所有字节预先初始化为0
系统似乎不给GlobalAlloc申请的内存分配空间,他只在自己那2G的线性地址中分配给自己如果产生碎片对系统也没影响,对GlobalAlloc函数申请的内存空间中的数据预先初始化为0似乎是个假象。当给GlobalAlloc返回的指针赋值后才在物理内存中写入数据,并且物理内存中所存放的数据并不是当前进程独享的,在系统内存不够用的时候很有可能被丢到交换文件中。


GPTR 标识 为GMEM_FIXED和GMEM_ZEROINIT组合.
...全文
269 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunchaohuang 2010-01-28
  • 打赏
  • 举报
回复
invoke GlobalAlloc,GPTR,1000000
mov @lpLastMem,eax
xor eax,eax
mov edi,@lpLastMem
mov ecx,1000000
cld
rep stosb

循环分配数据大概1500次后该进程挂掉,系统会将其他进程中的数据丢到交换文件中,当该进程所占用的内存被释放后,在打开其他进程如IE、文本编辑器等发现页面刷新很慢,估计是从交换文件中提取数据到物理内存中。

请问如何修改该代码可将该进程产生的数据(已经在内存中的大概1.5G的数据)放入交换文件当需要时在取出。从而保证系统中的其他进程(不出现卡的现象)能够正常运行。
sunchaohuang 2010-01-27
  • 打赏
  • 举报
回复
可能WINDOWS和LINUX处理是一样的,等真正用的时候在分配页,然后在建立页映射,而操作系统内核却可以直接响应获取内存
IcyPlayer 2010-01-27
  • 打赏
  • 举报
回复
#include <Windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
void *p = GlobalAlloc(GPTR, 100);
return 0;
}


没发现什么问题

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧