仕事に効くコンピュータサイエンス
マルチタスクの嘘 — プロセスとコンテキストスイッチ読了目安 10分

切り替えるたびに払っている税金 — コンテキストスイッチのコスト

このページの問いは、「切り替え」そのものにどれだけのコストが乗っているか、です。前のページで、案件をまたぐ移動は重いと述べました。ここでは、その重さの正体を分解します。重さの正体が分かれば、次のページ以降で扱う対策が、単なる思いつきではなく、コストを減らすための具体的な手立てとして、より納得しやすく理解できるようになります。

コンピュータの用語で、実行中のプログラムを一時停止し、別のプログラムに処理を移すことを「コンテキストスイッチ」(実行中の状態を保存し、別の処理に切り替えること)と呼びます。ここでいう「コンテキスト」とは、プログラムがどこまで処理を終えていたか、どの数値を保持していたか、といった実行状態のことです。この言葉は、本書の中でも繰り返し登場する、最も重要な用語のひとつです。

コンテキストスイッチが起きるとき、CPUは今の状態を丸ごと保存し、次に処理するプログラムの状態を呼び出します。この保存と呼び出しの作業は、プログラムの計算そのものを1歩も進めません。切り替えのためだけに使われる、純粋な余分な作業です。

たとえるなら、机の上で1つの資料を広げて作業している途中で、別の資料に取りかかるために、今の資料を一度きちんと束ね直してから脇に置き、別の引き出しから新しい資料一式を取り出して広げ直すようなものです。束ねる作業も、取り出す作業も、どちらの資料の中身も1文字も進めていません。それでも、この作業をしないことには次の資料に着手できません。コンテキストスイッチとは、まさにこの「束ねて、取り出す」部分だけを指します。

コンピュータではこの余分な作業は極めて短時間で終わります。しかし、切り替えがあまりに頻繁に起きると、CPUは本来の計算よりも切り替え作業のほうに多くの時間を使ってしまう状態に陥ります。処理能力の高いCPUを積んでいても、切り替えばかりしていては、単位時間あたりにやり切れる仕事の量、つまりスループット(単位時間にやり切れる仕事の量のこと)が落ち込みます。

このスラッシングと呼ばれる状態は、実行中のプログラムの数をキャパシティ以上に増やしすぎたときに起きやすくなります。1つのCPUで同時に処理しようとするプログラムの数が増えるほど、切り替えの頻度も増えていくからです。人間で言えば、同時に抱える案件の数が増えるほど、切り替えの頻度が上がり、1件あたりに使える時間が細切れになっていくのと同じ構造です。案件の数そのものを減らすことも、切り替えコストを抑える有効な手段のひとつですが、この章では主に、抱える案件の数はひとまず変えずに、切り替えの受け方そのものを工夫する方法に焦点を当てます。

人間の場合、コンテキストスイッチに当たるのは何でしょうか。それは、直前まで考えていた内容を一時的に脇に置き、新しい話題の背景・目的・関係者を頭に呼び出す作業です。報告書の作成中に電話が鳴ったとします。電話を受けている間、報告書の内容は意識から外れます。電話が終わって報告書に戻るとき、あなたはもう一度「どこまで書いていたか」「次に何を書こうとしていたか」を頭の中に呼び出し直さなければなりません。

この呼び出し直しの作業は、電話の内容が短ければ短いほど、割に合わなくなります。電話の用件そのものは1分で終わったとしても、報告書の内容を思い出すのに3分かかるなら、実質的にはこの1回のやり取りに4分かかっていることになります。用件の短さと、切り替えにかかる総時間の短さは、まったく別の話だという点が、見落とされがちなポイントです。

この呼び出し直しには、目に見える時間がかかります。たとえば1回の切り替えに数分の再読み込みが必要だとすると、1日に20回の割り込みを受ければ、それだけで1時間近くが、報告書を1文字も進めない「再読み込み」に費やされたことになります。しかもこの時間は、カレンダーにも日報にも記録されません。「電話対応:5分」とは記録されても、「その後の立て直し:数分」は記録に残らないのです。

さらに、コンテキストスイッチには2種類の負担があることにも触れておきます。ひとつは、切り替えた瞬間にかかる時間そのものです。もうひとつは、切り替えたあとしばらく作業の質が落ちるという負担です。電話対応を終えて報告書に戻った直後は、頭が完全には報告書モードに戻りきっておらず、書くスピードや文章の質が一時的に落ちることがあります。コンピュータのコンテキストスイッチは前者の負担しか持ちませんが、人間の場合は後者の負担のほうが、むしろ大きいかもしれません。

具体的な場面をいくつか見てみます。1つ目は、集中して資料を作っている最中に、5分で終わるはずの確認事項をその都度対応する場面です。確認自体は5分でも、前後の立て直しを含めると、実質的な損失はその何倍にもなります。2つ目は、会議と会議の間に短い空き時間があり、そこに別の案件の作業を挟み込む場面です。10分の空き時間に報告書を少し進めようとしても、切り替えのための読み込みだけで大半が終わってしまいます。3つ目は、複数の案件を1日の中で細かく行き来するスケジュールの組み方です。1件あたりの作業時間は十分でも、切り替えの回数が多いと、体感の疲労と実際の進捗が釣り合わなくなります。

