セマフォーとシグナルは、どちらも4D ランゲージによって提供される、マルチプロセスアプリケーションでのプロセス間でのやり取りを管理し衝突を避けるためのツールです。それぞれ目的と用途が異なります:
- セマフォー とは、2つまたはそれ以上のプロセスが同じリソースを同時に変更しないようにするための仕組みです。セマフォーは、それを設定したプロセスしか解除することができません。
- シグナル とは、1つまたはそれ以上のプロセスが実行を一時停止して、特定のタスクが完了するのを待つようにするための仕組みです。どのプロセスもシグナルで待機したりシグナルをリリースすることができます。
コンピュータープログラムにおけるセマフォーとは、複数のユーザー、またはプロセスによる同時実行が許されない処理を保護するためのツールです。
4D では通常、インタープロセス配列を編集する場合にセマフォーが必要となります。あるプロセスによって配列の値が変更されている間、他のプロセスから同じ処理を同時実行することは、不可能でなくてはなりません。セマフォーを利用することで、ある処理が他のプロセスによって実行中でない場合にのみ、同処理を実行できるよう、特定処理へのアクセスを制御することができます。セマフォーで保護された排他処理にアクセスしようとしたプロセスには、次の可能性があります:
- プロセスはアクセス権を取得し、処理を実行します。
- プロセスはアクセス権を得られなかった場合、取得できるまで待機します。
- プロセスはアクセス権を得られなかった場合、その処理を放棄します。
このようにセマフォーを利用することによって、コードを部分的に保護することができます。処理への同時アクセスをひとつのプロセスに制限し、アクセス権を所持しているプロセスがセマフォーを解放するまで、他のプロセスによる同処理へのアクセスはブロックされます。
4D では、Semaphore 関数をコールすることによってセマフォーを設定します。セマフォーを解放するには、CLEAR SEMAPHORE コマンドをコールします。
Semaphore 関数の動作は特殊で、場合によっては二つのアクションを同時に行うことがあります:
- セマフォーが他プロセスによって設定済みの場合、TRUE を返します
- セマフォーが未設定の場合、コール元のプロセスにセマフォーを割り付け、同時に FALSE を返します
必要に応じて、ひとつのコマンドで同時に二つの動作を行うことにより、セマフォーの確認と設定の間に外部処理が割り込むことを防ぎます。
セマフォーの確認だけを行いたい場合には、Test semaphore コマンドを使います。このコマンドは通常、会計の年度締めなどの長い処理の中で使用され、新規データの登録といった特定の操作へアクセスできないよう、インターフェースを制御するのに利用されます。
セマフォーは次のルールに沿って使います:
- セマフォーの設定と解放は同じメソッドで行います。
- セマフォーの保護下でのコード実行は可能な限り短くします。
- セマフォーが解放されるまで待つには、Semaphore 関数の tickCount パラメーターを利用して、待機時間を設定します。
セマフォーを使用するコードの典型例です:
While(Semaphore("MySemaphore";300))
IDLE
End while
CLEAR SEMAPHORE("MySemaphore")
セマフォーが解放されないと、データベースの一部がブロックされたままになります。セマフォーを同一メソッドにて設定・解放することで、このリスクがなくなります。
セマフォーで保護されたコードを最短に抑えることは、セマフォーがボトルネックとなってアプリケーションの性能が低下してしまうのを防ぎます。
また、Semaphore コマンドで任意の tickCount パラメーターを指定することは、セマフォーが解放されるまでの待機を最適化するのに重要です。このパラメーターを使うと、コマンドは次のように動作します:
- 指定された Tick (1/60秒) 数の時間 (例では 300、つまり 5秒) を限度として、プロセスはコード実行を停止して、セマフォーが解放されるのを待ちます。
- 指定時間内に解放されたセマフォーはすぐに、待機していたプロセスに割り付けられ (Semaphore は FALSE を返します)、そのプロセスはコード実行を再開します。
- 指定時間内にセマフォーが解放されなければ、プロセスのコード実行が再開します。
このコマンドはキューを生成し、リクエストの優先順位を管理します。最初にセマフォーを要求したプロセスから順にアクセス権を得る仕組みになっています。
待ち時間は用途に応じて指定するとよいでしょう。
4Dには2種類のセマフォー、ローカルセマフォーとグローバルセマフォーがあります。
- ローカルセマフォーは、同じワークステーション上のすべてのプロセスからアクセスすることができます (同一ワークステーション上に限られます)。ローカルセマフォーは、セマフォー名の先頭にドル記号 ($) を付けて作成します。ローカルセマフォーは、同一ワークステーション上で実行しているプロセス間で処理を監視するのに使用します。例えば、シングルユーザーデータベースやワークステーション上において、すべてのプロセスに共有されるインタープロセス配列へのアクセスを監視するのにローカルセマフォーを使用します。
- グローバルセマフォーは、すべてのユーザーおよびプロセスからアクセスすることができます。グローバルセマフォーはマルチユーザデータベースのユーザー間で処理を監視するために用います。
グローバルセマフォーとローカルセマフォーは理論的には同じものです。違いはその有効範囲にあります。
クライアント/サーバーモードでは、グローバルセマフォーはすべてのクライアントおよびサーバーで実行中の全プロセスに共用されます。ローカルセマフォーは、それが作成されたマシン上で実行中のプロセス間でのみ共用されます。
スタンドアロンモードの 4D ではユーザーがひとりしかいないため、グローバルセマフォーもローカルセマフォーもその有効範囲は同じです。ただし、シングルとマルチの両方の形でデータベースを使用する場合は、用途に適したスコープのセマフォーを使い分ける必要があります。
注: インターフェースやインタープロセス変数など、クライアントアプリケーションのローカルな状態を管理するためにセマフォーを使用する場合には、ローカルセマフォーを利用することをお勧めします。このようなケースでグローバルセマフォーを使用すると、不要なネットーワークアクセスが行われるだけでなく、他のクライアントにまで影響を与えかねません。ローカルセマフォーを使用すればこのような望ましくない影響を避けることができます。
ドキュメンテーションは移動しました
この章にあったドキュメンテーションは developer.4d.com へと移動しました。