我正在编写一个Linux应用程序,它可以观察其他应用程序并跟踪资源消耗。我正在计划使用Java,但编程语言对我来说并不重要。目标很重要,所以我可以切换到另一种技术或使用模块。我的应用程序将所选的第三方应用程序作为子进程运行大多数儿童软件解决了一些算法,如图形,字符串搜索等。观察者程序在结束工作时跟踪子资源。
如果子应用程序是多线程的,那么可能以某种方式跟踪每个线程占用多少资源?应用程序可以使用任何非分布式内存线程技术编写:Java线程,Boost线程,POSIX线程,OpenMP,任何其他。
答案 0 :(得分:6)
在现代Linux系统(2.6)中,每个线程都有一个单独的标识符,其处理方式与pid几乎相同。它显示在流程表中(至少在htop程序中)并且还有单独的/proc
条目,即/proc/<tid>/stat
。
检查man 5 proc
并特别注意stat
,statm
,status
等。您应该找到您感兴趣的信息。
唯一的障碍是获取此线程标识符。 与进程ID 不同!即所有线程中的getpid()
次调用都返回相同的值。要获取实际的线程标识符,您应该使用(在C程序中):
pid_t tid = syscall(SYS_gettid);
顺便说一句,java虚拟机(至少是它的OpenJDK Linux实现)在内部执行此操作并在后端使用它进行调试,但不会将其暴露给java接口。
答案 1 :(得分:5)
内存未分配给线程,并且通常在线程之间共享。这使得谈论线程的内存消耗通常是不可能的,至少是毫无意义的。
一个例子可能是一个包含11个线程的程序; 1创建对象,10使用这些对象。大多数工作都是在这10个线程上完成的,但所有内存都是在创建对象的一个线程上分配的。现在如何解释这个问题?
答案 2 :(得分:1)
如果您愿意使用Perl,请查看以下内容:Sys-Statistics-Linux
我将它与一些GD图形包一起使用,以生成各种过程的系统资源使用图。
有一点需要注意 - 你真的需要阅读/ proc并理解jiffies - 上次我看起来他们没有在手册页中正确记录,你需要阅读内核源代码:
http://lxr.linux.no/#linux+v2.6.18/include/linux/jiffies.h
另外,请记住,在Linux中,线程和进程之间的唯一区别是线程共享内存 - 除此之外,内核实现它们的方式相同。