Linux/POSIX 시스템에서 시스템 타이머의 해상도를 찾는 방법은 무엇입니까? 제가 특히 관심을 갖는 것은 nanosleep()
사람이 기다릴 수 있는 최소한의 시간입니다. 기존 구현 호출은 sysconf(_SC_CLK_TCK)
이전 커널(<=2.4)에서 제대로 작동합니다. 이는 초당 시계 틱 수를 반환하는데, 이는 당시 타이머의 해상도(1/순간).
그러나 현대 기계는 일반적으로 (a)타임스탬프 카운터/고정밀 이벤트 타이머(비)"틱 프리" 코어. 더 이상 고정 타이머 인터럽트 간격을 사용하지 않으므로 _SC_CLK_TCK
더 이상 의미가 없습니다. 이러한 시스템에서는 sysconf(_SC_CLK_TCK)
일반적으로 100이 반환되지만 실제 타이머 세분성은 훨씬 더 작습니다.
sysconf(_SC_CLK_TCK)
더 이상 타이머 세분성에 해당하지 않는 새 시스템에서 실행 중인지 여부를 감지할 수 있는 방법(가급적 C/C++ 코드)이 있습니까? 이 경우에는 0을 반환하고 싶습니다.
답변1
기다릴 수 있는 최소 시간은 다음과 nanosleep()
같은 여러 요인에 따라 결정됩니다.
기본값으로타이머 마진 값은 50 µs입니다., nanosleep이 0ns 또는 1ns의 기간으로 호출되더라도 프로세스가 정상적인(다른) 일정에 따라 실행되는 경우 기본적으로 실제로 약 50μs를 기다리게 됩니다.
prctl()
실시간 예약 클래스에서 프로세스를 호출하거나 실행하여 타이머 여유 메커니즘을 비활성화할 수 있습니다.
그러나 nanosleep 호출은 하드웨어에 따라 약 3 µs가 걸리는 자발적인 컨텍스트 전환을 초래합니다.
실제로 nanosleep에서 사용하는 타이머의 정확성/정밀도를 쿼리할 수 있는 직접적인 방법은 없습니다. POSIX는 nanosleep을 측정해야 한다고 지정합니다 CLOCK_REALTIME
. 다음을 사용하여 해상도를 쿼리할 수 있습니다.clock_getres()
. 그러나 타이머의 정확도/정밀도는 이보다 낮을 수 있습니다.
그러나 프로그램 시작 시 작은 값(예: 1ns, 1μs, 10μs)을 호출하여 nanosleep의 정확도/정밀도를 간접적으로 쿼리하고 clock_gettime(CLOCK_REALTIME)
CPU의 실행 시간에 대한 실제 실행 시간을 측정할 수 있습니다.TSC.
답변2
나의 (더 많은) 경험은 BSD에 대한 것입니다.나노수면 예POSIX.1(IEEE 표준 1003.1-2008). 관련성이 있는 것 같습니다 libc
. 따라서 (Linux에서도) time.h
찾고 있는 (고정밀) 타이머에 대한 몇 가지 포인터를 찾을 수 있을 것입니다. 나는 리눅스 박스를 갖고 있지 않다. 그래서 확답을 드릴 수 없습니다. 하지만! :)