日本-日本語
日本HPホーム 製品 & サービス サポート & ドライバー ソリューション ご購入方法
≫  お問い合わせ

製品とサービス >  ソフトウェアとOS >  OpenVMS >  マニュアル

OpenVMS マニュアル


≫ 

OpenVMS V8.3
ライブラリ

タイトルページ
目次
まえがき
第 1 章:移行プロセスの概要
第 2 章:移行方法の選択
第 3 章:アプリケーションの移行
第 4 章:再コンパイルと再リンクの概要
第 5 章:ページ・サイズの拡大に対するアプリケーションの対応
第 6 章:共有データの整合性の維持
第 7 章:アプリケーション・データ宣言の移植性の確認
第 8 章:アプリケーション内の条件処理コードの確認
第 9 章:アプリケーションのトランスレート
第 10 章: ネイティブなイメージとトランスレートされたイメージの間の相互操作性の確認
第 11 章:OpenVMS Alpha コンパイラ
付録 A :アプリケーション評価チェックリスト
用語集
索引
PDF
OpenVMS ホーム
OpenVMS Alpha オペレーティング・システム | HPE 日本

OpenVMS Alpha
オペレーティング・システム
OpenVMS VAX から OpenVMS Alpha へのアプリケーションの移行


目次 索引

  1. DEC C for OpenVMS Alphaシステムの不可分性に関する組み込み機能を使用するには, builtins.hヘッダ・ファイルをインクルードしなければなりません。

  2. このバージョンでは,変数 flag はロングワードとして宣言されているため,不可分なアクセスが可能です(不可分性に関する組み込み機能を使用するには,変数をこのように宣言しなければなりません)。

  3. インクリメント操作は不可分性に関する組み込み機能を使用して実行されます。



6.2.2 無意識に共有されるデータの保護

例 6-1 では,2つのスレッドはどちらも同じ変数をアクセスします。しかし,Alphaシステムでは,暗黙のうちに共有される変数に対してアプリケーションで不可分性を持たせることが可能です。この例では,2つの変数はロングワードまたはクォドワードの境界内で物理的に隣接しています。VAXシステムでは,各変数は個別に処理できます。 Alphaシステムでは,ロングワード・データとクォドワード・データのみ,不可分な読み込み操作と書き込み操作がサポートされるため,処理の対象となるバイトを変更する前に,ロングワード全体をフェッチしなければなりません (データ・アクセス粒度の変更についての詳しい説明は, 第 7 章 を参照してください)。

この問題を示すために, 例 6-1 のプログラムを変更したバージョンについて考えてみましょう。このバージョンでは,メイン・スレッドとASTスレッドはそれぞれデータ構造体で宣言された別々のカウンタ変数をインクリメントします。カウンタ変数は次の文によって宣言されます。


struct { 
    short int     flag; 
    short int ast_flag; 
    }; 

メイン・スレッドとASTスレッドがどちらも,処理の対象となるワードを同時に変更しようとした場合には,2つの操作が実行されるタイミングに応じて,結果は予想できなくなります。

対処方法

同期に関するこの問題を解決するには,次の処理を実行してください。

  • 共有変数のサイズをロングワードまたはクォドワードに変更します。しかし, Alphaシステムのコンパイラは状況によってはクォドワード命令を使用するため,データの整合性を確実にするにはクォドワードを使用しなければなりません。たとえば,データが自然な境界にアラインされていない場合には,コンパイラはデータをアクセスするためにクォドワード命令を使用します。
    データ構造の各要素が自然なクォドワード境界に強制的にアラインされるように,データの間にバイトを挿入することもできます。OpenVMS Alpha コンパイラは省略時の設定により,データを自然な境界にアラインします。
    たとえば,他の実行スレッドからの妨害を受けずに,データ構造の各フラグ変数を確実に変更できるようにするには,64ビットの値となるように変数の宣言を変更します。DEC C を使えば, doubleデータ型を使用できます。次の例を参照してください。


    struct { 
        double      flag; 
        double  ast_flag; 
        }; 
    

  • 不可分性に関する組み込み機能や volatile 属性などのような,コンパイラ・メカニズムを使用してデータを明示的に保護してください。さらに,マルチプロセッサ・システムで実行される複数の実行スレッドによるデータ・アクセスは,$ENQシステム・サービスや,LIB$BBCCIやLIB$BBSSIなどのランタイム・ライブラリ・ルーチンを使用するか,またはコンパイラのインターロック・キュー操作を使用することにより同期をとることができます。



