エンキュー/デキュー(エンキュー/デキュー)とは | 意味や読み方など丁寧でわかりやすい用語解説
エンキュー/デキュー(エンキュー/デキュー)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。
読み方
日本語表記
エンキュー/デキュー (エンキュー/デキュー)
英語表記
enqueue/dequeue (エンキュー/デキュー)
用語解説
エンキューとデキューは、データ構造の一つである「キュー(Queue)」に対する基本的な操作である。キューは「先入れ先出し(FIFO: First-In, First-Out)」という原則に基づいてデータを管理する入れ物であり、この原則に従ってデータを追加したり、取り出したりする際にエンキューとデキューの操作が用いられる。
エンキュー(Enqueue)は、キューの末尾に新しいデータを追加する操作を指す。これは、データが処理の順番待ちの列に並ぶことを意味する。一方、デキュー(Dequeue)は、キューの先頭にある最も古いデータを削除し、それを取り出す操作を指す。これは、列の先頭にいたデータが処理されるために取り出されることを意味する。これらの操作は、システムの様々な場面で、データやタスクの処理順序を保証したり、非同期的な処理を実現したりするために不可欠である。
キューは、データが追加される入口(通常は「末尾」または「リア:Rear/Tail」と呼ばれる)と、データが取り出される出口(通常は「先頭」または「フロント:Front/Head」と呼ばれる)を持つ構造を持つ。この構造により、データは追加された順序が保持され、必ず最初に追加されたデータが最初に処理される仕組みが保証される。
エンキュー操作を実行すると、新しいデータ要素は常にキューの現在の末尾に追加される。これにより、キューのサイズは一つ増加し、追加されたデータが新しい末尾となる。例えば、キューにA, B, Cというデータがこの順で格納されている状態で、Dをエンキューすると、キューの状態はA, B, C, Dとなる。エンキューの際には、キューに空き容量があるかどうかが確認される。もしキューが容量いっぱいであった場合(「キューが満杯(Full)」の状態)、エンキュー操作は失敗するか、あるいはキューに空きができるまで待機するなどの処理が行われることがある。
デキュー操作を実行すると、キューの先頭にあるデータ要素が取り出され、同時にキューから削除される。これにより、キューのサイズは一つ減少し、次に古いデータが新しい先頭となる。上記の例で、A, B, C, Dという状態のキューからデキューを行うと、最も古いデータであるAが取り出され、キューの状態はB, C, Dとなる。デキューの際には、キューにデータが存在するかどうかが確認される。もしキューが空であった場合(「キューが空(Empty)」の状態)、デキュー操作は失敗するか、あるいはキューにデータが追加されるまで待機するなどの処理が行われることがある。
エンキューとデキューは、多くのシステムで活用されている。典型的な利用例としては、タスクスケジューリングが挙げられる。オペレーティングシステムでは、複数のプロセスやスレッドが同時に実行を要求するが、CPUなどのリソースは限られているため、それらを公平かつ効率的に処理する必要がある。このとき、実行待ちのタスクをキューにエンキューし、CPUが空いたときにキューの先頭からタスクをデキューして実行することで、タスクの処理順序を保証し、システム全体の安定稼働に寄与する。
また、メッセージキューシステムも重要な応用例である。これは、異なるソフトウェアコンポーネントやシステム間でメッセージを非同期にやり取りする際に使用される。送信側はメッセージをキューにエンキューし、受信側はキューからメッセージをデキューして処理する。この仕組みにより、送信側と受信側の処理速度の違いを吸収したり、一時的に受信側が利用不能になった場合でもメッセージが失われることなく保持されたりするなど、システムの疎結合化と耐障害性の向上に貢献する。Webサーバーがリクエストを処理する際にも、過剰なリクエストを一時的にキューに格納し、サーバーが処理できる範囲でデキューしていくことで、システムへの負荷集中を緩和するバッファリングの役割を果たすこともある。
さらに、プリンターのスプール機能もエンキュー/デキューの良い例である。複数のユーザーが同時に印刷ジョブを送信した場合、それらのジョブはプリンターが処理できる速度で順次処理される必要がある。このとき、印刷ジョブはキューにエンキューされ、プリンターが空いたときにキューの先頭からデキューされて印刷される。
このように、エンキューとデキューは、データの流れを制御し、処理の順序を保証し、システム間の連携を円滑にするための基本的ながら非常に強力なメカニズムである。これらの操作を理解することは、信頼性の高い、スケーラブルなシステムを設計・実装する上で不可欠な基礎知識となる。