문제

나는 내 앱에 간단한 동기화 기능을 작성하려고하고 있으며, 팝업 된 문제 중 하나는 각각 자체 시계 (특히 파일/객체의 수정 날짜와 관련하여) 두 개의 원격 컴퓨터 간의 시간 동기화입니다.

나는이 주제에 대한 많은 연구가 이루어졌으며 너무 이론적 인 것을 원하지 않지만 원격 시계 사이의 시간적 불일치를 최소화하기위한 모범 사례가 있는지 궁금합니다.

예를 들어, 시작은 시간대 문제를 피하기 때문에 항상 UTC (Universal Time)를 사용하는 것입니다. 그러나 두 컴퓨터가 정확히 같은 시스템 시간을 가질 것이라는 보장은 없습니다. Luckily the work I'm doing isn't very fine-grained, so it's not a terribly important concern, but I'm still curious nonetheless.

한 가지 솔루션은 로컬 시스템 시계가 아닌 글로벌 시간 서버와 같은 양쪽 끝에서 항상 동일한 시계를 사용하는 것입니다. 아마도 이것 (공유 리소스 잠금 장치와 결합)은 동기화 된 시간의 우연한 중첩을 보장 할 수는 없지만 실용적이지는 않습니다.

내 머리에 튀어 나온 한 가지 생각은 각 노드 (각 클라이언트)를 어느 시점에서 계산 된 오프셋과 동기화하는 것입니다. 오프셋 자체가 짧은 기간 동안 크게 변경되지 않으므로 때때로 수행하면됩니다.

업데이트: 실제로 두 컴퓨터의 시스템 시계를 동기화하는 데 관심이 없다고 덧붙였습니다. 대부분의 경우 운영 체제가이를 처리 할 것이라고 가정합니다. 이것은 응용 프로그램의 두 인스턴스가 동기화 된 시간을 사용하는 방법에 대한 문제 일뿐입니다. 그러나 오늘날과 나이에 시스템 시계는 어쨌든 아주 작은 델타 내에서 거의 확실하게 동기화 될 것이라고 가정합니다.

도움이 되었습니까?

해결책

다른 사람들이 권장하는 것처럼 응용 프로그램에 대한 NTP에 의존하는 것은 쉬운 퍼지입니다. 올바른 접근법은 Lamport의 분산 클록 동기화 알고리즘을 사용하는 것입니다. 그것은 그의 고전적인 1978 논문에 설명되어있다 분산 시스템에서 시간, 시계 및 이벤트 순서.

다른 팁

보다 "네트워크 시간 프로토콜"(NTP) 사양.

PTP (Precision Time Protocol)는 컴퓨터 네트워크 전체에서 클럭을 동기화하는 데 사용되는 프로토콜입니다. 로컬 영역 네트워크에서는 하위 마이크로 초 범위에서 시계 정확도를 달성하여 측정 및 제어 시스템에 적합합니다.http://en.wikipedia.org/wiki/precision_time_protocol

시계를 동기화하기 위해 코드를 작성하는 대신 두 머신에서 NTP 클라이언트를 실행하는 것이 불가능합니까?

또는 위의 내용이 불가능하고 시간을 설정하기에 충분한 권한으로 앱이 실행중인 경우 애플리케이션에서 최소한의 NTP 클라이언트를 구현하고 공개 서버와 동기화하려고합니다. 누군가의 개인 서버를 하드 코딩하지 마십시오 ...

그것들과 동기화하십시오 NTP 네트워크 시간 프로토콜.

당신은 어떤 플랫폼에 있습니까?

NTP를 사용하면 컴퓨터의 시간을 원자 시계와 동기화하고 세계의 공식 시간을 사용할 수 있습니다.

이것은 이전 기고자들의 현명한 제안을 화나게하기 위해 많은 일을 할 수있는 정교하지 않은 최종 사용자와 관련하여 현재 해결해야 할 문제입니다. 정교하지 않은 최종 사용자는 최소한 이러한 일을 할 수 있습니다.

1) NTP 시간 동기화를 설정할 수있는 컴퓨팅 지식이 충분하지 않음

2) 컴퓨터 시간 시계를 하우스 시계 또는 잘못된 휴대폰 시계로 설정

3) Windows XP에서 실수로 NTP 시간 동기화를 비활성화하고 다시 활성화하는 방법을 모르거나 컴퓨터 날짜를 잘못 설정하는 경우 Windows NTP가 작동하지 않습니다.

4) 컴퓨터 BIOS 배터리가 평평 해져 PC가 1970 년에 항상 시작되었습니다!

5) 사용자는 노트북을 해외로 가져 와서 일시적으로 노트북 시계를 현지 시간으로 설정하지만 시간대를 변경하지 않으므로 이제 PC는 잘못된 UTC 시간을 반환합니다 !!!

따라서 프로그램 자체는 시간을 관리해야하며 물론 최소한의 오버 헤드로 그렇게하고 싶습니다.

