第 14 章 並行処理のサポート

Server Express では並行処理がサポートされているため、複数のプログラムを同時にアクティブ化して CPU 資源を有効に活用したり、より高度なプログラミング技法を利用したりすることが可能です。

14.1 概要

Server Express のランタイムシステムは、実行単位の並行処理をサポートしています。1 つの実行単位は、COBOL のメインプログラムと、そこから直接または間接的に呼び出されるすべてのプログラムやサブプログラムから構成されます。そのため、実行単位は、単独のプログラムである場合と、複数のプログラムの組である場合があります。

実行単位間では、ライブラリルーチンを使って共有メモリ領域にアクセスすることによって、相互通信を行うことができます。該当する各ルーチンについては、この章の最後で説明しています。

並行処理のサポート機能は、オペレーティングシステムの 1 つのプロセスに対応しています。

14.2 実行単位の管理

次に挙げる用語と概念に関する理解は、実行単位の操作を円滑化するうえで役立ちます。

用語
説明
オリジネータ 呼び出し階層の最上位の実行単位。他の実行単位を最初に呼び出します。
他の実行単位を呼び出す実行単位
親からの呼び出しによって生成される実行単位
実行単位セット オリジネータとその下位の全実行単位の総称

生成された子は、呼び出し元である親の一部の属性を継承します。これらの属性は、呼び出しが行われた時点で親から子にコピーされます。それ以降に親の属性に変更が加えられても、子の属性には変更は反映されません。同様に、子の属性に加えられた変更は、親の属性にはまったく影響を与えません。

実行単位を操作する際には、次の点に留意してください。

実行単位は、いくつかの COBOL ライブラリルーチンで管理できます。

ルーチン
説明
CBL_EXEC_RUN_UNIT 非同期の COBOL 実行単位を作成する。
CBL_CULL_RUN_UNITS 終了した実行単位をすべてクリアする。
CBL_YIELD_RUN_UNIT 実行単位の残りのタイムスライスを譲渡する。

これらのルーチンの詳細については、『ライブラリルーチン』を参照してください。

14.2.1 実行単位間の相互通信

実行単位の間では、2 通りの方法で相互通信を行うことが可能です。1 つは名前付き値、もう 1 つは動的に割り当てられた共有メモリです。

コンパイル時にメモリ領域に割り当てられた名前は、複数の実行単位の間でデータをやり取りするためのポインタとして利用できます。この名前によって指定される値 (名前付き値) は、1 つの実行単位セット内のすべての実行単位から同時に参照できます。この値はランタイムシステムによって保護され、更新は必ず順序付けされます。定義可能な名前付き値の最大数は、マシンに搭載されている物理メモリの容量によって左右されます。

この値が動的に割り当てられたメモリブロックを指すポインタであれば、割り当て済みの名前を使ってアドレスを取得するのみで、実行中のすべての実行単位からメモリブロックにアクセスできます。いくつもの実行単位がメモリブロック内のデータに変更を加える場合には、セマフォを確保してデータの整合性を維持する必要があります。

共有メモリは実行単位セット単位で所有されるため、実行単位セットが終了すると解放されます。一方、非共有メモリはそれを確保したプログラムによって所有されており、プログラムのキャンセル時に解放されます。

実行単位で名前付き値を使って、共有メモリや動的に割り当てられたメモリの両方、または一方を利用するには、次に示すルーチンを使用します。

ルーチン
説明
CBL_PUT_SHMEM_PTR 名前付き値を作成または更新する。
CBL_GET_SHMEM_PTR 名前付き値を読み取る。
CBL_ALLOC_MEM メモリを動的に割り当てる。
CBL_FREE_MEM 動的に割り当てたメモリを解放する。

注: 実行単位間でデータを共有するには、CBL_GET_SHMEM_PTR と CBL_PUT_SHMEM_PTR を使ってデータ共有を明示的に有効化する必要があります。


14.3 実行単位とメモリルーチン

COBOL システムライブラリには、次の並行処理管理用ルーチンが含まれています。各ルーチンの詳細については、『ライブラリルーチン』を参照してください。

メモリ割り当て
CBL_ALLOC_MEM メモリを動的に割り当てる。
CBL_FREE_MEM 動的に割り当てたメモリを解放する。
実行単位の操作
CBL_CULL_RUN_UNITS 終了した実行単位をクリアする。
CBL_EXEC_RUN_UNIT 実行単位を生成する。
CBL_GET_SHMEM_PTR 名前付き値を読み取る。
CBL_PUT_SHMEM_PTR 名前付き値を作成または更新する。
CBL_YIELD_RUN_UNIT 実行単位の残りのタイムスライスを譲渡する。

Copyright © 2006 Micro Focus (IP) Ltd. All rights reserved.