ソフトウェアの非互換性とは、同じコンピュータ上、またはコンピュータ ネットワークで接続された異なるコンピュータ上で、一緒に満足に動作できないソフトウェアコンポーネントまたはシステムの特性のことです。これらは、協調的または独立して動作するように意図されたコンポーネントまたはシステムの場合があります。ソフトウェアの互換性とは、同じコンピュータ上、またはコンピュータ ネットワークで接続された異なるコンピュータ上で、一緒に満足に動作できるソフトウェア コンポーネントまたはシステムの特性のことです。一部のソフトウェア コンポーネントまたはシステムは、ある環境では互換性があっても、別の環境では互換性がない可能性があります。
例
デッドロック
次の形式の順次プログラムを考えてみましょう。
リソースAをリクエスト リソースBを要求する AとBを使ってアクションを実行する リソースBを解放する リソースAを解放する
特定のプログラムは、ファイルを印刷するために プリンター(リソース A) とファイル(リソース B)を使用する場合があります。
このようなプログラム P1、P2、P3 ... が同時に複数動作する場合、最初に実行されるプログラムは、リソースが解放されるまで他のプログラムをブロックし、プログラムは順番に実行されます。問題は発生しません。実行順序を決定するのはリソースの割り当てであるため、 単一プロセッサ システムとマルチプロセッサシステムのどちらが使用されているかは関係ありません。
ただし、一般的にプログラマーは特定の方法でプログラムを書くことを強制されておらず、ガイドラインがあっても、ガイドラインと異なる場合があることに注意してください。前のプログラムのバリエーションは次のようになります。
リソースBを要求する リソースAをリクエスト AとBを使ってアクションを実行する リソースAを解放する リソースBを解放する
リソース A と B は前の例と同じです。単なるダミー変数ではなく、それ以外はプログラムは同一です。
これまでと同様に、Q1、Q2、Q3 などの複数のプログラムがリソースを使用して同時に実行される場合、問題は発生しません。
ただし、複数の P が複数の Q と同時に実行されるように設定されている場合、デッドロック状態が発生する可能性があります。デッドロックは必ずしも発生するわけではありませんが、発生する可能性もあることに注意してください。
P: リソースAを要求する Q: リソースBを要求する Q: リソース A をリクエスト (P によってブロック) P: リソース B を要求 (Q によってブロック) ...
これでPもQも1に進むことができなくなります。
これは、プログラムに互換性がない可能性がある一例です。
インターフェースの非互換性
別の種類の例としては、あるソフトウェア コンポーネントが別のソフトウェア コンポーネントにサービスを提供する場合が挙げられます。非互換性は、サービスを要求するソフトウェア コンポーネントとサービスを提供するコンポーネント間のパラメーターの順序の変更と同じくらい単純な場合があります。これは、インターフェイスの非互換性の一種です。これはバグと見なされる場合がありますが、一部のシステムでは検出が非常に難しい場合があります。インターフェイスの非互換性には、特に厳密に型指定されたシステムの場合、ビルド段階で簡単に検出できるものもありますが、見つけるのが難しく、実行時にのみ検出できるものもあります。また、詳細なプログラム分析なしでは検出がほぼ不可能なものもあります。
次の例を考えてみましょう。
コンポーネント P は、パラメータ x と y を使用してコンポーネント Q を呼び出します。この例では、y は整数になります。
Q は、必要なゼロにならない f(x) を返し、y を無視します。
Q のバリアントである Q' は同様の動作をしますが、次の違いがあります。
y = 100 の場合、Q' は終了しません。
P が y を 100 に設定して Q を呼び出すことがない場合は、代わりに Q' を使用すると互換性のある計算になります。ただし、P が y を 100 に設定して Q を呼び出す場合は、代わりに Q' を使用すると、終了しない計算になります。
さらにf(x)が数値を持つと仮定すると、成分Q''は次のように定義されます。
Q''はQと同じように動作しますが、 y = 100の場合、Q''は終了しない y = 101の場合、Q''は0.9 * f(x)を返します。 y = 102の場合、Q''はランダムな値を返します y = 103 の場合、Q'' は 0 を返します。
問題の動作を引き起こす可能性があります。P が = 101 で Q'' を呼び出すと、計算結果は不正確になりますが、プログラム障害は発生しない可能性があります。P が y = 102 で Q'' を呼び出すと、結果は予測できず、ゼロ除算や算術オーバーフローなどの他のエラーが原因で障害が発生する可能性があります。P が y = 103 で Q'' を呼び出し、P が除算演算で結果を使用する場合、ゼロ除算障害が発生する可能性があります。
この例では、あるプログラム P1 が別のプログラム Q1 と常に互換性がある可能性があるが、P1 と Q1' が時々互換性がなく、P1 と Q1'' が常に互換性がないような他のプログラム Q1' および Q1'' が構築される可能性があることを示しています。
パフォーマンスの非互換性
プログラム P と Q が同じコンピュータ上で実行されている場合があり、一方が存在すると他方のパフォーマンスが低下することがあります。これは、コンピュータが仮想メモリを使用している場合に特に発生します。その結果、ディスク スラッシングが発生し、一方または両方のプログラムのパフォーマンスが大幅に低下する可能性があります。この形式の非互換性は、P と Q が連携するように意図されている場合に発生する可能性がありますが、P と Q がまったく無関係であるが、たまたま同時に実行されている場合にも発生する可能性があります。例としては、P が大きな出力ファイルを生成するプログラムであり、たまたまそのファイルがメイン メモリに格納され、Q がハード ディスク上の多数のファイルをスキャンするウイルス対策プログラムである場合が挙げられます。仮想メモリにメモリ キャッシュが使用されている場合、2 つのプログラムが悪影響を及ぼし、それぞれのパフォーマンスが大幅に低下する可能性があります。
一部のプログラム P および Q では、パフォーマンスの互換性は実行される環境によって異なる場合があります。メイン メモリが制限されたコンピュータで実行すると互換性が大幅になくなる可能性がありますが、メモリがもっと多いマシンでは問題なく実行できる可能性があります。一部のプログラムは、ほとんどすべての環境でパフォーマンスの互換性がない場合があります。
参照
参考文献
- CM クリシュナ、KG シン、リアルタイム システム、McGraw-Hill、1997 年
