在LINUX下如何监测运行时间很短的程序的内存使用量

wowh 2006-05-29 02:35:14
比如说像只有一条printf语句的已经编译好的程序

类似
#include <stdio.h>

int main() {

printf("%d\n",3);

return 0;
}

我尝试fork了一个子进程然后用exe系列函数执行上面那个程序 然后父进程监视proc/pid/stat

但因为运行时间很短 一般检测到子进程信息时子进程已经进入到僵死状态(zombie)资源已经都被释放

不知道有什么方法能 延缓子进程进入到zombie状态的速度 或者有另外检测短时间程序内存占用的方法
...全文
385 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wowh 2006-05-30
  • 打赏
  • 举报
回复
问题已经基本解决

使用了ptrace函数 进行子进程跟踪

ptrace(PTRACE_TRACEME,0,(char *)1,0);
execlp(tmp,NULL);

然后再父进程获得内存占用后

ptrace(PTRACE_DETACH,pid,(char *)1,0);
撤销这个跟踪

明天测试下程序 如果没问题 再来结贴
universes 2006-05-29
  • 打赏
  • 举报
回复
mark
x86 2006-05-29
  • 打赏
  • 举报
回复
这里还有一个帮助:
http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html#SEC2


看上去你必须把printf放到一个函数里面,否则不会跟踪它。
另外我估计单个的printf还是无法得到准确时间,因为太短了,你不妨以此调用多个printf,比如一万次。
x86 2006-05-29
  • 打赏
  • 举报
回复
可能gprof比cprof更好一些,也你的系统已经安装了。

这里有一份gprof的帮助:
http://www.tldp.org/linuxfocus/ChineseGB/March2005/article371.shtml
x86 2006-05-29
  • 打赏
  • 举报
回复
可以用性能优化的工具(Profiler),可以知道每段代码的运行时间,从而知道系统的瓶颈。以前用过一个,忘了名字,帮你查了一下,可以看看:

cprof
http://cprof.sourceforge.net/

或者
Intel VTune Performance Analyzer 8.0 Linux
http://www.9iv.com/down/soft/2164.htm
playmud 2006-05-29
  • 打赏
  • 举报
回复
pause();
linaxing 2006-05-29
  • 打赏
  • 举报
回复
尝试一下wait3(),wait4()能满足你的要求不?
limlzm 2006-05-29
  • 打赏
  • 举报
回复
学习
playmud 2006-05-29
  • 打赏
  • 举报
回复
不好意思,没看清你就是这么做得,上面说的第一句当我没说
playmud 2006-05-29
  • 打赏
  • 举报
回复
试试fork()以后,主进程根据子进程的id来获得各项信息。
占用内存是一个比较复杂的东西,首先不说动态分配内存和释放,当当几个段和栈的占用就挺麻烦的。
或许你可以一直exec();然后观察他的内存大小。
proc/pid里面的信息也是根据页表来的,如果可能你可以改写这个页表的模块,让他能够以日志的形式输出来。
wowh 2006-05-29
  • 打赏
  • 举报
回复
谢谢楼上各位 但我需要以编程进行实现
----------------------------------------------------
to linaxing(牛牛)

linux下检测类似我顶楼的程序 使用wait3和wait4 后得到rusage结构中 有数值的项只有
utime stime 和 minflt majflt 这些项的数值在proc的stat文件中可以获得的,即使子进程僵死了,

我主题的想法是想获得包括虚拟内存在内的内存资源占用信息,所以帮助不是很大

----------------------------------------------------
to playmud((猪头流氓)(鄙视老迈)(抵制日货))
我使用exec函数来执行已经编译好的程序,调用exec函数后 原来的子进程已经"死亡" 被exec的程序代替 我无法在已经编译好的程序里面加pause();

----------------------------------------------------
to x86(大雪)
谢谢 您的好意 程序运行时间我可以获取到而且不需要很精确 zombie的子进程的stat文件还保存着进程使用的时间片 所以以10ms一个单位还是可以计算得到

使用工具对我不现实,因为我目前在做的是onlinejudge,不可能每个提交上来的程序,我都用工具进行分析,所以希望能够编程实现.

重要的是常驻内存和虚拟内存的占用的获得,再次谢谢各位 继续等更好的解答

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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