前回はキャッシュ——よく使うものを手の届くところに置く、置き場所の話をした。手元は速くて狭い、遠くは遅くて広い。そこまでが前回だ。今回は、置き場所ではなく順番の話をする。流しに食器が積まれる、洗濯物が溜まる、ボタン付けが何ヶ月も後回しになる。どれも「待っているものの行列」だ。先に来たものから片づけるのか、最後に積んだものから片づけるのか、急ぎから割り込ませるのか。コンピュータはこの行列に一つ名前を付けている。キューという。
断っておくと、今日は「順番」だけの話だ。たくさん入るか、手元にあるか——量や近さの話は前々回・前回でやった。混ざりやすいので、最初にここで一度だけ線を引いておく。量の話に滑りそうになったら、いちいち断らず、地の文で通り過ぎる。第3回のテーマはキュー。洗濯かごと、流しの食器と、アイロン待ちの山で考える。
シマダ まず一番素直な順番から。先に入れたものを、先に出す。これをFIFO——First In, First Out、先入れ先出しといいます。コンピュータでいえば、プリンタの印刷待ち。先に押した人の書類が先に刷られる。割り込まれたら腹が立つでしょう。あれが守られているのはFIFOだからです。レジの列も、券売機の列も、人が並ぶ列はだいたいこれです。
シマダ 家でいちばん分かりやすいのは、冷蔵庫の牛乳です。手前に古いの、奥に新しいのを入れて、手前から飲む。先に買ったものから先に出す。食品のローテーションと呼ばれるあれが、FIFOそのものですね。順番を守らないと、奥で一本だけ期限が切れる。
マキノ 部屋割りの基本は、それです。チェックアウトの早い順に回す。先に空いた部屋から入る。十五部屋持っていて、九時に出た部屋から順に、です。
シマダ きれいなFIFOですね。
マキノ 基本は、です。崩れるのは、フロントから連絡が入るときです。「七階のこの部屋、次のお客様が十二時に着く」と来る。そうしたら、まだ前のお客様が出てない部屋を飛ばして、そこを先にやる。割り込みです。だから純粋に空いた順、っていう日はあんまりないですね。連絡が入ったら、進めてた手を止めて、そっちに移る。
シマダ その割り込みが、あとで大事になります。進行中の手を止めて別へ移る——それ自体が、いずれ一つのテーマになるので。先入れ先出しが崩れる理由は、家事には必ずありますから。
シマダ FIFOの逆があります。後に入れたものを、先に出す。LIFO——Last In, First Out。コンピュータではスタックと呼びます。皿を積み上げる、あの積み方をそのまま想像してください。上に載せる、上から取る。だから一番下の皿には、永遠に手が届かない。
シマダ 家にある山は、ぜんぶこれなんです。洗い物の山、洗濯物の山、読みかけの郵便物の山。山にした時点で、上から取ることが決まる。つまり——山にした時点で、一番古いものを一番後回しにする決定を、自動でしている。誰も「底のを後回しにしよう」と決めてないのに、積んだ形が勝手に決めてしまう。
マキノ アイロン待ちが、それです。うちの。脱いで「これはアイロンいる」ってやつを、椅子の上に重ねていく。上に置く、上から取る。一番下に、夫のワイシャツが一枚あるんですけど。後に載せたのから先にかけて、底のは一回も触らない。これ、後入れ先出しっていうやつですよね、いま聞いた。
シマダ ……そうです。まさにそれを、LIFOと呼びます。先に説明されてしまった。
マキノ 底のワイシャツ、いつからあるかっていうと、たぶん二月くらいから。今が六月なので、四ヶ月。上に新しいのが載るたびに、底に押し込まれていく。取り出されることが、構造上ないんです。
シマダ LIFOの底は、忘れられるための場所なんですね。新しいものが来るほど、底は遠くなる。
シマダ FIFOは来た順、LIFOは積んだ順。でも家事の現実は、たぶんどっちでもない。来た順でも、積んだ順でもなく、重要度の順で出す。これを優先度つきキューといいます。列に並んでいても、急ぎが先に出ていく。
シマダ 「先に来たから先に」じゃなくて「明日の朝に弁当が要るから、これを先に」。タスクが入ってきた順番じゃなくて、締め切りや重さで順番が決まる。さっきマキノさんが言ったフロントからの割り込みも、これですよね。「十二時着」という締め切りが、空いた順を追い越す。
マキノ 頭は使いますけどね。連絡が入るたびに、いまの順番のどこに差し込むか、その場で考える。「これとこれ、どっちが先か」を一日に何回も。この、どっちが先かを比べてる時間って、けっこう馬鹿にならないんですよ。掃除そのものは進んでないのに。
シマダ そこなんです。マキノさんがいま言った「比べてる時間」——優先度をつけると、出すたびに「どれが一番大事か」を比べないといけない。この比べる手間そのものがコストなんです。FIFOなら考えなくていい。来た順に出すだけ。優先度をつけた瞬間、毎回考える仕事が増える。
マキノ 全部「急ぎ」になると、その考える時間だけが残りますよ。「これも今すぐ、それも今すぐ」って言われたら、どれが先かなんて比べようがない。結局フロアの端から順にやるしかない。急ぎが全部なら、急ぎじゃないのと同じです。
シマダ まさにそこが面白い。全部を最優先にすると、比べる手間だけが残って、肝心の優先順位は消える。列は結局、来た順——FIFOに戻るんです。優先度は、つけないものがあって初めて効く。札は、貼らないものがあるから意味を持つ。
シマダ 優先度つきキューには、影があります。急ぎから出していくと、急ぎじゃないものが、いつまでも出てこない。前のものが片づく前に、もっと急ぎが入ってくる。すると、優先度の低いタスクは永遠に順番が回ってこない。これをstarvation——飢餓、と呼びます。列にいるのに、出口に辿りつけない。
シマダ ボタン付け、裾上げ、写真の整理。これは「急ぎじゃない」が確定しているから、毎回ほかに抜かれる。「いつかやる」と言ったものは、たいてい飢餓状態のキューです。出口のない列に、ずっと並んでいる。並んではいるんです、消えてはいない。ただ出られない。
マキノ さっきのワイシャツが、それですね。急ぎじゃないから、四ヶ月。
シマダ コンピュータには、これを防ぐ仕掛けがあります。エイジングといって、待った時間ぶん、優先度を少しずつ上げていく。長く待ったものは、だんだん前に繰り上がる。最後には必ず順番が来るようにする。
マキノ 家でやるなら——三回見送ったら、次は先頭、とかですか。
シマダ 理屈ではそうです。三回後回しにしたものは、四回目は無条件で先頭に上げる。そういうルールを家に持ち込めば、底のワイシャツも、いつかは出てくる。
マキノ 持ち込めば、ね。でもうちは持ち込んでないので、四ヶ月底にあるんですよ。仕掛けを知ってるのと、自分の家でやるのは、別の話なので。
シマダ ……前回の鍵と、同じことを言われている気がします。
シマダ ここで、列そのものの長さを見ます。コンピュータには行列を扱う理屈があって、入口の話と出口の話で考えます。ものが入ってくる速さを到着率、片づける速さを処理率という。到着率が処理率を上回れば、列はもちろん伸び続ける。追いつかないんだから、当然です。
マキノ でも、追いついてるはずの日でも詰まること、ありますよ。ふだんは回せてる量なのに、チェックアウトが一時間に固まると、その時間だけ部屋がぜんぶ「待ち」になる。一日ならしたら足りてるのに、その瞬間は溢れる。
シマダ そこが行列の怖いところです。平均では足りていても、到着と処理が近づくほど、そして波があるほど、待ちは急に伸びる。ぎりぎりで回しているときほど、来客一組、洗濯一回ぶんのムラで、一気に詰まる。だから「平均では追いついてるのに週末だけ流しが溢れる」のは、根性の問題じゃないんです。
シマダ 第1回で、流しに食器が溜まる話をしました。あれも同じで、溜まっているという事実は、入口と出口の差と、その差がどれだけぎりぎりかを、淡々と映しているだけです。列の長さは、能力の信号なんですね。
マキノ 差を縮めるなら、二つしかないですよね。入ってくるのを減らすか、片づけるのを増やすか。それで、減らすほうが家では楽です。ホテルの客室、皿が四枚しかないんですよ。カップが二つ、皿が二枚。それだけ。
シマダ 四枚。少なすぎませんか。
マキノ わざとです。多いと、お客様が全部使って、全部流しに置いていく。四枚なら、四枚ぶんしか溜まりようがない。溜まる上限が、最初から決まってる。掃除の側が楽になるように、置く数で決めてあるんです。
シマダ マキノさんがいま、僕が言う前に答えを出してしまった。到着率を、物の数で天井に押さえている——いまの「皿四枚」は、行列理論の教科書がいちばん最後に書く結論を、現場が先にやっていた例です。
シマダ ここまで、列は溜まる・後回しになる・飢える、と悪い話ばかりしてきました。でも、列にはもう一つの顔もあります。列があるおかげで、今すぐやらなくていい。これをバッファといいます。入ってくるものを、いったん溜めておく場所。溜められるから、入る側と出す側が、同じ速さで動かなくて済む。
マキノ 洗濯かごが、それですよね。もしかごがなかったら、靴下を一足脱ぐたびに洗濯機を回すことになる。脱いだそばから処理しないといけない。かごがあるから、溜めておいて、量がまとまってから一回で回せる。リネンも同じで、シーツ一枚出るたびに洗ってたら回らない。一日ぶん溜めて、まとめて下に出す。
シマダ 入口と出口のあいだに、緩衝材として列を一本かませている、ということですね。溜める場所があるから、各部屋は「とりあえずここに」で先へ進める。
マキノ 悪者にされがちですけどね、溜まってる山。あれが無いと、一個ずつ相手しないといけなくなる。それはそれで、一日終わらない。
シマダ 列は遅延の象徴に見えて、入口と出口を切り離す役もしている、と。まあ、それはそれとして——今日いちばん見たかったのは、その緩衝すらうまく働かない、家の中の列のほうなんです。
シマダ 今日いろんな列を見てきました。FIFO、LIFO、優先度、飢餓、バッファ。でも家の中の待ち行列は、たぶんそのどれでもない。レジの列みたいに、律儀に一列には並んでくれない。
マキノ 洗濯物って、かごの中で順番なくなりますよね。先に入れたのも後から入れたのも、混ざって、どれが先かなんて分からない。アイロンの山は逆で、上から取るって順番だけは決まってる。決まってるけど、底は出てこない。
シマダ かごでは順番が溶けて、山では底が忘れられる。どっちも、列としては壊れている。
マキノ 壊れてますね。さっきのワイシャツ、二月から底にあるって言いましたけど。あれ、たぶん今日帰っても、出さないです。底にあるのは知ってる。四ヶ月だってことも、いま数えて分かった。分かったうえで、たぶん今夜もその上に、別のを一枚載せます。仕掛けがあるのも、三回見送ったら先頭に上げればいいのも、聞いて分かりました。分かったから出す、にはならないんですよ。山ってのは、そういうところです。
第4回はスケジューリングを取り上げる。今回が「並んだものをどの順で出すか」の話だったとすれば、次は「誰が・いつ・何をやるか」を割り当てる話だ。今日マキノが何度か口にしたフロントからの割り込み(進行中の手を止めて別へ移る)、急ぎが無いときにフロアの端から順繰りに回すやり方——後者にはラウンドロビンという名前があり、前者はプリエンプション(割り込み)と呼ばれる。間に合わせるべき締め切り(デッドライン)も含めて、家事の分担と段取りに、その語彙を当ててみる。今日の「比べる手間」も、次回はスケジューラのコストとして戻ってくる。
#4 誰が、いつ、何を——スケジューリング(近日公開)
#1 コンテキストは流しに溜まる/#2 一軍は、コンロの脇に
「家事のコンピュータサイエンス」は、シマダ(AI使用法研究者)とマキノトモエ(ホテル客室清掃員22年)の対談シリーズです。コンピュータサイエンスの基本概念を一つずつ取り上げ、掃除・洗濯・炊事・買い物・名もなき家事に当ててみる。効率だけでなく、快適さ・分担・諦めも等価に扱います。生成エッセイの現在地に戻る。