W.A 저장소

Get Process Info( CPU Usage / Memory Usgae) 본문

Programing

Get Process Info( CPU Usage / Memory Usgae)

W.A 2010. 11. 4. 20:34

쓸모없이 돌아가는 나쁜 프로세스를 죽이기 위한 노력.

 

우선 그런 프로세스들을 찾기 위해서 ActivityManager를 사용하여 현재 실행중인 어플들의 목록을 받아오는 작업부터 시작했다. 보시면은 아시겠지만

while(rAppIterator.hasNext()) {

        runningAppProcess = rAppIterator.next();

        ProcessInfo processInfo = new ProcessInfo(runningAppProcess.processName, runningAppProcess.pid);

        taskProcessInfo.add(processInfo);

        Log.d(TAG, runningAppProcess.processName);

}

위와 같은 방법을 사용하여 기본적으로 현재 실행되고 있는 프로세스의 PID값을 가져왔다. 이 정보 이외에서 다른 정보들이 많이 있었다.

하지만 이러한 정보들로는 내가 알아보기가 힘든 내용들이 많이 있었다.

Dirty memory? 이것이 무엇이란 말인가???

그래서 하게 된 방법이 직접 시스템에 /proc 에 있는 정보를 사용해서 받아오기로 했다.

 

그림을 보시면 아시겠지만 여러 정보들을 가지는 파일과 PID를 가지는 폴더를 보실 수 있습니다.

또한 /proc/stat , /proc/cpuinfo, /proc/meminfo, /proc/stat 에서 여러 정보를 얻을 수가 있습니다.

 

그리고 /proc/[pid]/status에서도 각 프로세스별로 여러가지 정보를 얻을 수 있습니다.

 

하지만 여기서 얻는 정보는 각 프로세스들의 cpu점유율을 알기가 힘이 들었습니다. 그래서 사용하게 되것이 linux systemtop command를 사용하여 각 프로세스의 PID를 사용하여 cpu점유율과 메모리점유율을 얻기로 하였습니다.

String cmd = "top -n 1";

String line;

 

process = runtime.exec(cmd);

 

InputStream is = process.getInputStream();

InputStreamReader isr = new InputStreamReader(is);

BufferedReader br = new BufferedReader(isr);

 

while ((line = br.readLine()) != null) {

       

        String segs[] = line.trim().split("[ ]+");

       

        if( segs[0].equalsIgnoreCase(Integer.toString(tempProcessInfo.getPid())) ) {

               tempProcessInfo.setCpuUsage(segs[1]);

               tempProcessInfo.setMemUsage(divideMemInfo(segs[5]));

               break;

        }

}

위와 같은 방법으로 아래와 같이 프로세스의 Cpu점유율과 메모리점유율을 알 수 있다. 이 외에도 여러가지 많은 정보를 얻을 수 있다.



이러한 방법을 사용하게 된다면은 이러한 정보들 말고도 무궁무진한 것을 얻어올수 있을것이라 생각된다.