Powered by PENS
2009:
1月(1)(2) 2月(1)(2)
3月(1)(2) 4月(1)(2)
5月(1)(2) 6月(1)(2)
7月(1)(2) 8月(1)(2)
9月(1)(2) 10月(1)(2)
11月(1)(2) 12月(1)(2)
2010:
1月(1)(2) 2月(1)(2)
3月(1)(2) 4月(1)(2)
5月(1)(2) 6月(1)(2)
7月(1)(2) 8月(1)(2)
9月(1)(2) 10月(1)(2)
11月(1)(2) 12月(1)(2)
2011:
1月(1)(2) 2月(1)(2)
3月(1)(2) 4月(1)(2)
5月(1)(2) 6月(1)(2)
7月(1)(2) 8月(1)(2)
9月(1)(2) 10月(1)(2)
11月(1)(2) 12月(1)(2)
2012:
1月(1)(2) 2月(1)(2)
3月(1)(2) 4月(1)(2)
5月(1)(2) 6月(1)(2)
7月(1)(2) 8月(1)(2)
9月(1)(2) 10月(1)(2)
11月(1)(2) 12月(1)(2)
2013:
1月(1)(2) 2月(1)(2)
3月(1)(2) 4月(1)(2)
5月(1)(2) 6月(1)(2)
7月(1)(2) 8月(1)(2)
9月(1)(2) 10月(1)(2)
11月(1)(2) 12月(1)(2)
2014:
1月(1)(2) 2月(1)(2)
3月(1)(2) 4月(1)(2)
5月(1)(2) 6月(1)(2)
7月(1)(2) 8月(1)(2)
9月(1)(2) 10月(1)(2)
11月(1)(2) 12月(1)(2)
2015:
1月(1)(2) 2月(1)(2)
3月(1)(2) 4月(1)(2)
5月(1)(2) 6月(1)(2)
7月(1)(2) 8月(1)(2)
9月(1)(2) 10月(1)(2)
11月(1)(2) 12月(1)(2)
2016:
1月(1)(2) 2月(1)(2)
3月(1)(2) 4月(1)(2)
5月(1)(2) 6月(1)(2)
7月(1)(2) 8月(1)(2)
9月(1)(2) 10月(1)(2)
11月(1)(2) 12月(1)(2)
2017:
1月(1)(2)
2月(1)(2) 3月(1)(2)
4月(1)(2) 5月(1)(2)
6月(1)(2) 7月(1)(2)
8月(1)(2) 9月(1)(2)
10月(1)(2) 11月(1)(2)
12月(1)(2)
2018:
1月(1)(2) 2月(1)(2)
3月(1)(2) 4月(1)(2)
5月(1)(2) 6月(1)(2)
7月(1)(2) 8月(1)(2)
9月(1)(2) 10月(1)(2)
11月(1)(2) 12月(1)(2)
2019:
1月(1)(2) 2月(1)(2)
3月(1)(2) 4月(1)(2)
5月(1)(2) 6月(1)(2) 7月(1)(2) 8月(1)(2) 9月(1)(2) 10月(1)(2) 11月(1)(2) 12月(1)(2)
2020:
1月(1)(2) 2月(1)(2)
3月(1)(2) 4月(1)(2)
5月(1)(2) 6月(1)(2)
7月(1)(2) 8月(1)(2)
9月(1)(2) 10月(1)(2)
11月(1)(2) 12月(1)(2)
2021:
1月(1)(2) 2月(1)(2)
3月(1)(2) 4月(1)(2)
5月(1)(2) 6月(1)(2)
7月(1)(2) 8月(1)(2)
9月(1)(2) 10月(1)(2)
11月(1)(2) 12月(1)(2)
2022:
1月(1)(2) 2月(1)(2)
3月(1)(2) 4月(1)(2)
5月(1)(2) 6月(1)(2)
7月(1)(2) 8月(1)(2)
9月(1)(2) 10月(1)(2)
11月(1)(2) 12月(1)(2)
2023:
1月(1)(2) 2月(1)(2)
3月(1)(2) 4月(1)(2)
5月(1)(2) 6月(1)(2)
7月(1)(2) 8月(1)(2)
9月(1)(2) 10月(1)(2)
11月(1)(2) 12月(1)(2)
2024:
1月(1)(2) 2月(1)(2)
3月(1)(2)
今月のアルバム U.S. Beers! [ 投稿 | 編集 ]
京都に着いた。気分は最悪だが…。なにしろ、泥酔状態で新宿発の夜行バスに乗り、7時間も揺られていたのだ。軽く二日酔いでコーヒーも泥水にしか感じない。(ほんとうに泥水なのかもしれない。)
これからニシコレと合流して福岡まで高速に乗って帰る。想像以上にしんどいかも…。
なんやかんやで時間が経ってしまったが、update_wall_time()
の続き。
HPET の場合、clock
は clocksource_hpet
となる。
static void update_wall_time(void) { cycle_t offset; /* Make sure we're fully resumed: */ if (unlikely(timekeeping_suspended)) return; offset = (clocksource_read(clock) - clock->cycle_last) & clock->mask; /* clocksource のカウンタが前回からどれだけ進んだか。*/ clock->xtime_nsec += (s64)xtime.tv_nsec << clock->shift; /* この行が加算になっている気持ちは何? */ 追記:おそらく、xtime.tv_nsec の有効桁以下を考慮した処理をするため。*/ /* normally this loop will run just once, however in the * case of lost or late ticks, it will accumulate correctly. */ while (offset >= clock->cycle_interval) { /* accumulate one interval */ clock->xtime_nsec += clock->xtime_interval; clock->cycle_last += clock->cycle_interval; offset -= clock->cycle_interval; /* 1 tick 進める。xtime 更新はまだ。*/ /* nsec が 1 秒を超えた場合 */ if (clock->xtime_nsec >= (u64)NSEC_PER_SEC << clock->shift) { clock->xtime_nsec -= (u64)NSEC_PER_SEC << clock->shift; xtime.tv_sec++; second_overflow(); } /* interpolator bits (時刻補間処理) */ time_interpolator_update(clock->xtime_interval >> clock->shift); /* increment the NTP state machine */ /* tick 補正量を更新する。*/ update_ntp_one_tick(); /* accumulate error between NTP and clock interval */ clock->error += current_tick_length(); clock->error -= clock->xtime_interval << (TICK_LENGTH_SHIFT - clock->shift); } /* correct the clock when NTP error is too big */ /* tick 毎の nsec 値などを補正 */ clocksource_adjust(clock, offset); /* store full nanoseconds into xtime */ xtime.tv_nsec = (s64)clock->xtime_nsec >> clock->shift; clock->xtime_nsec -= (s64)xtime.tv_nsec << clock->shift; /* check to see if there is a new clocksource to use */ /* clocksource の切り替えがあったかどうか */ if (change_clocksource()) { clock->error = 0; clock->xtime_nsec = 0; clocksource_calculate_interval(clock, tick_nsec); } }
結局のところ、細かい補正ばかりやっているという印象だった。 RHEL4 から変わったのは clocksource の導入だけであり、 基本的な動作はほぼ同じで、正直あまり意味なかった…。
今日は、RHEL5 のタイマ割り込み周辺を見てみる。 RHEL4 は一通り見たのだけど、一部大きく変わっているようなので。
timer_interrupt() @ arch/i386/kernel/time.c
あたりから。
xtime_lock
のロックを取る。do_timer_interrupt_hook() @ include/asm-i386/mach-default/do_timer.h
tick_divider
という謎のカーネルオプションあり。
tick_divider
の回数だけ以下の処理を繰り返す。
デフォルトでは 1 のようなので、無視しても良いだろう。
do_timer() @ kernel/timer.c
jiffies_64
をインクリメント。update_times()
ticks = jiffies - wall_jiffies
wall_jiffies += ticks
update_wall_time()
★ここが大きく変わっているcalc_load(ticks)
ロードアベレージの計算update_process_times() @ kernel/timer.c
current
のユーザー時間あるいはシステム時間を増加させる。
各 CPU 毎に用意されている cpustat
の情報も更新する。run_local_timers()
raise_softirq()
ソフト割り込みsoftlockup_tick()
soft lockup 検出処理scheduler_tick()
tick 毎のスケジューラ処理run_posix_cpu_timers()
タイマー処理profile_tick() @ kernel/profile.c
プロファイリングのための処理やフックがある。xtime_lock
をアンロック。update_wall_time()
が気になっていたので詳しく見ていこう。
まず、clocksource の概念があるのが RHEL4 とは大きく異なる。 clocksource とは、時間を進めるために使用するハードウェアや機構を抽象化したもののようで、 RHEL5 では使用する clocksource を動的に切り替えることもできるようだ。
[root@lab ~]# cat /sys/devices/system/clocksource/clocksource0/available_clocksource acpi_pm jiffies hpet tsc pit [root@lab ~]# cat /sys/devices/system/clocksource/clocksource0/current_clocksource hpet [root@lab ~]# echo tsc > /sys/devices/system/clocksource/clocksource0/current_clocksource [root@lab ~]# cat /sys/devices/system/clocksource/clocksource0/current_clocksource tsc [root@lab ~]# dmesg | grep clocksource Time: hpet clocksource has been installed. Time: tsc clocksource has been installed.
続く。
コーヒー豆をもらったのだが、名前がネタすぎる・・・ 「ウマ/プルプル」て・・・生まれたての子馬かい。
ちなみに味は酸味が強めな印象で、香りは・・・良いんだけど特に印象なし。まだ香りがわかるほどツウではないので。
新しく買った真っ白なシャツに、担々麺のスープが飛び散ってガックリ…
という夢を見たのだが、これは何を暗示しているのか。謎は深まるばかり。