スケジューリングがタコだと使い勝手が良くない(コンピュータも人間も)

Code Camp (201004)id:Voluntas にインスパイアされたことのまとめ

どんなにCPUが早くてもスケジューリング(タスク管理)がタコなOSが入っているとイマイチ使い勝手が良くない。

外部との相互作用が少ない、純粋にCPUの演算能力に依存したタスクの場合はタスクの実行に必要な情報を全部メモリやキャッシュなどの「高速にアクセスできる記憶領域」に乗せて処理するのが効率いい。つまり自分ひとりで完結する頭脳労働中心のタスクは、閉じこもってコーラだけ飲んで48時間ぶっとおしでコードを書いたりするのが効率いい。

学生などの時にこのタスク管理方法での成功体験があると「この方法がよい」「自分向きだ」と勘違いしてしまいがち。それは違う。この方法ではマルチタスクが困難だ。どんな人も複数の仕事を抱えるより一つのことに専念した方が効率がいい。だからこの方法(シングルタスク的タスク管理)の方が効率が良いように感じるのは当たり前。かといって「マルチタスクにすると効率が落ちるから、このOSはシングルタスクです」なんてOSの使い勝手はよくない。マルチタスクはもはや社会の要求仕様。他の個体からのアクセスに妥当な時間以内に返答を返すことが重要。仕様を無視してもやっていけるのはものすごくCPUの演算能力が高い例外的な人だけ。

古いCPU設計では、タスク切り替えには時間がかかり、その間CPUは何も直接的に意味のある仕事ができなかった。そのため、初期のOSでは不要なタスク切り替えを可能な限り排除してCPU時間を無駄遣いしないようにしていた。 --- リアルタイムオペレーティングシステム - Wikipedia


社会が求めているのは「お膳立てが完全に整った時に発揮する、個人の価値創造の瞬間最高速度」ではなく「ある程度の長さの期間に周りの人との相互作用で作り出す価値の平均速度」なんだ。


さて、外部との相互作用があるタスクの場合「割り込みによって強制的にコンテキストが切り替えられる可能性」を想定したタスク管理の方法を使う必要がある。外部からの割り込みがあるにもかかわらず上記のシングルタスク的管理をしていると、割り込みのたびに「脳内」という揮発性の記憶領域に置いていた情報が消えてしまってコストが高い。
「割り込みがあった時点で脳内の情報を揮発しないなにかに書き出す」という設計は一見うまく行くように思える。実際にうまく行く環境もある。それは「タスク切り替えの要求があってから、実際に切り替えるまでに使っていい時間の長さ」に依存する。電話がかかってきたり、上司が隣に座っていて話しかけてくるような状況では脳内の情報を書き出す時間が無い。
結局のところ「コンテキスト情報を揮発しない媒体に保存する」しか選択肢はない。実装を進めることよりも、思いついたことやどういう方針で進めようと思っているか、方針Bを採用しなかった理由は何か、などの情報をすべて書き出して永続化することを優先する方法だ。最初のシングルタスク的管理に比べるとこの「I/Oが遅い媒体への保存」のオーバーヘッドは時間の無駄に思える。がしかし「いつでも切り替えられる」という属性を身につける上では支払うべきコストなのだ。



タスク管理の得意な人は、いつ割り込みが入りそうか予測できる。自分がタスクにかかる時間を見積もれる。予期しない割り込みがあっても脳内で「後で時間ができたときに書きだすべきコンテキスト情報」を保持できる。だから無理のない予定を組み、割り込みのなさそうな時間帯にはシングルタスクモードで高速に処理をし、たまに予期しない割り込みがあっても動じない。しかし僕みたいなタスク管理の苦手な人間にそれはできない。だからこそ体系的にタスク管理をする必要がある。

GTDの一番のコンセプトは「タスクの情報を脳に保持せず、すべて揮発しない媒体へ出力せよ」であった。「タスクの情報」とは「どういうタスクがあるか」だけではない。諸々のコンテキスト情報も含まれるのだ。