コンピュータと人間の時間経過の感覚
概要
「コンピュータの時間の刻み方」と「人間の時間経過の感覚」の類似性に関する雑考
コンピュータの時間の刻み方
一般的な PC や WS は、ブート時だけマザーボード上の時計から現在時刻を取得します。しかし、その後OSは、CPUのクロック割り込みをカウントすることで、現在時刻を更新していきます。
(割り込み周期は 66-1000Hz程度。100Hz が多い。ただ、Linux は 2.6以降、250H/1000Hz が多い)
クロック割り込みの取りこぼし
一般にクロック割り込みは、高い優先度に設定されていて、クロック割り込みの取りこぼし(カウンタアップ漏れ=時計の遅れ) をなるべく防ぐようになっています。とはいえ、遅れるのを目撃したことはあります(*1)
現代(2008年頃)ではクロック割り込みに起因する時計の遅れを実感できるのは、VMWare等の仮想マシン上です。時計の進みは、クロック割り込みの回数をカウントしているわけですから、実ハードウェアと同じ回数と間隔でゲストマシン上も割り込みを発生させたことにしなくてはなりません。
が、実際にはそれは難しく、ホストOSの負荷によっては、ゲストOSの割り込みが揺らぐだけでなく、それ自体を取りこぼすことがあります。
すると、時計の遅れとなって、体感できるようになります。(*2)
(なお、時間の揺らぎだけでも、リアルタイム会議サーバのような usec 単位で帯域制御用の測定&計算しているサーバにとっては、かなり問題となります)
人間の時間感覚とクロック割り込みの類似性
さてここで、一気に人間の時間感覚に話を飛躍させます。
上記の仕組みを知っていると、人間の時間感覚は、前述のクロック割り込みの仕組みに近いのでは?と感じることがよくあります。
たとえば、人間は興味があることに熱中していると、時間がたつのが早く感じることが多いものです。これを上記の仕組みを想定すると、以下のような仕組みを連想させます。
- 熱中している → 脳内負荷が高い
- クロック割り込みの取りこぼしが頻発
- (外部時計に比べ)主観時計が遅れる
- 主観時計に比べ外部時計の進みが速いことを見つけて驚く
逆に、退屈な会議の間は、なかなか時間が過ぎないわけですが、これも、
- 退屈 → 脳内負荷が低い
- 通常のクロック割り込みを取りこぼさない
- 退屈のあまり時計を意識するたびに無駄にクロックカウンタを増やしている
- 主観時計に比べて外部時計の進みが遅すぎると感じる
という解釈ができそうです。
また、一般に、年齢を重ねるにつれて、時間の流れが速くなったと感じる人が多いようです。
年齢を重ねるごとに心拍数や細胞分裂の速度等が落ちますので、心拍・代謝・分裂などのイベント=クロックと考えると、
- クロック低下
- 単位時間あたりの割り込み回数低下
- 主観時計の遅れ
ということを連想させます。
…とはいえ、実際のところがどうなっているのかは不明です(笑)
皆様の仮説もあればお聞かせください。
備考
(*1) 昔、会社の基幹メールサーバ兼開発マシンだった Sun WS で昼夜を問わず、CPU および HDD に非常に高負荷をかけ続けていた人がいて、そのとき、時計が1日数分レベルで遅れていたのを目撃したことがあります。最後にはついに HDD が壊れたので、もしかしたら、HDD/SCSIドライバのディスク割り込みのエラー/リトライ等の異常系処理において、割り込み禁止区間が長すぎる作りになっていたのかもしれません。
(*2) VMWare tools では足りない分をまとめて割り込みを連続発行したり、逆に、Linux にはクロック割り込みの揺らぎや取りこぼしを補正するようなルーチンもあるらしく、それが働くと、逆に進みすぎることもあるようです。2009/10/28 追記
高い優先度で実行される、クロック割り込みの一番の目的は、タスクを強制的にスイッチする(+再スケジューリングやアラーム系の処理等)ことにあります。(プリエンプティブ制御)
さらに、Linux 2.6以降などでは、クロック割り込みとプロセスからのI/O要求時以外に、各種デバイスの割り込み処理(I/O完了通知等)などのイベントでもタスク切り替えや再スケジューリングが行われるようになっています。
つまり、従来よりも、粒度の細かいスケジューリングをしてくれます。(その分、若干、オーバーヘッドは増えてしまいますが)