主题:windows 下编程问题????
wenwen227
[专家分:0] 发布于 2006-01-03 11:25:00
计算机资源的分配是以进程为单位的(CPU是以线程的),现在就想问问Windows下一个进程创建后,分配给他的内存资源是多少?个是什么类型的?
我所知道为:
内存有三种形式: 1.虚拟内存 2.文件映射 3 堆栈
假设一个程序1.5K,(MASM32中一个例子,叫smallwin),他很小,文件对齐粒度为512字节,结构为:PE头512字节,代码即.text 512字节,全局变量 .rdata 512字节,当一个进程创建时,内存对齐粒度为:4K,这样映射大小应该为:12K,在加上默认的1M 堆,1M栈,这个进程占内存应该为:2060K,而实际大小用任务管理器可以看到,比这个大很多,希望高手指点一下...
在Windowvs 下一个进程创建后(还没有运行),系统给他分配的默认内存资源是多少??????
回复列表 (共5个回复)
沙发
vrace [专家分:3590] 发布于 2006-01-03 14:50:00
不知道
不过感觉应该是 PCB 块的尺寸+默认堆栈的尺寸
对于那个 smallwin, 虽然程序只有1.5k, 但是它在执行中创建的 Handle 这些不需要内存?
板凳
wenwen227 [专家分:0] 发布于 2006-01-03 16:22:00
我们有任务管理器看到的进程内存,包括在系统内核里的内存吗?如PCB,内存对象等等
高手指点!!!!
还有在调试时,装入程序,还没有运行,这时进程已经创建,那的内存应该是系统默认分配的内存,他有几个部分组成。。。
help me!!!
3 楼
fresher [专家分:730] 发布于 2006-01-03 21:35:00
理论上,系统分配给进程的内存大小为:4GB。具体的起始位置、终了位置区清楚。
4 楼
aboutbmp [专家分:830] 发布于 2006-01-04 00:10:00
smallwin这个程序需要调windows的API来创建窗口的吧, 还要给窗口主线程生成消息队列什么的, 这些都要消耗资源的啊. 调用的API内部消耗内存的操作是我们不清楚的.
再说一个, 窗口绘制的操作也是windows完成的, 这个动作肯定也要消耗内存的. 这和以前DOS下的汇编绘图直接控制象素点然后调中断可差别很大.
像楼上说的, 系统分配给进程2G空间, 而不是固定分配给多少内存, 进程想用多少就给它多少, 内存不够了就用虚拟内存.
5 楼
jhkdiy [专家分:1620] 发布于 2006-01-04 21:49:00
应用环境:WinXp,Win2K
程序原来运行占用11M内存,用动态创建窗口的方法只能减少不到10m,应用此方法后内存占用只有600K左右。
具体方法是:
把下面的过程放到一个Timer中,每隔一段时间执行一次,如5秒。
{
**************
* Clear Memory
**************
}
procedure ClearMemory;
begin
if Win32Platform = VER_PLATFORM_WIN32_NT then
begin
SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);
Application.ProcessMessages;
end;
end;
我用Win32Asm试了,原来占用 1423K 内存。用该方法后只占用 174k 。呵呵。我再补充一下吧,关键是API函数SetProcessWorkingSetSize(),以下是MSDN的说明:
The SetProcessWorkingSetSize function sets the minimum and maximum working set sizes for the specified process.
The working set of a process is the set of memory pages currently visible to the process in physical RAM memory. These pages are resident and available for an application to use without triggering a page fault. The size of the working set of a process is specified in bytes. The minimum and maximum working set sizes affect the virtual memory paging behavior of a process.
BOOL SetProcessWorkingSetSize(
HANDLE hProcess, // handle to process
SIZE_T dwMinimumWorkingSetSize, // minimum working set size
SIZE_T dwMaximumWorkingSetSize // maximum working set size
);
If both dwMinimumWorkingSetSize and dwMaximumWorkingSetSize have the value -1, the function temporarily trims the working set of the specified process to zero. This essentially swaps the process out of physical RAM memory.
我来回复