UNIX zamanı, bilgisayarınızda UNIX çalıştırarak ölçülür.
Bu cevap, Coördinated Universal Time (UTC), International Atomic Time (TAI) ve SI saniyesinin ne olduğunu bilmenizi bekliyor. Onları açıklanması ise de ötesinde Unix ve Linux Stack Borsası kapsamı. Bu Fizik veya Astronomi Yığın Değişimleri değil.
Donanım
Bilgisayarınız, saatleri ve zamanlayıcıları çalıştıran çeşitli osilatörler içerir. Tam olarak sahip olduğu şey mimarisine bağlı olarak bilgisayardan bilgisayara değişir. Ancak genellikle ve çok genel anlamda:
- Bir yerde, belirli sayıda salınımı saymak ve merkezi işlem birimine bir kesmeyi tetiklemek için programlanabilen programlanabilir bir aralık zamanlayıcısı (PIT) vardır.
- Merkezi işlemcide, yürütülen her komut döngüsü için 1'i sayan bir döngü sayacı vardır .
Çok geniş anlamda operasyon teorisi
İşletim sistemi çekirdeği, keneler oluşturmak için PIT'den yararlanır . PIT'i serbest çalışacak şekilde ayarlar, örneğin saniyenin yüzde biri gibi bir zaman aralığı için doğru salınımları sayar, bir kesinti oluşturur ve ardından sayıyı tekrar gitmek için otomatik olarak sıfırlar. Bununla ilgili varyasyonlar vardır, ancak özünde bu, sabit bir frekansla bir kene kesintisinin yükseltilmesine neden olur .
Yazılımda, çekirdek her tıklamayı bir sayaç arttırır. Kene sıklığını bilir, çünkü PIT'yi en başta programlamıştır. Bu yüzden bir saniyede kaç kenenin oluştuğunu bilir. Bunu, saniye sayan bir sayacı ne zaman artıracağınızı bilmek için kullanabilir. Bu sonuncusu çekirdeğin "UNIX Zamanı" fikridir. Gerçekten de, kendi cihazlarına bırakılırsa SI saniyede bir oranında yukarı doğru sayar.
Bunu çok genel anlamda sunacağım dört şey bunu karmaşıklaştırıyor.
Donanım mükemmel değil. Veri sayfasında N Hertz osilatör frekansına sahip olduğunu söyleyen bir PIT, bunun yerine (örneğin) N .00002 Hertz frekansına sahip olabilir .
Bu şema güç yönetimi ile çok zayıf bir şekilde birlikte çalışıyor, çünkü CPU bir değişkendeki bir sayıyı arttırmaktan çok daha fazlasını yapmak için saniyede yüzlerce kez uyanıyor. Yani bazı işletim sistemleri "tickless" tasarımları olarak bilinen özelliklere sahiptir. PIT'in her kene için bir kesinti göndermesini sağlamak yerine, çekirdek (düşük seviyeli programlayıcıdan) kaç tane kene geçmeyecek kadar iş parçacığı olmadan çalışır ve PIT'i o kadar çok keneyi sayacak şekilde programlar. kene kesinti vermeden önce gelecek. Daha sonra N kenelerin geçişini bir sonraki kene kesintisinde (1 kene yerine) kaydetmesi gerektiğini bilir .
Uygulama yazılımı çekirdeğin geçerli saatini değiştirme yeteneğine sahiptir. Bu edebilir adım değerini veya edebilirsiniz öldürdü değeri. Dönme, saniye sayacını arttırmak için geçmesi gereken kenelerin sayısını ayarlamayı içerir. Saniye Yani sayaç mutlaka ikinci SI başına bir oranında sayılmaz zaten hatta mükemmel osilatörler varsayarak. Adımlama, saniye sayacına yeni bir sayı yazmayı içerir; bu, son saniyenin işaretlenmesinden bu yana genellikle 1 SI saniyeye kadar gerçekleşmez.
Modern çekirdekler sadece saniyeler değil, aynı zamanda nanosaniye de sayar. Ancak, nanosaniye başına bir kez kesme kesintisi olması saçma ve çoğu zaman açıkça mümkün değildir. Döngü sayacı gibi şeyler devreye giriyor. Çekirdek, her saniyedeki (veya her tikteki) döngü sayacı değerini hatırlar ve bir şey nanosaniye cinsinden zamanı bilmek istediğinde, sayacın geçerli değerinden, son saniyeden (veya kaç saniyeden sonra kaç nanosaniye) geçmesi gerektiğini hesaplayabilir. ) işaretleyin. Yine de, talimat döngüsü frekansı değişebileceğinden, güç ve termal yönetim bu durumu tahrip eder, bu nedenle çekirdekler Yüksek Hassasiyetli Olay Zamanlayıcısı (HPET) gibi ek donanıma güvenmek gibi şeyler yapar.
C dili ve POSIX
C dilinin standart kütüphanesi opak türü, açısından zaman açıklanır time_t
, bir yapı türü tm
çeşitli belirtilmiş alanları ile ve benzeri çeşitli kütüphane fonksiyonları time()
, mktime()
ve localtime()
.
Kısaca: C dilinin kendisi sadece time_t
mevcut sayısal veri türlerinden biri olduğunu ve zaman farklarını hesaplamanın tek güvenilir yolunun difftime()
işlev olduğunu garanti eder . time_t
Aslında tamsayı türlerinden biri olan ve Epoch'tan bu yana saniye saydığı daha katı garantiler sağlayan POSIX standardıdır . timespec
Yapı tipini belirleyen POSIX standardıdır .
time()
Fonksiyon bazen sistem çağrısı olarak tanımlanmaktadır. Aslında, günümüzde birçok sistemde uzun zamandır altta yatan sistem çağrısı olmamıştır. FreeBSD'de, örneğin, clock_gettime()
saniye veya saniye + nanosaniye cinsinden çeşitli şekillerde ölçülen çeşitli "saatler" mevcut olan temel sistem çağrısıdır . Uygulama yazılımının çekirdekten UNIX Zamanını okuduğu bu sistem çağrısıdır. (Eşleşen bir clock_settime()
sistem çağrısı, adım atmalarına ve bir adjtime()
sistem çağrısı, onları döndürmelerine izin verir.)
Birçok kişi POSIX standardını, reçete ettiği şey hakkında çok kesin ve kesin iddialarla dalgalandırır. Bu insanlar çoğu zaman POSIX standardını okumazlar . Gerekçesi belirtildiği gibi, standardın kullandığı ifade olan "Çağdan beri saniye" sayma fikri, kasıtlı olarak POSIX saniyelerinin SI saniye ile aynı uzunlukta olmadığını veya sonucunun gmtime()
"zorunlu olarak" UTC, görünümüne rağmen ". POSIX standardı kasıtlı olarakyöneticinin gittiği ve artık saniye ayarlamalarını bir hafta sonra yeniden ayarlayarak manuel olarak düzelttiği bir UNIX sistemine izin veren (diyelim) kadar gevşek. Aslında, mantık, saatin mevcut UTC saati dışında bir zamana kasıtlı olarak yanlış ayarlandığı sistemleri barındırmak için kasıtlı olarak gevşek olduğunu göstermektedir .
UTC ve TAI
Çekirdekten elde edilen UNIX Zamanının yorumlanması, uygulamalarda çalışan kütüphane rutinlerine kadardır. POSIX, çekirdeğin zamanı ile a'daki "arıza süresi" arasında bir kimlik belirtir struct tm
. Ancak, Daniel J. Bernstein'ın bir zamanlar belirttiği gibi, standardın 1997 baskısı, bu kimliği utanç verici bir şekilde yanlış yaptı, Gregoryen Takviminin sıçrama yıl kuralını (okul çocuklarının öğrendiği bir şey) berbat etti, böylece hesaplama 2100 yılından itibaren hatalıydı. "İhlalde uyulmaktan daha şerefli olan" ifadesi kolayca akla gelen bir ifadedir.
Ve gerçekten de öyle. Günümüzde birçok sistem, bu yorumu Arthur David Olson tarafından yazılan, genellikle altındaki veritabanı dosyalarında kodlanmış olan meşhur "Olson saat dilimi veritabanına" danışan kütüphane rutinlerine dayandırmaktadır /usr/share/zoneinfo/
. Olson sisteminin iki modu vardı:
- Çekirdeğin "Epoch'tan bu yana geçen saniye sayısı", artık saniye hariç 1970-01-01 00:00:00 UTC'den beri UTC saniye sayılır. Bu
posix/
, Olson saat dilimi veritabanı dosyaları kümesini kullanır . Tüm günler 86400 çekirdek saniyeye sahiptir ve bir dakika içinde asla 61 saniye yoktur, ancak her zaman bir SI saniyesinin uzunluğu değildir ve artık saniye oluştuğunda çekirdek saatinin dönmesi veya adımlanması gerekir.
- Çekirdeğin "Çağdan bu yana geçen saniye", 1970-01-01 00:00:10 TAI'den bu yana TAI saniye saydığı düşünülmektedir. Bu
right/
, Olson saat dilimi veritabanı dosyaları kümesini kullanır . Çekirdek saniyeleri 1 SI saniye uzunluğundadır ve çekirdek saatinin artık saniye saniye ayarlamak için dönme veya adım atmasına gerek yoktur, ancak kırılma süreleri 23:59:60 gibi değerlere sahip olabilir ve günler her zaman 86400 çekirdek saniye uzunluğunda değildir.
Bernstein, 1970-01-01 00:00:00 TAI'den bu yana TAI saniyelerini almak için sadece 10 ekledikleri için , daemontools
araç takımı da dahil olmak üzere birkaç araç yazdı . Bunu manuel sayfada belgeledi.right/
time_t
Bu gereklilik (belki bilmeyerek) gibi toolsets miras oldu daemontools-encore
ve runit
Felix von Leitner en tarafından libowfat
. Örneğin Olson yapılandırmasıyla Bernsteinmultilog
, Guentermultilog
veya Papesvlogd
kullanın posix/
ve tüm TAI64N zaman damgaları (bunu yazarken) 1970-01-01 00:00:10'dan bu yana gerçek TAI ikinci sayımının 26 saniye gerisindedir TAI.
Laurent Bercot ve ben, farklı yaklaşımlar alsak da, s6 ve nosh'ta buna değindik. M. Bercot's tai_from_sysclock()
derleme zamanı bayrağına dayanıyor. En TAI64N bakışta anlaşma olduğunu nosh araçlar TZ
ve TZDIR
çevre değişkenleri otomatik olarak algılama posix/
ve right/
onlar eğer.
İlginç bir şekilde, FreeBSD belgeleri time2posix()
ve posix2time()
Olson right/
modunun time_t
TAI saniye olarak eşdeğer olmasına izin veren belgeler ve fonksiyonlar . Ancak görünüşe göre etkin değillerdir.
Bir kere daha…
UNIX zamanı, UNIX çalıştıran bilgisayarınızda, bilgisayarınızın donanımında bulunan osilatörler tarafından ölçülür. SI saniye kullanmaz; yüzeysel olarak benzese bile UTC değildir; ve kasıtlı olarak saatinizin yanlış olmasına izin verir.
daha fazla okuma