前回はスケジューリング——いつ・誰が・何を始めるか、という段取りの話をした。あれは突きつめると「一人がどう手を動かすか」の話だった。動かない締め切りを一つ置けば、そこから残り全部が決まる、と。今回はもう一段、人を増やす。二人以上が、同時に手を動かすとき。
不思議なことがある。食洗機と洗濯機は、何も言わずに同時に走る。けんかしない。ところが人間が二人、同じ台所に立つと、たちまち衝突する。肩がぶつかる、まな板を取り合う、「先にやってよ」が始まる。機械の並行はあんなに簡単なのに、人の並行はなぜ難しいのか。今日はそれを、並行処理とロックという言葉でほどいてみたい。
シマダ まず、いちばん簡単な並行から始めます。食洗機、洗濯機、炊飯器。この三つは、スイッチを入れたら同時に走る。誰も困らない。これを並行——複数のことが同時に進んでいる状態、といいます。なぜ簡単かというと、三つが別々の箱に閉じていて、互いの中身に手を出さないから。食洗機は洗濯機の水を使わないし、炊飯器は食洗機の中の皿を触らない。
マキノ 言われてみれば、機械は文句言わないですね。同時に三つ回しても、洗濯機が「先に食洗機が終わってからにして」とは言わない。
シマダ そう。そして前回、待ち時間の話をしましたよね。スケジューリングで一番効くのは「離れていられる工程を先に始めて、その間に別を詰める」ことだった。並行処理は、それの極端な形です。待ち時間を重ねる。洗濯機が回っている四十分、こちらは別のことをしていい。家でいちばん安い並列化は、これなんです。自分が二人になる必要はない。機械に任せられる並列化を、まず全部、機械に渡す。
マキノ ホテルもそうですよ。十五室を一人で回すとき、私の手は一本だけど、乾燥は勝手に進んでくれる。浴室を洗って置いておけば、別の部屋をやってる間に乾く。あれは私が二人いるんじゃなくて、乾燥っていう機械じゃない並列が、勝手に走ってるんですね。
シマダ ところで、その十五室。あれは清掃員が複数で回す日もあるんですよね。二人三人で。それは衝突しないんですか。機械と違って、人ですよ。
マキノ しないです。部屋が分かれてるから。三人なら、二〇一から二〇五はこの人、二〇六から二一〇はあの人、って割る。一つの部屋に二人で入ることは、まずない。ドアが閉まってる時点で、もう別々なんですよ。誰かの五室と、私の五室は、台車もリネンも別。取り合いになりようがない。
シマダ ——それ、コンピュータでいちばん理想的な並行の形です。シェアードナッシング。何も共有しない。各自が自分のぶんの資源を丸ごと抱えて、他人のものに触らない。触らないから、調整がいらない。マキノさんの十五室が三人でも揉めないのは、部屋という単位で完全に切り分けてあるからなんですね。問題は——家の台所が、そうなっていない。
シマダ 台所に二人が立つと、何が起きるか。数えてみると、共有しているものだらけなんです。まな板は一枚。コンロの手前の口は一つ(奥は使いにくい)。シンクは一つ。ボウルの大きいのは一個。二人いても、これらは増えない。複数の人が、同じ一つのものを同時には使えない。これを共有資源といいます。
マキノ 「狭い台所だから」って、よく言うじゃないですか。あれ、広さの問題だと思ってました。
シマダ 広さもありますけど、本当の正体は、たぶんそこじゃない。広い台所でも、まな板が一枚なら、二人は取り合う。狭さ問題の中身は、資源の取り合いなんです。で、取り合いをさばく仕組みを、コンピュータではロック——排他制御といいます。「いま私が使っている」という札を一枚立てて、その間、相手は待つ。まな板を握っている人がいる間、もう一人は手を出せない。握っていた人が置いたら、次の人が握れる。
マキノ うちの現場に、まさに台数が一つしかないものがありますよ。リネン室の台車。シーツとタオルを積んで各部屋を回る、あれ。朝、台車は一台しかない日があるんです。二人で取り合ったら、片方が手ぶらで突っ立つことになる。
シマダ それ、どうさばくんですか。早い者勝ち?
マキノ いや、前の晩に割り当て表で決めてあります。朝イチは誰が台車、その人が二階を積み終えたら次は誰、って。当日に取り合わない。前夜に、もう順番が決まってる。
シマダ ——それ、けっこう高度なことをやってます。コンピュータでロックの取り合いがいちばん荒れるのは、みんなが同時に「私が先」と手を伸ばす瞬間なんです。早い者勝ちは、その場では速いように見えて、待ち合いやら譲り合いやらで、かえって全体が遅くなる。マキノさんの割り当て表は、その取り合いを事前に解いてしまっている。当日の朝、誰も札を奪い合わない。前夜のうちに、誰がいつそのロックを取るか、もう書いてある。これはロックを「その場で取る」んじゃなくて、「あらかじめ予約してある」状態で——正直、家の台所がいちばん苦手にしているところです。
シマダ 共有資源が二つ以上あると、もっと厄介なことが起きます。古典的なやつを一つ。台所に二人。まな板とコンロ、両方を使う料理を、二人がそれぞれ作っている。一人がまな板を握って、コンロが空くのを待つ。もう一人はコンロを使いながら、まな板が空くのを待つ。さて——どうなりますか。
マキノ ……動かないですね、それ。お互い、相手が手放すのを待ってる。
シマダ 永遠に動きません。これをデッドロックといいます。二人とも、相手が持っているものを待っていて、しかも自分が持っているものを手放さない。両方が固まる。コンピュータが止まる原因として、わりと有名なやつです。
マキノ 「先にやってよ」「いま先に使ってるでしょ」って、あれ。夫婦でやりますよ。私がシンクで野菜洗ってて、向こうがコンロで何かやってて、私はコンロに移りたいのに向こうは退かない、向こうはシンクを使いたいのに私が退かない。二人とも、相手が先に動くと思って、止まる。
シマダ まさにそれがデッドロックです。で、機械の世界には、これを起こさない有名な手があるんです。説教くさく聞こえたら、聞き流してください。——資源を取る順番を、二人で揃える。たとえば「必ず、まな板を先に確保してから、コンロに行く」と決める。逆順では絶対に取らない。そうすると、二人が同時に動いても、まな板を取れなかったほうは、そこで待つだけ。コンロまで握ってから固まる、ということが起きない。順番が揃っていると、待ちは起きても、待ち合いは起きないんです。
マキノ うちは順番を決めてるわけじゃないですけど、結果的に、似たことになってるかも。私が台所にいるときは、向こうは入ってこない。向こうが何か作るときは、私が出る。先に入ったほうが、ぜんぶ握る。
シマダ あ、それは順番を揃えるより、もっと強い手です。そもそも二人で同時に握らない。一人が全資源を抱えてしまえば、待ち合いようがない。それも一つの正解で——ただ、並行度はゼロになります。二人いるのに、一人ぶんしか進まない。デッドロックは絶対に起きないけど、もう一人は手があいている。そのへんの、安全と速さのつり合いが、次の話です。
シマダ ロックには、かける大きさ——粒度という考えがあります。粗くかけるか、細かくかけるか。さっきの「台所に入ったほうが全部握る」は、いちばん粗いロックです。台所まるごと一個を、一人が占有する。安全だけど、もう一人は待つしかない。
マキノ 粗い、というのは、大きく囲っちゃうってことですか。
シマダ そうです。台所を一個の塊として鍵をかける。逆に細かくすると、「コンロの手前の口」と「奥の口」は別、「シンク」と「まな板」も別、と分けて、それぞれに鍵をかける。こうすると、一人がコンロを使っていても、もう一人はシンクを使える。同時に進める。並行度は上がる。ただ——管理がややこしくなる。どの口が空いてて、まな板は誰が、と、いちいち見ないといけない。さっきのデッドロックも、細かく分けたぶん、起きやすくなる。
マキノ 家の中、よく見ると、粗いところと細かいところがありますね。お風呂は、粗い。一人ずつしか入れない。鍵かけて、出るまで誰も入れない。
シマダ 風呂は典型的な粗いロックです。浴室まるごと一個を、一人が占有する。「順番!」と子どもが言うのは、その粗いロックを待っている状態ですね。
マキノ でも洗面所は、細かいんですよ。鏡の前で歯みがいてる子と、その横で洗濯機の前にしゃがんで靴下選んでる子は、ぶつからない。同じ洗面所なのに、鏡の前と洗濯機の前は、別の場所として使える。だから二人入れる。
シマダ ——いま、家の中を粒度で読み直しましたね。洗面所は、一個の部屋なのに、中に細かいロックがいくつもある。鏡の前と、洗濯機の前は、別の資源。だから二人並行できる。風呂は分けられないから、まるごと一個で一人ずつ。同じ「水回り」でも、分けられるものは細かく、分けられないものは粗く。家事をしている人は、これを言葉にせずに、体で切り分けているんですよね。「ここは一緒に使える」「ここは順番」って。
シマダ もう一つ、二人いるからこそ起きる、すれ違いがあります。麦茶の話をします。冷蔵庫の麦茶が、もう少ししかない。これを二人が、別々のタイミングで見る。あなたが見て「あ、ないな、作っとくか」と思う。同じころ相手も見て「ないな、作るか」と思う。結果、麦茶が二本できる。あるいは——二人とも「相手が作るだろう」と思って、一本もできない。
マキノ ありますよ、それ。トイレットペーパーで、よくやります。二人とも買ってきて、ダブつく。逆に、二人とも「あの人が買うと思った」で、切らす。
シマダ これをレースコンディション——競合状態といいます。「ないことを確認する」のと「作る・買う」の間に、すきまがある。そのすきまに、相手が動いてしまう。確認した時点では正しかった判断が、行動するころには古くなっている。二人が同時に走っているから起きる、時間差のすれ違いです。
マキノ どうすればいいんですか、これ。
シマダ 手は、いくつかあって。一つは、「いま作りかけです」という札を立てる。フラグといいます。やかんを火にかけたら、コンロのとこに「麦茶、作ってます」と置いておく。それを見たら、もう一人は作らない。もう一つは、第1回でやった、冷蔵庫のホワイトボード。「麦茶なくなった→買う人サイン」と、一箇所に書く。あれは二人が同じ一枚を見にいく仕組みで——第1回で共有メモリと呼んだものです。すれ違いは、各自の頭の中だけで判断するから起きる。判断を、外の一枚に出して共有すると、減る。
マキノ 札、うちの現場にもあります。掃除が終わった部屋のドアに、清掃済みの札を掛けるんです。あれ、フロントとの取り合いを防ぐ仕組みなんですよ。札が出てなかったら、フロントは「まだ掃除中」と思って、お客さんを入れない。札が出たら、入れていい。私とフロントが、同じドアを別々のタイミングで見ても、札一枚で、ぶつからない。札がなかったら、私が掃除してる部屋に、チェックインのお客さんが入ってきちゃう。
シマダ それ、フラグそのものです。札という一枚を、私とフロントの両方が見にいく。麦茶のやかんの札と、まったく同じ構造ですね。「いま私が触ってる」を、外に一つ出しておく。それだけで、確認と行動のすきまに、相手が割り込めなくなる。
シマダ 最後に、いちばん家らしい並行の話を。並行処理の理想は、対等な働き手が複数いることなんです。同じ力で、同じように仕事を取って、進める。ところが家の現実は、たいてい、そうじゃない。一人が全体を見て指示を出しながら自分も動いて、もう一人は「何やればいい?」と待っている。
マキノ 「手伝おうか」って言われて、かえって、ね。
シマダ その「かえって」を、分解させてください。責める話じゃなくて。一人が、全体の段取りを持っている(前回でいうスケジューラ役)。もう一人は、指示されたら動く働き手。このとき、指示する側は、自分が動きながら、相手に「次はこれ、その次はこれ」と渡し続けないといけない。この渡す手間を、第1回でコンテキスト——「いまどこまでで、何が要るか」を引き継ぐコスト、と呼びました。
マキノ 「玉ねぎ切って」って頼むより、自分で切ったほうが速いんですよ。切り方を説明して、まな板どこ、包丁これ、ってやってる間に、もう切り終わってる。
シマダ そこなんです。指示を渡すコストが、その人が動いて生む利得を、上回ってしまう。だから「一人でやったほうが早い」が、本当に成立する。サボってるんじゃなくて、構造として、そうなる。働き手が増えても、指示でつながっている限り、増えたぶんがそのまま速さにはならない。指示の分だけ、目減りする。
マキノ じゃあ、二人は無駄なんですか。
シマダ いえ、逆で。さっきの、マキノさんの十五室です。三人で回すとき、揉めないのは、部屋ごと丸ごと渡してあるから。「二〇一から二〇五は、あなたに全部」。指示が、いらない。途中で「次これやって」が発生しない。シェアードナッシングに寄せると、指示そのものが消えるんです。家でいうと、「洗い物を手伝って」じゃなくて、「シンクから向こうは、ぜんぶあなたの担当」。口を出さない。領域ごと渡す。そうすると、渡すコストが、最初の一回で終わる。
マキノ あー……うちが台所でうまくいかないの、それかもしれない。一緒に立つと、いちいち「それ取って」「そこ退いて」になる。最初から「夕飯はあなた、片づけは私」って分けた日のほうが、静かなんですよ。同じ台所にいるのに。
シマダ 今日の問いに戻ります。台所に、二人は立てるか。——立てる、と思います。ただし条件つきで。どれが共有資源か(まな板は一枚、コンロの手前は一つ)の地図があって、取る順番の約束があって、できれば領域ごと分けてある。その三つがそろえば、二人は、ぶつからずに立てる。何もなしに二人が立つと、デッドロックとレースコンディションの見本市になる。
マキノ 地図と、約束と、分担ですね。
シマダ はい。機械が黙って並行できるのは、最初から箱が分かれてるから。人は、その分け方を、自分たちで決めないといけない。決めずに同じ台所に立つから、肩がぶつかる。マキノさんのお宅は、どうなんですか。台所、二人で立ちます?
マキノ うちはね、二十二年やってきて、夫と台所に同時に立ったこと、ほとんど無いんですよ。仲が悪いんじゃないんです。これ、言うと誤解されるんですけど。——資源が、一人分しかないからなんです。まな板一枚、手前のコンロ一つ、シンク一つ。二人で立つと、片方は必ず待つことになる。待つくらいなら、一人がやって、もう一人は別の部屋で別のことをしてるほうが、家ぜんぶで見たら、進んでる。だから私たちは、台所を分けたんじゃなくて、台所と、それ以外を分けたんですね。同じ部屋に二人で立つことが、仲のしるしだとは、私はもう思ってないです。別々の部屋で、それぞれ手が動いてる時間のほうが、うちは長い。
第6回はガベージコレクション——捨てる技術を取り上げる。もう誰も参照しなくなった物を、いつ、どうやって回収するか。世代別GC——いちばん奥の引き出しに、何年も触っていないものが沈んでいく、あの構造。家じゅうに溜まっていく「もう要らないはずなのに、捨てられない物」を、メモリの掃除になぞらえてほどいてみる。
#6 引き出しの奥は、回収されない——ガベージコレクション(近日公開)
#1 コンテキストは流しに溜まる/#2 一軍は、コンロの脇に/#3 洗濯物は、列に並ばない/#4 十二時は、動かせない(ゲスト: イノウエミドリ)
「家事のコンピュータサイエンス」は、シマダ(AI使用法研究者)とマキノトモエ(ホテル客室清掃員22年)の対談シリーズです。コンピュータサイエンスの基本概念を一つずつ取り上げ、掃除・洗濯・炊事・買い物・名もなき家事に当ててみる。効率だけでなく、快適さ・分担・諦めも等価に扱います。生成エッセイの現在地に戻る。