Bilgisayarlar zamanı nasıl doğru tutar?

Bu flood’da bilgisayarların zamanı nasıl doğru tuttuğunu ve zaman senkronizasyonu yapan NTP’yi (Network Time Protocol) anlatacağım.

Bildiğiniz gibi mekanik saatler zemberek yayının dişli mekanizmasını belirli frekansla itmesi ile çalışırlar. Bu frekans öyle güzel ayarlanır ki yelkovan bir saatte tam bir tur atar ve saati doğru gösterir.

Bilgisayarlarda da benzer şekilde programlanabilir zamanlayıcı çipler (timer chip) bulunur. Bu çipler ihtiyaç duyulan duyarlılığa (precision) göre saniyede 100, 500, 1000 veya 1000000 interrupt gönderebilirler. İşte bilgisayarlarda zaman, bu interrupt’ların sayılması ve sabit bir sayı ile çarpılması ile bulunur. Örneğin saniyede 100 (100 Hz) interrupt veren bir çipte zaman her bir interruptta 10 milisaniye (ms) artırılır. Saniyede 1000000 (1 MHz) interrupt üreten çipte ise her bir interrupt 1 mikrosaniye demektir.

Anlaşılacağı üzere bilgisayarınızdan alabileceğiniz zaman duyarlılığı ancak sahip olduğunuz time chip’in duyarlılığı kadardır. Yukarıdaki örnekte 1 MHz interrupt üreten bir bilgisayarda duyarlılık 1 mikro sn altına düşmeyecektir, yani nano sn duyarlılığı sağlanamayacaktır.

Bütün bunlarla birlikte konu maalesef bu kadar basit değil. Çiplerin frekansında dalgalanmalar meydana gelebilir ve çip 1000 Hz üretmesi gerekirken ara ara bazı saniyelerde farklı Hz’ler, örneğin 998 Hz üretmeye başlar. Bunun günde sadece 100 kere yaşanması bile saatin bir ayda 6 saniye geri gitmesi anlamına gelir. Bu dalgalanmalar sıcaklık, manyetik alan ve basınçtan kaynaklanabilir yani çoğu zaman kaçınılmazdır. Çok pahalı bazı çipler bu koşullardan etkilenmez ama onları son kullanıcı bilgisayarlarına takmak maliyetlerini çok ciddi bir şekilde artıracağı için tercih edilmez.

Bu noktada bilgisayar saatlerinin ara ara kayması problemini çözmek için NTP (Network Time Protocol) devreye girer. Bilgisayarlarımız sahip oldukları NTP istemcileri ile periyodik olarak kendilerini merkezi NTP sunucuları ile senkronize ederler. NTP sunucuları ise zamanı çok hassas tutabilen kristallerden zamanı alırlar ve ancak birkaç yılda sadece birkaç milisaniye şaşarlar.

Onlar arasında da bir hiyerarşi vardır, bkz: Stratum 0, 1, 2 ve 3. Bu hiyerarşinin sebebi ise yine maliyet maliyet ve maliyet :-)

Son olarak NTP istemcisinin zamanı ayarlarken kullandığı akıl dolu yöntemi anlatalım.

İstemci, periyodik sorgularında sunucu ile arasında kabul edilenin üzerinde bir fark görürse kendi saatini ona göre ayarlar fakat bunu bir anda yapmaz. Örneğin kendi saati 15:11:16 ve sunucu saati 15:11:12 ise saati bir anda 15:11:12'ye çekmez. Yukarıda 100 Hz’lik bir çipin her bir interrupt’ta 10 ms eklediğini söylemiştik. NTP istemcisi bir süre boyunca fark kapanıncaya kadar her bir interrupt’ta 10 ms yerine 9 ms (farazi) ekler, böylece her saniye 100 ms bilinçli olarak geri gider (koşarken arkadaşınız size yetişemediğinde yavaşlamanız gibi). Sonuç olarak istemci aradaki 4 sn (4000 ms)’lik farkı 40 saniyede kapatmış olur. Sistem saatini disipline etme adı verilen bu davranışın sebebi bilgisayarda koşan uygulamaların kafasını karıştırmamaktır. Linux’ta sistem saati adjtime sistem çağrısı ile disipline edilir.

Bu yöntem kullanılmasaydı oluşabilecek bir problem örneği vererek kapatalım. Bir database sunucusunda transaction’ın örnekteki gibi 15:11:16'da başladığını düşünelim. Transaction başladıktan sonra NTP zamanı 15:11:12'ye çeksin ve transaction’ın da 1 saniye sonra yani 15:11:13'te bitsin. Bahsedilen yöntem bu durumda transaction’ın -3 saniye sürmesi gibi absürt bir durumun önüne geçmiş olmaktadır.