기존 및 새 Linux 시스템의 타이머 확인 이해

기존 및 새 Linux 시스템의 타이머 확인 이해

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()같은 여러 요인에 따라 결정됩니다.

  1. 타이머 여유
  2. 컨텍스트 스위치시간
  3. 타이머의 정확성과 정밀도

기본값으로타이머 마진 값은 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찾고 있는 (고정밀) 타이머에 대한 몇 가지 포인터를 찾을 수 있을 것입니다. 나는 리눅스 박스를 갖고 있지 않다. 그래서 확답을 드릴 수 없습니다. 하지만! :)

관련 정보