如何让最小的程序占的资源最少-----100分求解

vc_asm 2007-05-07 05:22:39
我用另一个进程打开测试进程,在测试进程里只是等待一个信号,然后退出,请问如何能让这个进程占的资源最少?我想测系统可以最多开多少进程,在笔记本上测了下,不到160个,在台式机上测了下,没有超过3600个,我把汇编版和C++版的代码贴出来,希望高手指点,谢谢!

.386
.Model Flat, StdCall
Option Casemap :None ; 不区分大小写(对API与API常数无效)
;___________________________________________________________________________
Include kernel32.inc
IncludeLib kernel32.lib

.CODE
szName db "tp_Exit",0,0
START:
push esi
invoke OpenEvent,00100000h,0,offset szName
mov esi,eax
invoke WaitForSingleObject,esi,-1
invoke CloseHandle,esi
pop esi

invoke ExitProcess,0

END START
----------------------------------
#include "stdafx.h"

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
HANDLE heExit=OpenEventW(SYNCHRONIZE,FALSE,L"tp_Exit");
WaitForSingleObject(heExit,INFINITE);
CloseHandle(heExit);
return 0;
}
...全文
653 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
feimingbiao 2007-06-06
  • 打赏
  • 举报
回复
首先我假设你说的系统资源是指Memory。

你的汇编版已经是你能做到的最好的了,不可能再优化了(加上把Stack变小),你的程序不管怎么做,都需要装载Kernel32.dll and ntdll.dll。当然你还可以绕过Kernel32直接去叫Ntdll,但是不推荐。 c++版要包含CRT,占得更大了。

其实你这种情况不需要在乎太多,Memory Manager如果不够地方,可以把你Page Out。差不多就可以了。与其你自己优化,不如让系统给优化去。

还有,你CreateEvent之后请检查hExit的值,虽然WaitForSingleObject和CloseHandle替你检查INVALID_HANDLE_VALUE了,不过至少MSDN上没说他们替你检查了,养成好习惯。

还有你说你能开4030个线程?是指定/stack了以后吧?正常编译1M Stack,32系统你能用2G内存,就是全给你用也超不过2000啊?
vc_asm 2007-06-06
  • 打赏
  • 举报
回复
你CreateEvent之后请检查hExit的值,虽然WaitForSingleObject和CloseHandle替你检查INVALID_HANDLE_VALUE了,不过至少MSDN上没说他们替你检查了,养成好习惯。
----------------
RE:不用担心,我这个只是个例子,一个管理程序先创建成功了同步对象后再创建这个测试子进程的,所以不用担心子进程打不开对象的可能,即使有的话也已经是系统出错了,而助WaitF和CloseH不会抛出任何异常,也只会让统计变多。但在这里没有出错,我们不访以测试驱动来做程序
healer_kx 2007-06-06
  • 打赏
  • 举报
回复
CreateRemoteThread
feimingbiao 2007-06-06
  • 打赏
  • 举报
回复
系统的非分页区容量很少,不会对应用程序那么慷慨。:)

还有环境变量区,teb, process heap等等。别忘了你的代码和DLL的代码。这些都可以交换出内存。至于最小的footprint我手里没有数据,CE底下最小是350K,正常系统应该再大些。

一个简单的试验是用Windbg做Local Kernel Debug,然后用 !memusage 命令,你就可以知道你的程序占多大地方了。 :)
vc_asm 2007-06-06
  • 打赏
  • 举报
回复
我算了下这个必需要占的300k左右内都给ms用作什么了,为了加快访问和切换速度,为每个进程在非分页区做了一个256k以上的页表,然后还有8k的pcb--进程控制块,据说完整映射4G内存需要1M的表页空间,而系统空间被固定于高2G后,页表除到512k,可能其中还有一部分用于内存共享,DLL加载区等,又将其分出一半,故256k页表,8k的pcb是保守的说法,另外还可能有其它的一些资料链表等等我也不知道是什么的内存占用,用于监视进程对系统的资料申请和状态跟踪,就将其定为48k,这样子刚刚好是300k,微软为性能决不将这部分内存交换出内存,所以每个进程必需要占300k内存,大家不防可以自己动手做个类似的工具测试看看,进程数估计最多不会超过4030个,而且和内存大小有关
feimingbiao 2007-06-06
  • 打赏
  • 举报
回复
进程本身是会占有资源的,首先需要内存装载你的程序,然后把你需要的DLL也Map到地址空间来(这个例子是kernel32.dll 和 ntdll.dll),这些弄好了,还需要在系统内存里面分配Process Kernel Object, 这个例子里面还要有Handle Table,再加上Process Heap,等等。

另外,Windows系统里面没有主从线程之说,所有线程都是平等的。
mudunke775 2007-06-06
  • 打赏
  • 举报
回复
进程其实不占资源的,占资源的是线程,确保你的主线程和其他线程占用尽量小的资源就可以了。而且好象每个主线程占用的资源都有个最小值。
coldplay968 2007-05-26
  • 打赏
  • 举报
回复
mark
vc_asm 2007-05-20
  • 打赏
  • 举报
回复
没高手?高手咱不现身呢?
goingup 2007-05-19
  • 打赏
  • 举报
回复
接楼上的,是啊,郁闷坏了,终于知道那么多娃拖着不结贴是为啥了~~~
瞧他们小气的那个样...脆性....shit! 嘿嘿
xuwukong 2007-05-10
  • 打赏
  • 举报
回复
VC刚入门,对这个题目本人有以下几点疑问:
1.不同格式的数据要转换成XML格式以便交换
这个转换用VC能完成吗?
2.若不能完成,需借助另外的软件转换,那
么VC可以直接调用这些软件来完成转换吗?
若以上我的问题完全不着边,各位大侠请给个思路。
ReverseEngineering 2007-05-10
  • 打赏
  • 举报
回复
强制结贴后竟然一分没加!
vc_asm 2007-05-09
  • 打赏
  • 举报
回复
樓上大哥,這個程序沒有運行時庫,如果用console的話,可能要調用更多的dll
trueadou 2007-05-09
  • 打赏
  • 举报
回复
关注!
蒋晟 2007-05-08
  • 打赏
  • 举报
回复
和线程的堆栈大小有关
yjgx007 2007-05-08
  • 打赏
  • 举报
回复
运行时库占用很大比例,如果是Console程序会好些.
vc_asm 2007-05-08
  • 打赏
  • 举报
回复
我已经指定Link参数/Heap:32 /Stack:32,好像没有效果
vc_asm 2007-05-08
  • 打赏
  • 举报
回复
我算了一下,一个进程要用300k内存,不知道用了什么了,如何才能减少使用量呢?
vc_asm 2007-05-07
  • 打赏
  • 举报
回复
我用同样的原理测了一下线程数,好像没有超过4030个
DentistryDoctor 2007-05-07
  • 打赏
  • 举报
回复
开太多进程是不明智的。

15,472

社区成员

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

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