프로그램을 운영하는 두 명의 최종 사용자가 나중에 같은 시간에 무언가를하기 위해 프로그램이 필요하다고 가정 해 봅시다.

나는 Cron 일자리의 작동 방식에서 아이디어를 가져다주는이 계획을 제안합니다. 누군가 아이디어를 개선 할 수 있다면 행복 할 것입니다.

1) 애플리케이션이 시작되면 타사 서버 또는 자신의 시간 서버 (NTP로 제 시간에 유지할 수 있음)를 통해 자체 내부 UTC 시간을 NTP에 동기화합니다.

2) 그 후 그것은 시간을 유지하기 위해 시스템 시계에서 경과 시간을 추가합니다. 요구 사항이 엄격한 경우 간격으로 NTP 동기화를 반복해야 할 수도 있습니다.

3) 그런 다음 응용 프로그램은 정시에해야 할 미래의 작업 목록을 살펴 봅니다. 가장 빠른 직업을 알아야합니다.

4) 그런 다음 가장 빠른 작업보다 앞서 잠을 자게하는 실을 만듭니다. 안전 마진이 적습니다. 요구 사항에 따라 1 ~ 2 시간 전에 사전에 10 분 또는 2 시간 전에 사전 등이있을 수 있습니다.

5) 스레드가 깨어날 때, 추가 비누 호출로 절대 시간을 다시 확인한 다음 시스템 시간 시계에 의존하여 첫 번째 작업이 수행 될 시간에 도달 할 때까지 경과 시간을 추가합니다.

6) 작업이 트리거 되 자마자 (다른 스레드에서 실행) 타임 모니터링 스레드는 다음 작업을 앞으로 계산하고 지속 시간 동안 다시 잠을 자게됩니다.

아이디어 향상 :

1) 사용자는 적당한 작업 전에 애플리케이션을 닫을 수 있으므로 위의 동일한 동기화 체계를 사용하여 작업 목록을 독립적으로 모니터링하고 데이터베이스 또는 파일에 저장 한 다음 배경 프로세스 또는 서비스가 필요할 수 있습니다. 제 시간에 응용 프로그램. (Windows에서 신청 절차를 생성)

2) 귀하의 응용 프로그램은 새로운 초기 작업을 즉시 추가하거나 작업을 삭제하고있을 수 있으므로 수면 스레드는 새로운 초기 작업을 위해 또는 삭제 된 작업에 따른 작업을 위해 다시 계산하기 위해 흔들릴 수 있어야 할 것입니다. Win32에서는 이벤트에서 타임 아웃으로 대기하는 스레드 로이 작업을 수행하여 수면 시간을 다시 계산하도록 설정했습니다. Linux에는 의심 할 여지없이 비슷한 메커니즘이 있습니다.

3) 비누 호출 시간을 얻으려면 비누가 보낸시기와 응답이 수신되는시기를 기록하십시오. 처리 시간이 너무 길면 시간에 의존 할 수없고 통화를 반복해야 할 수도 있고 타협 할 수 있습니다. 예를 들어, 비누가 컴퓨터 시계가 5 분 빠르다고 말하지만 비누 호출 자체가 응답하는 데 1 분이 걸렸다면 컴퓨터 시계가 4 분 이상 빠르다고 확신 할 수 있습니다.

우리가하는 한 가지 일은 본질적으로 모든 타이밍 작업을 '호스트'머신에 오프로드하는 것입니다. 예를 들어, 모두 DB를 공유하는 20 개의 서버가있는 경우 DB 시간을 사용하십시오. 중앙 서버와 백만 개의 클라이언트 시스템이있는 경우 클라이언트 시스템은 타이밍에 대한 책임이 없어야합니다. 모든 동기화 서버 측을 수행하십시오. P2P 네트워크와 같은 진정한 '분산 된'환경에서, 가장 직접적으로 직접적으로 '소유하는'시스템을 사용하여 해당 리소스 (작성하려는 실제 PC)를 사용하여 파일에 대한 액세스를 동기화/제어합니다.

모든 네트워크 머신은 NTP를 사용해야합니다. 모든 현대 시스템에는이를 쉽게 설정하는 방법이 포함되어 있습니다. 약간의 정밀도가 필요한 경우 유일한 문제는 특정 서버를 선택하는 것입니다. 그러나 이미 밀리 초 범위에 있으므로 신경 쓰지 않고 일반적으로 수영장을 가리 킵니다 .ntp.org

NTP를 사용하지 마십시오. NTP는 날짜/시간 만 얻기위한 것입니다.

통신하지 않는 앱간에 이벤트를 동기화하는 데 작동합니다. 예를 들어 알람 앱과 신체.

직접 통신이있는 앱의 경우 리소스를 공유하고 Diomidis가 말한 것처럼 Lamport 클록 또는 벡터 클록을 사용하십시오. Lamport 시계는 이벤트 사이의 부분 순서를 달성하기 위해 훌륭하게 작동하며 동시 이벤트를 식별해야 할 때 벡터 시계가 좋습니다.

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