2010-12-15 2 views
5

"최상위"명령이 어떤 프로세스에서 사용하는 CPU 백분율을 계산하는지 어떻게 알고 싶습니다."최상위"명령으로 유닉스에서 단일 프로세스에 의한 CPU 비율 계산

"psinfo"이진 파일을/proc 디렉토리에서 읽으려고 시도했지만 결과를 찾는 데 도움이되지 않았습니다.

수행 방법에 대한 정보를 제공해주십시오.

미리 감사드립니다.

+1

하지만 관련 중복되지 않음 - http://stackoverflow.com/questions/552976/top-commands-cpu-usage-calculation 입력에 대한 – DumbCoder

답변

9

top 명령은 proc file system의 데이터를 사용하여 CPU 사용량을 계산합니다. CPU 사용 데이터가 포함 된 실제 파일은 플랫폼마다 다를 수 있습니다. 예를 들어, Linux에서는 /proc/<pid>/stat, Solaris에서는 /proc/<pid>/psinfo에서 찾을 수 있습니다. CPU 사용은 프로세스의 누적 CPU 시간의 차이를 업데이트 간 측정 된 시간으로 나눈 값으로 계산됩니다.


리눅스의 경우, http://procps.sourceforge.net에서 procpsps, top을 포함 소스 및 기타 프로세스 툴을 검사 할 수 있습니다. 특히 readproc.c 파일에는 데이터를 검색하는 기능이 있습니다.


Solaris의 경우, 당신은 https://hg.java.net/hg/solaris~on-src/file/tip/usr/src/lib/libproc에서 libproc 소스를 검사 할 수 있습니다. prog_get_info.c 파일에는 데이터를 검색하고 구조체 psinfo_t에 저장하는 기능이 있습니다.


은 Linux, Solaris 및 다른 사람을 위해, 당신은 http://sourceforge.net/projects/unixtop에서 Unix Top 소스를 검사 할 수 있습니다. machine 디렉토리 내의 플 '폼 특정 소스 파일에는 데이터를 검색하는 기능이 들어 있습니다.


업데이트

프로세스에 대한 CPU 시간을 검색하기위한 또 다른 방법은 방법 (Solaris 전용) ioctl() 시스템 호출에 PIOCPSINFO 또는 PIOCSTATUS 옵션으로 통과 할 수있다. PIOCPSINFO 옵션은 prpsinfo_t 구조체에 기타 프로세스 정보를 반환합니다. PIOCSTATUS 옵션은 prstatus_t 구조체에있는 프로세스의 상태 정보를 반환합니다.

http://getthegood.com/TechNotes/Papers/ProcStatistics.html 예에서 코드 각색 :

int main(int argc, char* argv[]) 
{ 
    int fd; 
    prpsinfo_t info; 
    prstatus_t status; 
    char procbuf[50]; 

    sprintf(procbuf, "/proc/%d", getpid()); 
    fd = open(procbuf, O_RDONLY); 

    ioctl(fd, PIOCPSINFO, &info); 
    printf("Process user+sys time = %ld sec %ld nsec\n" 
      "Reaped children user+sys time = %ld sec %ld nsec\n", 
      info.pr_time.tv_sec, info.pr_time.tv_nsec, 
      info.pr_ctime.tv_sec, info.pr_ctime.tv_nsec); 

    ioctl(fd, PIOCSTATUS, &status); 
    printf("Process user+sys time = %ld sec %ld nsec\n" 
      "Sum of children's user+sys time = %ld sec %ld nsec\n", 
      status.pr_utime.tv_sec+status.pr_stime.tv_sec, 
      status.pr_utime.tv_nsec+status.pr_stime.tv_nsec, 
      status.pr_cutime.tv_sec+status.pr_cstime.tv_sec, 
      status.pr_cutime.tv_nsec+status.pr_cstime.tv_nsec); 

    close(fd); 
    exit(0); 
} 

주 :이 코드 안된 및 간략화를 위해 에러 체크를 생략.

+0

감사합니다. 나는 psinfo가 나에게 일찍 나에게 도움이되지 않았지만 나는 당신에 의해 주어진 모든 옵션을 점검하고있다. – Arunmu