回 帖 发 新 帖 刷新版面

主题:windows 下编程问题????

计算机资源的分配是以进程为单位的(CPU是以线程的),现在就想问问Windows下一个进程创建后,分配给他的内存资源是多少?个是什么类型的?
我所知道为:
内存有三种形式: 1.虚拟内存 2.文件映射 3 堆栈
假设一个程序1.5K,(MASM32中一个例子,叫smallwin),他很小,文件对齐粒度为512字节,结构为:PE头512字节,代码即.text 512字节,全局变量 .rdata 512字节,当一个进程创建时,内存对齐粒度为:4K,这样映射大小应该为:12K,在加上默认的1M 堆,1M栈,这个进程占内存应该为:2060K,而实际大小用任务管理器可以看到,比这个大很多,希望高手指点一下...
在Windowvs 下一个进程创建后(还没有运行),系统给他分配的默认内存资源是多少??????

回复列表 (共5个回复)

沙发

不知道

不过感觉应该是 PCB 块的尺寸+默认堆栈的尺寸

对于那个 smallwin, 虽然程序只有1.5k, 但是它在执行中创建的 Handle 这些不需要内存?

板凳

我们有任务管理器看到的进程内存,包括在系统内核里的内存吗?如PCB,内存对象等等
高手指点!!!!
还有在调试时,装入程序,还没有运行,这时进程已经创建,那的内存应该是系统默认分配的内存,他有几个部分组成。。。
help me!!!

3 楼

理论上,系统分配给进程的内存大小为:4GB。具体的起始位置、终了位置区清楚。

4 楼

smallwin这个程序需要调windows的API来创建窗口的吧, 还要给窗口主线程生成消息队列什么的, 这些都要消耗资源的啊. 调用的API内部消耗内存的操作是我们不清楚的.
再说一个, 窗口绘制的操作也是windows完成的, 这个动作肯定也要消耗内存的. 这和以前DOS下的汇编绘图直接控制象素点然后调中断可差别很大.
像楼上说的, 系统分配给进程2G空间, 而不是固定分配给多少内存, 进程想用多少就给它多少, 内存不够了就用虚拟内存.

5 楼

应用环境: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.

我来回复

您尚未登录,请登录后再回复。点此登录或注册