VAX アーキテクチャには,ユニプロセシング・システムで,読み取り-変更-書き込みメモリ操作を単一の割り込み不可能な操作として実行する命令が含まれています。
不可分性は,メモリを一度の操作で変更できる能力のことを指します。このような命令は複雑で,性能が著しく落ちるため, Alpha システムまたは I64 システムの読み取り-変更-書き込み操作は,不可分でなく,割り込み可能な命令シーケンスとしてのみ実行できます。
さらに,VAX の命令では,周囲のメモリに影響を与えることなく,メモリ中の単独のアラインされた,またはアラインされていないバイト,ワード,ロングワードをアドレス指定できます。 (データ項目は,項目のアドレスがバイト単位のサイズの偶数倍になっている場合に
アラインされていると見なされます。) 細分性は,アラインされているロングワードの一部に対して独立に書き込みが行えることを示します。
バイト,ワード,アラインされていないロングワードのアクセスも性能を著しく低下させるため, OpenVMS Alpha システムでは,アラインされているロングワードとクォドワードにしかアクセスできません。そのため,単一のバイト,ワード,アラインされていないロングワードを書き込むための命令シーケンスを実行すると,周囲のバイトが読み込まれて書き戻されます。
Itanium にはバイトとワードにアクセスするための命令がありますが,アラインされていない場合,性能が低下します。
これらのアーキテクチャ上の違いにより,特定の条件ではデータが破壊される可能性があります。
OpenVMS Alpha システムでは,不可分性と細分性の維持は,他のスレッドがメモリを変更できないようにロックすることで実現されるのではなく,読み取り-変更-書き込み操作の間にメモリが変更されたかどうかを判断する手段を提供することで実現されます。変更された場合は,読み取り-変更-書き込み操作が再度実行されます。
OpenVMS I64 システムでは,不可分性は OpenVMS Alpha と同様に操作をリトライすることで実現されます。
データの一貫性を保証するため,コンパイラには,以降の項で説明する条件で使用する修飾子と指示文があります。
2.11.1 不可分性の維持 |
|
OpenVMS VAX , OpenVMS Alpha ,および OpenVMS I64 のマルチプロセシング・システムでは,並列に動作する複数のスレッドが書き込み可能なグローバル・セクションにある共用データを変更するアプリケーションは,データに対するアクセスを同期させる何らかの手段を必要とします。 OpenVMS VAX のシングル・プロセッサ・システムでは,メモリの変更命令だけで共用データへのアクセスを同期させるのに十分です。しかし, OpenVMS Alpha システムや OpenVMS I64 システムでは,これだけでは不十分です。
メモリ変更オペランドを使用した VAX 命令に対して,読み取り-変更-書き込み操作の一貫性を保証するために,コンパイラでは /PRESERVE=ATOMICITY オプションが使用できます。また,必要に応じて VAX MACRO ソース・コードのセクションに .PRESERVE ATOMICITY 指示文と .NOPRESERVE ATOMICITY 指示文を挿入し,不可分性の有効と無効を切り替えることもできます。
たとえば,以下の命令があるとします。この命令は,R1 が指すデータに対する読み込み,変更,書き込みシーケンスを要求します。