4つ目は、複数人が同席する会議の中で、議題が細かく切り替わる場面です。議題Aについて意見を述べたあと、議題Bに移り、また議題Aに話が戻る、という進行が繰り返されると、参加者一人ひとりの頭の中で、議題ごとのコンテキストスイッチが何度も発生します。会議の時間そのものは変わらなくても、議題を1つずつ順番に片づけて進行する場合と比べて、参加者の消耗はまったく違うものになります。5つ目は、複数の案件を並行して抱えるチームで、誰かに質問や確認を差し込む場面です。質問する側にとっては数分の割り込みでも、答える側には、今取り組んでいた作業を一度手放し、質問の案件に頭を切り替え、答えたあとにまた元の作業に戻るという、二重の切り替えコストが発生しています。質問する回数が多いチームほど、この見えないコストの総量は大きくなります。

この呼び出し直しの重さを、電話のやり取りで具体的に見てみます。取引先からの電話に出ると、相手はこう切り出します。「先日ご相談した納期の件、少し前倒しできませんか」。あなたは受話器を持ったまま、当初の納期をいつ誰と決めたかを思い出し、「一度確認して、午後に折り返します」と答えます。電話自体は1分で終わりました。しかし報告書の画面に戻っても、直前まで書いていた段落の続きはすぐには出てきません。電話の1分と、立て直しの数分は、まったく別の請求書として積み上がっているのです

ここでの落とし穴は、切り替えのコストが見えないために、過小評価してしまうことです。忙しく動き回った1日は「働いた感覚」を生みますが、その感覚と、実際にやり切った仕事の量は別物です。忙しさを実績のように感じてしまうと、切り替えの多いスケジュールをむしろ望ましいものだと錯覚しかねません。予定表が隙間なく埋まっていることを、そのまま「充実している」と読み違えるのは、この錯覚の典型的な形です。

もうひとつの落とし穴は、切り替えコストを理由に、すべての依頼を後回しにしてしまうことです。切り替えにはコストがありますが、コストがゼロになることはありません。大切なのは、コストを認めたうえで、どこにそれを払うかを選ぶことです。たとえば、重要な意思決定が絡む相談であれば、多少の切り替えコストを払ってでもすぐに対応したほうが、後々の手戻りを防げます。逆に、急がなくても実害の出ない確認事項であれば、あとでまとめて対応するほうが、全体としての消耗は少なく済みます。切り替えコストという物差しを持つことは、何でも後回しにする言い訳にするためではなく、どこにコストを払う価値があるかを見分けるためのものです。

もう一段深く考えると、切り替えのコストは「何から何へ」によっても変わります。前のページで見たとおり、同じ案件内のスレッド間の移動は軽く、別案件のプロセス間の移動は重いのでした。同じ日に切り替えが20回あったとしても、そのすべてが重いプロセス間の切り替えなのか、軽いスレッド間の切り替えが混じっているのかで、実際の消耗はまったく違います。切り替えの回数だけでなく、切り替えの種類にも注意を向ける価値があります。

もう一つ、切り替えのコストを左右する要素として、直前の作業がどれだけ複雑だったかがあります。単純な確認作業から別の単純な確認作業に移るのであれば、頭の中に保持していた情報は少なく、呼び出し直しの負担も小さく済みます。しかし、複数の条件を突き合わせて考えていたような複雑な検討作業の途中で割り込まれると、積み上げていた思考の筋道がまるごと崩れ、元に戻すのに長い時間がかかります。込み入った検討をしている最中ほど、割り込みへの耐性が低くなる、と考えておくとよいでしょう。逆に言えば、単純作業をしているときの割り込みは、比較的害が少ないとも言えます。

この観点は、割り込みを受けるタイミングを自分である程度選べる場面で役立ちます。込み入った検討に入る前に、あらかじめ「今から30分は込み入った作業に入るので、急ぎでなければあとで」と周囲に伝えておければ、割り込みの回数自体は変わらなくても、最も高くつくタイミングでの切り替えを避けられます。これは次のページで扱う割り込みとマスキングの考え方の、先取りにもなっています。

ここまでの内容を、日々の感覚と結びつけて整理しておきます。「今日は色々やったのに、何も終わっていない気がする」という感覚が出てくる日は、たいてい切り替えの回数が多く、しかもその多くが重いプロセス間の切り替えだった日です。逆に「今日は1つのことに集中できた」と感じる日は、切り替えの回数が少なく、コンテキストスイッチという名の見えない支払いが少なかった日だと言い換えられます。この違いは、能力や意志の強さではなく、その日どれだけの切り替えを払わされたかという、いわば環境の問題です。

切り替えのコストを減らす具体的な方法は、次のページ以降で扱う割り込みの制御や、まとめ処理につながっていきます。ここではまず、「切り替え自体が仕事を1つも進めない、純粋な支払いである」という認識を持っておいてください。

切り替えのコストは、案件の性質や、切り替えのタイミングによっても現れ方が違います。この章の残りのページでは、割り込みの受け方、集中の時間割の組み方、まとめ処理の使いどころという3つの角度から、このコストにどう向き合うかを具体的に見ていきます。

持ち帰り

  • コンテキストスイッチとは、直前の作業内容を一時的に手放し、新しい作業の背景を頭に呼び出し直す作業のことである
  • 切り替え自体は成果を1つも生まないが、確実に時間を消費し、記録にも残りにくい
  • 切り替えの頻度が高すぎると、1件あたりの作業時間が十分でも全体の進み方(スループット)が落ちる

やってみる

今日、集中作業中に発生した割り込みの回数を数えてみてください。回数だけでも記録すると、切り替えコストの見えなかった部分が見えてきます。あわせて、割り込みのあと元の作業に戻るまでにかかった体感の時間も、大まかでよいのでメモしておくと、次のページ以降で扱う対策の効果を比べる目安になります。