6.3 読み込み/書き込み操作の同期

VAXマルチプロセシング・システムは従来,マルチプロセシング・システム内の1つのプロセッサが複数のデータを書き込むときに,これらのデータが書き込まれた順序と同じ順序で,他のすべてのプロセッサから確認できるように設計されていました。たとえば, CPU Aがデータ・バッファを書き込み( 図 6-3 でXによって表現されるもの),その後でフラグを書き込んだ場合( 図 6-3 で Yによって表現されるもの),CPU Bはフラグの値を確認することにより,データ・バッファが変更されたことを判断できます。

Alphaシステムでは,メモリ・サブシステム全体の性能を向上するために,メモリとの間の読み込み操作および書き込み操作の順序が変更される可能性があります。単一プロセッサで実行されるプロセスの場合には,そのプロセッサからの書き込み操作は要求された順に読み込み可能になることを仮定できます。しかし,マルチプロセッサ・アプリケーションの場合には,メモリに対する書き込み操作の結果がシステム全体から確認できるようになる順序を,前もって判断できません。つまり,CPU Aによって実行される書き込み操作は,実際に書き込まれた順序とは異なる順序でCPU Bから見える場合もあります。

図 6-3 はこの問題を示しています。CPU AはXに対する書き込み操作を要求し,その後,Yに対する書き込み操作を要求します。CPU BはYからの読み込み操作を要求し,Yの新しい値を確認し,Xの読み込み操作を開始します。Xの新しい値がまだメモリに書き込まれていない場合には,CPU Bは前の値を読み込みます。この結果,CPU AとCPU Bで実行されるプロシージャが依存するトークン受け渡しプロトコルは正しく機能しなくなります。CPU Aはデータを書き込み,フラグ・ビットをセットできますが,CPU Bは,データが実際に書き込まれる前にフラグ・ビットがセットされていることを確認する可能性があり,その結果,誤ったメモリの内容を使用してしまいます。

図 6-3 Alphaシステムでの読み込み/書き込み操作の順序


対処方法

並列に実行され,読み込み/書き込みの順序に依存するプログラムは, Alphaシステムで正しく実行するために何らかの設計変更が必要です。アプリケーションに応じて,次の方法を使用してください。

  • 終了の順序が重要な,すべての読み込み命令と書き込み命令の前後では, Alphaメモリ・バリア命令(MB)を使用してください。たとえば, DEC C for OpenVMS Alphaシステムコンパイラは組み込み機能として,メモリ・バリア命令をサポートします。

  • LIB$ランタイム・ライブラリで提供されるVAXインターロック命令のメモリ・インターロックを使用するように,アプリケーションの設計を変更してください。

  • ロックによってデータを保護するために,$ENQシステム・サービスと$DEQシステム・サービスを使用するように,アプリケーションの設計を変更してください。



6.4 トランスレートされたイメージの不可分性の保証

VESTコマンドの/PRESERVE修飾子は,VAXシステムで提供されるのと同じ不可分性を保証して,AlphaシステムでトランスレートされたVAXイメージを実行できるようにするためのキーワードを受け付けます。/PRESERVE修飾子のキーワードは複数のタイプの不可分性保護機能を提供します。ただし,これらの/PRESERVE修飾子のキーワードを指定すると,アプリケーションの性能が低下する可能性があります(/PRESERVE修飾子の指定についての詳しい説明は,『DECmigrate for OpenVMS AXP Systems Translating Images』を参照してください)。

VAXシステムでVAX命令が不可分な方法で実行できる操作を,トランスレートされたイメージでもできるようにするには, /PRESERVE修飾子に対してINSTRUCTION_ATOMICITYキーワードを指定します。

ロングワードまたはクォドワードに格納された隣接バイトを同時に更新し,これらの各バイトが相互に妨害しないようにするには,/PRESERVE修飾子に対して MEMORY_ATOMICITYキーワードを指定します。

読み込み/書き込み操作が実行される順序が要求した順序と同じ順序で実行されるように見えるようにするには,/PRESERVE修飾子に対して READ_WRITE_ORDERINGキーワードを指定します。


目次 索引

印刷用画面へ
プライバシー 本サイト利用時の合意事項 ウェブマスターに連絡