Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

ブロッキング(ブロッキング)とは | 意味や読み方など丁寧でわかりやすい用語解説

ブロッキング(ブロッキング)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

読み方

日本語表記

ブロッキング (ブロッキング)

英語表記

blocking (ブロッキング)

用語解説

ITシステムにおけるブロッキングとは、ある処理が、他の処理がリソースを占有している、あるいは特定の操作の完了を待機しているために、それ以上進行できず停止している状態を指す。この停止状態は、システムの応答性や全体のパフォーマンスに直接的な影響を与える可能性があるため、システム設計や運用において重要な考慮事項となる。ブロッキングは、データベースアクセス、ファイルI/O、ネットワーク通信、並行処理など、様々な場面で発生し得る。

ブロッキングは、その発生する文脈によって具体的なメカニズムや影響が異なるが、根底にあるのは「利用可能なリソースの不足」または「特定の処理の完了待ち」という共通の状況である。

まず、データベース管理システム(DBMS)におけるブロッキングについて説明する。データベースでは、複数のトランザクションが同時にデータにアクセスする。このとき、データの一貫性と整合性を保つために「ロック」という仕組みが用いられる。例えば、あるトランザクションが特定の行やテーブルのデータを更新している間、他のトランザクションがその同じデータにアクセスしようとすると、更新処理が完了してロックが解放されるまで待機させられる。これがデータベースにおけるブロッキングの典型的な例である。

ロックには主に「共有ロック」と「排他ロック」がある。共有ロックは、データを読み取る際に設定され、複数のトランザクションが同時にデータを読み取ることを許可するが、書き込みは制限する。一方、排他ロックは、データを更新する際に設定され、そのデータに対する他のすべてのアクセス(読み取りも書き込みも)をブロックする。排他ロックがかかっている間に別のトランザクションが同じデータにアクセスしようとすると、そのトランザクションは排他ロックが解放されるまでブロッキング状態となる。このようなブロッキングが頻繁に発生すると、データベースの応答速度が低下し、ユーザー体験に悪影響を及ぼす。重度のブロッキングは、さらに「デッドロック」と呼ばれる状態を引き起こす可能性もある。デッドロックは、複数のトランザクションがお互いのロック解除を永遠に待ち続ける状況であり、システム全体が停止する事態に発展することもある。データベースにおけるブロッキングの対策としては、トランザクションの実行時間を可能な限り短縮する、適切なインデックスを設定してデータアクセスの効率を高める、ロックの粒度(行ロック、ページロック、テーブルロックなど)を適切に選択する、あるいは非ブロッキングなデータアクセス手法を検討する、といった方法がある。

次に、入出力(I/O)処理におけるブロッキングについて説明する。プログラムがファイルからの読み込み、ディスクへの書き込み、ネットワーク経由でのデータ送受信など、外部デバイスやネットワークとの間でデータ転送を行う際、その処理の完了を待機する必要がある場合がある。このようなI/O処理を「ブロッキングI/O」と呼ぶ。ブロッキングI/Oでは、I/O操作が開始されると、その操作が完了するまでプログラム(または実行中のスレッド)は待機状態となり、他の処理を進めることができない。例えば、大きなファイルを読み込む処理を単一スレッドで行う場合、ファイルの読み込みが完了するまで、そのスレッドはユーザーインターフェースの更新や他の計算処理を行うことができないため、アプリケーションが一時的にフリーズしたように見えることがある。

これに対し、「ノンブロッキングI/O」という概念が存在する。ノンブロッキングI/Oでは、I/O操作を開始しても、その完了を待たずにすぐに制御を呼び出し元に返し、他の処理を続行できる。I/O操作の完了は、後から別の方法(例えば、イベント通知やポーリング)で確認する。これにより、一つのスレッドがI/O処理の完了を待っている間に、別のI/O処理やCPU処理を並行して行うことが可能となり、アプリケーションの応答性やスループットを向上させることができる。ブロッキングI/Oを使用する場合でも、マルチスレッドプログラミングを利用して、ブロッキングされる可能性のあるI/O処理を別のスレッドで実行し、メインスレッドがユーザーインターフェースの更新など応答性を求められる処理を継続するといった対策が取られることがある。

最後に、並行処理やマルチスレッドプログラミングにおけるブロッキングについて触れる。複数のスレッドやプロセスが共有リソース(メモリ上のデータ構造、ファイルなど)にアクセスする際、データの破損や競合状態を防ぐために同期メカニズムが必要となる。この同期メカニズムとして「ロック」(ミューテックスやセマフォなど)がよく用いられる。あるスレッドが共有リソースへのアクセスを排他的に制御するためにロックを取得すると、そのロックが解放されるまで、他のスレッドは同じリソースにアクセスしようとしてもブロッキング状態となる。これにより、一度に一つのスレッドだけが共有リソースを変更できるため、データの整合性が保たれる。しかし、ロックの取得と解放のタイミングが不適切であると、必要以上に多くのスレッドがブロッキングされ、並行処理のメリットが失われたり、前述のデッドロックが発生したりするリスクがある。ブロッキングによる性能劣化を避けるためには、ロックする範囲を最小限に抑える、ロックフリーアルゴリズムの採用を検討する、待機にタイムアウトを設定するといったアプローチが考えられる。

このように、ブロッキングは様々な技術領域にわたって発生するが、その本質は「リソースの競合」や「処理の完了待ち」によって引き起こされる進行の停止状態である。システムエンジニアを目指す上では、このブロッキングがどのような状況で発生し、どのような影響を与え、どのように対策を講じるべきかを理解することが極めて重要である。

関連コンテンツ

関連IT用語

関連ITニュース

関連プログラミング言語