문제

당신이 clock_gettime () 모든 BSD에서 사용할 수 있고 실제로 POSIX 표준의 일부로 정의되는 기능은 최소한 세 가지 유형의 시계에 대한 지원이 있음을 알 수 있습니다 (많은 시스템은이 시계보다 더 많은 것을 지원하지만 실제로 POSIX 표준은 하나에서 하나만 요구합니다. 참석하십시오. 다른 모든 것은 선택 사항입니다) : :

  • clock_realtime -POSIX는 이것을 참석해야합니다. 이것은 벽 시간 시계입니다.

  • clock_monotonic - 이것이 무엇인지 (그리고 Si 초가 무엇을 의미하는지) 모르겠지만,이 시계는 결코 뒤로 점프하지 않을 것이라는 것을 이해합니다. 단조롭게도 가치가 증가 할 수 있습니다.

  • clock_uptime - 이것이 Clock_Monotonic과 어떻게 다른지 알지 못하지만 (가동 시간도 뒤로 점프하지 않습니다), 최소한이 시계는 커널 부츠를 부팅 할 때 제로에서 시작한다는 것을 알고 있습니다 (커널 부츠시 초기 값 Clock_Monotonic이 가지고있는 것이 무엇인지 정의하지 않음).

다른 시계를 잠시 무시합시다. Clock_Realtime은 단조롭게 위로 계산할 수 있도록 보장되지 않습니다. 이것이 실제 "시스템 시간"입니다. 나는 시스템 시간을 마음대로 변경할 수 있습니다. 3 개월 또는 과거 또는 5 년 동안 미래로 설정할 수 있으며 시스템이 인터넷에서 NTP 서버를 사용하여 시간을 동기화 할 때마다 시간이 앞으로 또는 뒤로 점프 할 수 있습니다.

이제 BSD 시스템에 두 개의 수면 기능이 있습니다. 잠() 그리고 나노 수면 (). 확실하지 않지만 Nanosleep ()를 사용하여 Nanosleep ()를 사용하여 Sleep ()가 Nanosleep ()를 쉽게 모방 할 수 있고 struct timespec에서 몇 초만 설정하여 Nanoseconds를 0으로 유지할 수 있습니다. .

나는 많은 소스에서 이러한 기능이 실제로 모닝 시간을 계산하여 작동한다는 사실을 읽었으며 (현재 시간을 얻고, 수면 금액을 추가) 시스템은 현재 시간이있는 경우 정기적으로 확인합니다. 나중에 모닝 시간보다 다시 실이 깨어납니다. 이것이 간격으로 만 확인되었다는 사실은 Man Pages가 현재 수면이 적어도이 시간 동안 잠을 자게 될 것이라고 말하는 이유입니다 (신호에 의해 방해되는 경우에만 짧음). 시스템은 우리가 이미 모닝 타임을 지났는지 확인하고 스케줄러 가이 스레드가 다시 실행되기 전에 걸리는 시간에 따라).

이것은 모두 나에게 완벽하게 제정신이지만 항상 나를 괴롭힌 질문이 있습니다.

다양한 출처에 따르면 수면 (최소한 Nanosleep)은 Clock_Realtime을 내부적으로 시계로 사용합니다. 즉, Nanosleep ()에게 30 초 동안 잠을 자고 나중에 시스템 시계를 1 시간으로 바꾸면 실이 거의 즉시 깨어납니다 (미래의 1 시간은 Nanosleep (나노 잠자는 시간보다 1 시간 앞서) ( ) 계산). 이것은 또한 완벽하게 괜찮습니다. 하지만 30 초 안에 일어나서 사용자가 그의 시스템 시계가 1 시간 앞서 있다는 것을 알게되고 1 시간으로 시계를 뒤로 설정한다면 어떻게됩니까? 그러면 내 스레드가 1 시간 30 초 동안 잠을 자고 있습니까? 그것은 다소 나쁠 것입니다.

도움이 되었습니까?

해결책

내가 아는 한, 수면 기능은 일반적으로 감소 카운터처럼 구현됩니다. 스케줄러에서 "1000 일 스케줄 틱에 대한 수면"으로 해석 된 "10 초 동안 수면"이라고 말한 다음 스케줄러가 수면 프로세스를 점검 할 때마다 남은 시간이 줄어 듭니다.

이런 식으로, 수면 시간은 미래의 시간까지 잠을 자지 않고 항상 수면에 수면 시간이 될 것입니다. 그 이유는 당신이 의심했던 것입니다. 우리가 미래에 시간을 선택한다면 우리는 결코 거기에 도착하지 않을 수도 있습니다 (또는 예기치 않은 시간에 도착할 수도 있습니다). 이것은 프로그램에서 수면을 사용하려는 것과 일치합니다. 캘린더와 같은 계산을하는 것은 아닙니다.

또한 간단한 테스트를하고, 30 초 동안 프로그램 수면을 만들고, Nix "Time"명령을 사용하여 기능이 실행되는지 시간 to 시간을 사용하고 시스템 시계를 5 분 동안 변경하고 어떻게되는지 확인할 수 있습니다.

다른 팁

스레드는 수면의 끝이 아닌 수면 지속 시간으로 설정된 내부 카운터를 점검합니다. 사용 된 내부 카운터는 현재 시스템 시간과 관련이 없으므로 시스템 시간에 변경 사항이 발생하면 영향을받지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top