Unix Saati / Resmi Saati Nerede Ölçülür? [kapalı]


20

Feragatname:

Ben sadece bu yazı nereye anlamaya çalışırken yaklaşık 20 dakika boyunca StackExchange siteleri listesi üzerinden gitti. Herhangi bir siteyi daha uygun biliyorsanız, lütfen bu soruyu oraya taşıyın. Bunu buraya gönderiyorum çünkü unix zamanı beni düşündürdü.


Hepimizin bildiği gibi, unix zamanı ve UTC var. Unix zamanı sadece saniyede bir saniye olmak üzere saniyeleri saymaya devam ediyor, oysa UTC kullandığımız insan tarafından okunabilir formatlarda zamanı Dünya'nın dönüşü ile aynı hizada tutmaya çalışıyor. Bunu yapmak için UTC zaman zaman sıçrama saniye ekler.

Zaman, zamanın maruz kaldığı cismin, diğer hızlanma türlerinin ve nispi hızın çekim kuvvetine göreli olduğundan, bu 2 soruya yol açar. Önce basit olanı aşalım: Unix zamanı nerede ölçülür? Alice ve Bob aynı anda bulundukları zamanın 1467932496.42732894722748 olduğunu kabul etmeye başlarlarsa (bir saniye tabii ki sezyum-133'ün iki enerji seviyesi arasındaki geçişe karşılık gelen 9'192'631'770 radyasyon döngüsü olarak tanımlanır. dinlenme ve 0 K'da atom), Alice deniz seviyesinde yaşayan Bob ve dağlarda yüksek yaşayan Bob veya kuzey kutbu yaşayan Alice ve ekvatorda yaşayan Bob nedeniyle artık bir ikilem yaşayın. Peki unix zamanı tam olarak nasıl tanımlanır?

Başlangıçta UTC ile olan sorunu göremeyebilirsiniz, çünkü dünya yörüngeyi tamamladığında herkes herkes üzerinde anlaşabilir (bu elbette kıtasal plaka hareketini görmezden geliyor ama bence bunu oldukça iyi anladık çünkü GPS ile hareketlerini ölçmek mümkün çok hassas bir şekilde ve modelimizde belirli bir konumda olduklarını ve kıta plakaları değiştikçe hareket etmediklerini varsayabiliriz), dağda, deniz seviyesinde, ekvatorda veya kuzey kutbunda olsunlar. Bazı zaman farklılıkları olabilir ama birikmezler.

Ancak bir saniye, dinlenme halindeki sezyum-133 atomunun iki enerji seviyesi arasındaki ve 0 K ve sezyum-133 atomundaki iki enerji seviyesi arasındaki geçişe karşılık gelen 9'192'631'770 radyasyon döngüsü olarak tanımlanır. Böylece UTC, bir saniyenin nereye ekleneceğine karar verir, ancak dünyanın yörüngesinin fazı ile bir yerde bir atom saati ile ölçülen zaman arasında ölçülen veya tahmin edilen bir değişim olması gerekir . Nerede bu?


5
"Unix zamanı sadece saniyede bir saniye - saniye olarak saymaya devam ediyor, aslında öyle değil. Olsaydı işler daha kolay olurdu.
Ocaklar

3
Sormak istediğini düşündüğüm soru Fizik konusunda olurdu - ama UTC gibi zaman standartları hakkında bir soru ve UNIX zamanı ile ilgisi yok. Ayrıca bu , bu ve diğer ilgili sorulara bakın.
David Z

7
Bu soruyu konu dışı olarak kapatmak için oy kullanıyorum çünkü fizik, politika ve zamansal standartlarla ilgili, ancak Unix ile ilgili değil.
Michael Homer

3
Orada muhtemelen sorabilirdin bu alanda bir konuyla soru yerde, ama bu o sanmıyorum. Sadece "... ve nasıl Unix?" cevapların gösterdiği gibi ara sıra ilgisiz bir soruya attı.
Michael Homer

Yanıtlar:


30

Başlık sorunuzun gerçek bir cevabı yok; Unix zamanı gerçek bir zaman ölçeği değildir ve hiçbir yerde "ölçülmez". UTC'nin bir temsilidir, ancak fakir de olsa, UTC'de temsil edemediği anlar vardır. Unix süresi her gün 86.400 saniye olduğu konusunda ısrar ediyor, ancak UTC artık saniye nedeniyle sapıyor.

Daha geniş sorunuzla ilgili olarak, dört önemli zaman çizelgesi vardır:

  1. Dünyadaki sabit yıldızlara göre dönmesini ölçen gözlemevleri tarafından hesaplanan UT1 (Evrensel Zaman). Bu gözlemler ve biraz matematikle, Greenwich'teki Kraliyet Gözlemevi'nde güneş öğlen anına dayanan eski Greenwich Ortalama Zamanının daha modern bir versiyonunu alıyoruz. Evrensel Zaman, IERS (Uluslararası Dünya Rotasyon ve Referans Sistemleri Hizmeti, eski adıyla Uluslararası Dünya Rotasyon Hizmeti) adı verilen bir kuruluş tarafından hesaplanır .

  2. Dünya çapında yüzlerce atom saati tarafından tutulan TAI (Uluslararası Atomik Zaman), ulusal standartlar organları ve benzeri tarafından korunmaktadır. TAI'ye katkıda bulunan saatlerin bekçileri, saatlerini birbirine doğru yönlendirmek için zaman aktarma tekniklerini kullanır, bireysel saatlerin küçük hatalarını iptal eder ve bir topluluk zamanı oluşturur; Topluluk TAI, SI birim sisteminin komutanları Uluslararası Ağırlık ve Ölçü Bürosu (BIPM) tarafından yayınlanan TAI'dir. Zaman uzaması ile ilgili sorunuzu cevaplamak için TAI, deniz seviyesinde atomik zaman olarak tanımlanır (aslında, aynı fikrin daha meraklı bir versiyonu olan geoid'de) ve her saat kendi irtifasının etkilerini düzeltir.

  3. UTC (Eşgüdümlü Evrensel Saat). UTC, 1 Ocak 1972'de TAI'nin on saniyesine eşit olarak ayarlandı ve o tarihten bu yana, artık saniye eklendiği veya çıkarıldığı durumlar dışında, TAI ile tam olarak aynı hızda ilerliyor. IERS, farkı 0,9 saniye içinde tutmak için bir saniye saniye duyurma kararı verir (uygulamada, yaklaşık 0,6 saniye içinde; eklenen bir saniye, farkın -0,6'dan +0,4'e gitmesine neden olur). Teorik olarak, sıçrama saniyeleri hem pozitif hem de negatif olabilir, ancak SI ve TAI tarafından belirlenen standarda göre dünyanın dönmesi yavaşladığı için, negatif bir sıçrama saniye hiç gerekli olmamış ve muhtemelen hiç olmayacaktır.

  4. UTC'yi tek bir sayı olarak göstermek için elinden gelenin en iyisini yapan Unix zamanı. 86.400'ün katı olan her Unix zamanı, gece yarısı UTC'sine karşılık gelir. Tüm UTC günleri 86.400 saniye uzunluğunda olmadığından, ancak tüm "Unix günleri" olmadığından, bir şekilde yamalanması gereken uzlaşmaz bir fark vardır. Eklenen artık saniyeye karşılık gelen Unix zamanı yoktur. Uygulamada, sistemler ya bir önceki saniye iki kez gerçekleşmiş gibi çalışır (unix zaman damgası bir saniye geriye doğru atlar, sonra tekrar ilerler) veya her iki tarafında daha uzun bir süre boyunca sıçrayan sıçrama bulaşması gibi bir teknik uygular bir saniye. Her iki durumda da en azından ikincisi monotonik olmasına rağmen bazı yanlışlıklar vardır. Her iki durumda da,ve b , ba'ya eşit değildir; ba artı müdahale eden saniye sayısı eşittir .

UT1, TAI, UTC ve IERS dünya çapında, çok uluslu çabalar olduğundan, IERS bültenleri Paris Gözlemevi'nden yayınlanmasına ve BIPM de Paris'te olmasına rağmen, tek bir "nerede" yoktur. Kesin ve izlenebilir zaman gerektiren bir kuruluş zaman tabanlarını "UTC (USNO)" gibi bir şey olarak belirtebilir, bu da zaman damgalarının UTC'de olduğu ve ABD Deniz Gözlemevi'ndeki zamandan türetildiği, ancak Unix zamanından bahsetmiştim, temelde bu hassasiyet seviyesiyle uyumsuz - gerçekten kesin zamanla uğraşan herkes Unix zamanına bir alternatif olacak.


1
right/Olson sistemindeki zaman dilimlerinin varlığını ve nasıl saygı duyduklarını göz ardı ettiniz time_t.
JdeBP

1
@JdeBP Aslında bunu duymamıştım. Bence hem POSIX hem de uzun zamandır devam eden konvansiyona açıkça karşı koyulduğunda, Unix zamanını çağırmak biraz şüpheli, ama yine de değerli bilgiler. Belki bu konuda bir cevap ekleyebilirsiniz?
Ocaklar

1
Sıradan insanlar için son derece hassas bir zaman kaynağına ulaşmanın en kolay yolu GPS alıcısıdır. Uydulardaki saatler TAI ile senkronize edilir ve sinyal yaklaşık 10⁻⁸ s'ye kadar doğrudur (düzeltmeler olmadan; düzeltmelerle 10⁻¹⁰'ye geliştirilebilir).
Jan Hudec

1
@JanHudec Sıradan insanların 10⁻² veya 10⁻¹⁰ doğru bir saat arasındaki farkı söyleyebileceği gibi değil.
gerrit

1
UNIX'in neden artık ikinci destek içermediğine dair bir ipucu. Bu, Austin Grubu telekonferansında birçok kez tartışılmıştır ve sonuç, artık saniye için destek eklemenin, desteğin atlanmasından daha fazla soruna neden olacağıydı.
schily

12

Saate ayarlamalar IERS tarafından koordine edilir. Gerekirse zaman akışına bir artık saniye eklenmesini zamanlarlar.

Gönderen NTP Zaman ölçeği ve Leap Saniyede

Uluslararası Yer Dönme Servis Paris Gözlemevi de (IERS) UT1 Toprak dönme düzensiz değişimler düzeltilmiş (gezginin) zaman ölçeği belirlemek için USNO'nun ve diğer gözlemevi tarafından sağlanan astronomik gözlemler kullanır.

Bildiğim kadarıyla Ertesi gün 23:59:60 (Artık saniye) ve 00:00:00, Unix Time'da aynı saniye olarak kabul edilir.


8

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_tmevcut 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_tAslında tamsayı türlerinden biri olan ve Epoch'tan bu yana saniye saydığı daha katı garantiler sağlayan POSIX standardıdır . timespecYapı 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 , daemontoolsaraç 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-encoreve runitFelix 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 TZve 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_tTAI 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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.