리눅스에서 프로세스 상태 검사 API
글쓴이: misari / 작성시간: 화, 2009/11/24 - 4:51오후
HP-UX용 응용프로그램을 리눅스로 변환하고 있습니다. 그러나 "pstat.h"와 관련된 문제를 갖고 있습니다. 특정 프로세스의 상태를 온라인으로 감시하기 위하여 HP-UX에서는 "pstat_getproc" 함수를 이용하여 pst_cpu (cpu utilization), pst_cptickstotal(cpu total ticks for process), usercycles, systemcycles, 등을 검사하여 특정 프로세스가 정상적으로 동작하고 있는지 확인하도록 되어 있습니다.
리눅스에는 이에 대응하는 API가 없군요. 우여곡절 끝에 비슷한 API를 찾았습니다. "get_proc_stats"라는 API이고, "libproc"에서 제공되는군요. 하지만, 프로세스 상태라던지, "user-mode CPU time"이나 "kernel-mode CPU time" 등만 있고, HP-UX에서와 같은 기능을 제공하지는 않습니다. 이 기능들로 구현을 시도해 보았지만, CPU를 많이 쓰지 않는 프로세스일 경우, 위 두 가지 값이 항상 '0'이어서 원하는 기능을 구현할 수 없네요.
다음은 HP-UX에서 구현된 소스 코드입니다.
int goodStatus(int pid) { static long lastUserCycles; static long lastSystemCycles; struct pst_status pst; int retval = GOOD_STATUS; if (pstat_getproc(&pst, sizeof(pst_status), 0, pid) != -1) { if ((pst.pst_stat != PS_SLEEP) && (pst.pst_stat != PS_RUN)) return BAD_STATUS; // if no user or system cycles used since last check, // and processor utilization is 0, assume process has a problem. if (lastUserCycles == pst.pst_usercycles.psc_lo && lastSystemCycles == pst.pst_systemcycles.psc_lo && 0 == pst.pst_cpu) { cout << " NO ACTIVITY Status = " << dec << pst.pst_stat << " CPU total ticks = " << pst.pst_cptickstotal << endl; cout << "pid = " << pst.pst_pid << " name = " << pst.pst_ucomm << " has NO ACTIVITY" << endl; cout << " proc util: " << pst.pst_cpu << " user cycles: " << pst.pst_usercycles.psc_hi << pst.pst_usercycles.psc_lo << " system cycles: " << pst.pst_systemcycles.psc_hi << pst.pst_systemcycles.psc_lo << endl; return BADSTATUS; } else { lastUserCycles = pst.pst_usercycles.psc_lo; lastSystemCycles = pst.pst_systemcycles.psc_lo; } } return retval; }
Forums:
top 소스를
top 소스를 분석해보면 아시겠지만 리눅스에서는 /proc 밑의 파일을 바로 해석합니다.
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
top 소스도 보았고, /proc/pid/status 도 보았지만,
간단한 로직으로 구성된 프로그램으로 시험해 보면 변하는 수치가 거의 없더군요.
"voluntary_ctxt_switches" 값만 유일하게 변하는 군요.
-----------------
꿈을 버리지 말자!
꿈을 버리지 말자!
댓글 달기