物理クロック

分散システム

                                       電子・情報工学系
                                       新城 靖
                                       <yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/dsys-1997/1998-02-10 /physical-clock.html
あるいは、次のページから手繰っていくこともできます。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/
http://www.hlla.is.tsukuba.ac.jp/~yas/index-j.html

■物理クロック

単に1つの分散アプリケーション内部でつじつまがあうだけでなく、 日常的な時計とも合っている必要がある。 2つの評価尺度

◆平均太陽秒

南中から南中までの時間の平均を、1/(24*60*60) にしたもの。

けっこうふらつく。

◆原子時計

セシウム(Cs)133 が 91億9263万1770回振動する時間を1秒とする。 (9,192,631,770)

カウンタは、いいものが作れる。

国際原子時(International Atomic Time): 1958年1月1日0:00:00からのセシウム133の振動数で定義。 世界各地の振動数の観測を、BIH (Bereau International de 1'Heure) 平均し て、91億9263万1770で割る。

平均太陽日よりも3ミリ秒少ない。

◆UTC (Universal Coordinated Time)

協定世界時:国際原子時と太陽時間との相違が800ミリ秒になると 閏秒をいれる。

12月31日23:59:59の後に12月31日23:59:60を入れる。

GMT (Greenwich Mean Time) は、もう古い。

今までに30秒以上入っている。 最近入ったのは、 1997/07/01 08:59:60

◆UTCの供給元

◆UNIX の時刻


#include YHM_Escape()

struct timeval {
	long	tv_sec;		/* seconds */
	long	tv_usec;	/* and microseconds */
};

main()
{
    struct timeval t ;
    struct timezone tz ;
	gettimeofday( &t, &tz );
}
tv_sec は、1970年1月1日 0:00:00 からの経過時刻。閏秒に関しては、未定義。

設定は、settimeofday()

◆rdateコマンド

他のマシンから時刻を取得(daytime)して、それを自分の時計にセット (settimeofday())する。

◆Berkeley timed

時刻の設定を自動化。 特徴

◆adjtime() システム・コール

じわりじわりと時計を合わせる。
int adjtime(struct timeval *delta, struct timeval *olddelta);
時計の進み方を調整する。
遅れている時
delta を正にして、時計の進み方を速くする
進んでいる時
delta を負にして、時計の進み方を遅くする

◆NTP(Network Time Protocol)

図 NTP で使う offset と delay
図 NTP で使う offset と delay

時刻差(通信遅延を往復で等しいと仮定)

offset[i] = (t[i-1]+t[i-2])/2 - (t[i1]-[ti+3])/2

この時刻差が0になるように adjtime() で調整する。

参考:RFC1305 Network Time Protocol (Version 3) Specification, Implementation and Analysis

◆同期クロックの利用(1)

最大1回メッセージ配信(at-most-once message deliverty)

通常の方法:メッセージに固有の識別子を付ける。 サーバは、メッセージの識別子をすべて保存する(history)。 再転送の時に、重複が検出できる。 (ニュース・システムと類似)。

問題点

解決方法:メッセージにタイムスタンプを持たせる。

コネクションごとに、最も新しいメッセージのタイムスタンプを記録する。 記録しているものより古い時には、重複として捨てる。

history を expire するために、次の式を計算する。


G = CurrentTime - MaxLifetime - MaxClockSkew

G より古いものは、捨てる。
CurrentTime
現在時刻
MaxLifetime
メッセージが存在しうる最大時間
MaxClockSkew
時計がどのくらい UTC からずれているか

◆同期クロックの利用(2)

クロック・ベースのキャッシュの一貫性

ファイルを書き込む時に、古いキャッシュを無効化するのがたいへん。

クライアントがファイルを要求すると、そのコピーがどれだけの時間有効かを 規定するリース期間(lease)が与える。

リース期間が切れても、まだ必要ならば、クライアントは、サーバに最新のも のかどうかを問い合わせる。

書き込みが起きると、リース期間の繰り上げを行う。クライアントからの繰り 上げに対する応答がない時には、リース期間が切れるまで待つ。(リース期間 がないと、クライアントがダウンしているか、単に返事が遅いだけなのか、区 別ができない。)


[論理クロック] [物理クロック] [相互排除]
↑[もどる] ←[2月3日] ・[2月10日] →[2月17日]
Last updated: 1998/02/10 01:59:28
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>