こんにちは!データベースの世界へようこそ。
普段、PostgreSQLを使っていると「データが正しく保存された!」とか「検索が速い!」といった結果に目が行きがちですよね。でも、その裏側では、何千、何万もの処理がまるでダンスを踊るように、信じられないほどのスピードで整列しているんです。
今日は、そんなPostgreSQLの舞台裏を支える、ちょっと「せっかちでストイックな番人」、「スピンロック」についてお話しします。
—
そもそも「ロック」って何のためにあるの?
データベースは、たくさんの人が同時にアクセスしてくる場所です。もし、二人の人が同時に同じデータを書き換えようとしたら、データはめちゃくちゃになっちゃいますよね。
だから、PostgreSQLは「今、私が書き換えてるから、ちょっと待ってて!」と鍵をかける仕組みを使っています。これが「ロック」です。
でも、このロックにも「重たいもの」と「めちゃくちゃ軽いもの」があります。今回紹介する「スピンロック」は、その中でも「一瞬で終わる、めちゃくちゃ軽い作業」のための特別な鍵なんです。
スピンロックを「トイレのドア」に例えてみる
想像してみてください。あなたは今、オフィスで仕事をしています。
普通のロック(重たい処理)の場合
トイレに行こうとしたら、ドアに鍵がかかっていました。あなたは「空いたら教えてね」とスマホに通知を設定して、デスクに戻ってメールを返したり、コーヒーを飲んだりして待ちますよね。これが、OSの機能を使った一般的なロックです。
スピンロックの場合
さて、今回の主役「スピンロック」は、そんな優雅な待ち方はしません。
あなたはトイレのドアの前に立ち、ドアノブをガチャガチャと力任せに回し続けます。「空いたか!? 今か!? 空いたか!?」と、ドアの前から一歩も動かずに、血眼になって確認し続けるんです。
「えっ、それってすごく無駄じゃない?」って思いますよね。でも、もしそのドアが「0.1秒で空く」ことがわかっていたらどうでしょう?
席に戻って座り直す時間よりも、その場でガチャガチャし続けたほうが、結果的に早く中に入れるはずです。これがスピンロックの考え方です。
なぜPostgreSQLは「ガチャガチャ」するの?
PostgreSQLの中には、メモリ上の小さな情報を書き換えるような、ほんの一瞬で終わる作業がたくさんあります。
- 「今、このメモリは誰が使ってる?」
- 「このフラグをオンにするだけ!」
こんな作業のために、わざわざ「OSさん、今から待ちますので、私の処理を一時停止させてください」とお願いしていたら、そのやり取りだけで時間がかかりすぎてしまいます。
それなら、CPUの能力をフルに使って、「空くのをその場で待つ(これを専門用語でビジーウェイトと言います)」ほうが、トータルで見ると圧倒的に速いんです。PostgreSQLは、この「究極の効率」を求めて、スピンロックを使いこなしています。
注意点:スピンロックの「ストイックすぎる欠点」
スピンロックは速いですが、諸刃の剣でもあります。
もし誰かがドアを閉めたまま、中で昼寝を始めてしまったらどうなるでしょう? 外で待っている人は、いつまでもドアノブをガチャガチャし続けなければなりません。
CPUは「ガチャガチャする」ことに全力投球してしまうので、他の仕事ができなくなります。だからこそ、スピンロックは「ほんの一瞬で終わること」にしか使われません。もし、長時間かかる処理でスピンロックを使ってしまったら、データベース全体がフリーズしたようになってしまうでしょう。
まとめ:職人のこだわりが詰まった仕組み
スピンロックは、PostgreSQLがコンマ数秒の時間を削り出し、爆速で動作するために選んだ「職人技」のひとつです。
「待っている間も止まらない」。このストイックな姿勢があるからこそ、私たちは普段、何気なくデータベースを使って、快適にサービスを利用できているんですね。
もし次にPostgreSQLのアーキテクチャ図を見る機会があったら、「ああ、このどこかで、今もスピンロックがガチャガチャとドアノブを回して、データを守っているんだな」なんて想像してみてください。なんだか、少し愛おしくなりませんか?
それでは、また次回のブログでお会いしましょう!Happy Hacking!
コメント