2014-11-07 4 views
4

뺄셈을 통해 작업 시간을 얻기 위해 getrusage()을 두 번 호출하는 프로그램에서 작업 시간이 음수가 아니어야한다고 주장하는 주장이있었습니다. 물론,이를 쉽게 재현 할 수있는 특수화 된 프로그램을 작성할 수는 있지만 쉽게 재현 할 수는 없습니다.getrusage에 대한 두 번의 연속 호출이 증가하는 결과를 보장합니까?

getrusage()이 실행에 따라 증가했지만, 내 시스템의 man 페이지 (Linux on x86-64)도 this system-independant description도 명시 적으로 표시되지 않습니다.

여러 코어가 있고 NTP가 실행중인 실제 컴퓨터에서 동작이 관찰되었습니다.

사용중인 OS에 대한 버그를보고해야합니까? getrusage()가 시간이지나면서 증가 할 것으로 예상 할 때 너무 많이 묻는 것이 맞습니까?

+1

전용 컴퓨터 또는 가상 인스턴스에 있습니까? –

+0

@ShafikYaghmour 이것은 물리적 (및 멀티 코어) 컴퓨터에 있습니다. –

+0

@ShafikYaghmour 이것은 유럽에 있었고 DST 관련 조정 당시가 아니 었습니다. 그러나 NTP 데몬은 실행 중이었고 언제든지 수행 할 수 있으므로 시계를 1 초 조정할 수있었습니다. –

답변

3

대부분의 시스템에서 rusage (저는 ru_utimeru_stime을 의미합니다)는 정확하게 계산되지 않습니다. 클럭 틱당 한 번 샘플링되며 보통 100Hz로 느리고 때로는 더 느립니다.

그 주된 이유는 많은 기계에 읽기에는 엄청나게 많은 비용이 들며이 계산을 원하지 않는다는 것입니다. 모든 시스템 호출에 대해 시계를 두 번 읽어야합니다. 많은 시스템 호출을하는 프로그램에서 다른 작업을 수행하는 것보다 쉽게 ​​시간을 읽는 데 더 많은 시간을 소비 할 수 있습니다.

카운터는 뒤로 이동해서는 안됩니다. 나는 수년 전에 프로세스의 총 실행 시간이 컨텍스트 스위치에서 추적되는 것을 보아왔다. (상대적으로 값이 쌌고 getrusge는 stime에 대한 샘플을 사용하고 총 실행 시간에서 샘플을 빼서 utime을 계산할 수 있었다.) 이 경우에 사용 된 시계는 단조로운 시계가 아닌 벽시계 였고 컴퓨터에서 시간을 변경하면 프로세스의 실행 시간이 되돌아 갈 수있었습니다. 그러나 그것은 물론 버그였습니다.

+0

사실, 실패한 주장은'ru_utime'과'ru_stime'의 합계에 관심이있었습니다. 그래서 매우 짧은 작업 기간 동안, 적어도 하나는 거꾸로 갔지만 어떤 것이 있는지 모르겠습니다. –

+0

그 시간의 합계를 원한다면, 시스템의 문서를보고'clock_gettime'에 더 좋은 옵션이 있는지 확인하십시오. 당신이 리눅스에서 태그를 지정했기 때문에'getrusage'보다 더 나은 해상도와 정확성을 제공하는'CLOCK_PROCESS_CPUTIME_ID'를 가져야합니다. 왜냐하면 내가 알고있는 한, 맥락 스위치와 읽을 때 고려해야하기 때문입니다. 물론, 그 질문에 대답하지 않지만, 더 나은 옵션이 될 수 있습니다. – Art