ソフトウェアの信頼性
ソフトウェアにおける「信頼性」とは,ソフトウェアが機能やサービスを期待通りに実行できるかどうかを表す品質特性である.
このソフトウェアの信頼性には,次の3つの特性がある.
- 成熟性(Maturity)
ソフトウェアの故障発生頻度であり,狭義の意味でのソフトウェア信頼性である.「所定の環境及び期間において,ソフトウェア故障が発生することなく動作する,もしくは,機能やサービスを提供することができる性質や度合い」と言える.
- 障害許容性(Fault tolerance)
ソフトウェア故障が発生した時のユーザへの影響度合
- 回復性(Recoverability)
ソフトウェア故障からの復旧の速さ
ソフトウェアの高信頼化技術
ソフトウェアの信頼性を向上させるための技術は,ソフトウェア信頼性技術と呼ばれ,固有技術と管理技術に分類される.
- 固有技術
ソフトウェアの信頼性に直接的影響を与える技術であり,次のようなものがある.
- フォールトアボイダンス技術
ソフトウェア開発過程におけるフォールトの混入を防ぐための技術であり,要求仕様化技術,設計技術,コーディング技術をはじめ,各工程での中間成果物を審査するレビューやインスペクションなどのいわゆるフォールト混入予防技術がある.
- フォールトトレランス技術
試験により取り除くことができなかったフォールトに起因するソフトウェア故障が発生したとしても,それを可能な限り許容するための技術である.
その基本的な考え方は,マルチバージョンソフトウェア技法(Multi-version software technique)と呼ばれる技法であり,独立した N (≧ 2) チームが同一仕様のソフトウェアを開発する技法である.その代表的な実装方法として,次のような技法がある.
- リカバリブロック(Recovery block)
同一入力に対する出力結果が規定された許容範囲を満たすまで異なったバージョンを実行する技法であり,すべてのバージョンの出力結果が許容範囲を満たさない場合にシステム障害とする.
- N バージョンプログラミング(N-version programming)
同じ処理を異なるアルゴリズムで複数実装しておき,同一入力に対する各バージョンの処理結果から多数決論理に基づいて最終的な出力の決定を行う.
- 管理技術
ソフトウェア信頼性の定量的な計測・評価・予測技術,信頼性モデリング技術,データ収集技術など,ソフトウェアの信頼性に間接的影響を与える技術である. また,コンピュータシステムの急激な発展と普及に伴い,ソフトウェア信頼性の重要性が高まる中,このソフトウェア信頼性技術を工学的観点から取り扱う学術分野は特に,ソフトウェア信頼性工学(software reliability engineering)と呼ばれている.
ソフトウェア信頼性の計量化
- 確率変数
ソフトウェアの信頼性を計測,評価するためには,ソフトウェア故障発生事象 (フォールト発見事象) に関する確率諸量を定義する必要がある.
$N(t)$ = 時刻 $t$ までに発見された総ソフトウェア故障発生数 (総フォールト数)
$S_k$ = $k$ 番目のソフトウェア故障発生時刻 ($k = 0,1,2,\cdots; S_0 = 0$)
$X_k$ = ($k-1$) 番目と $k$ 番目のソフトウェア故障発生時間間隔 ($k = 1,2,\cdots; X_0 = 0$)
これらの変数 $N(t)$,$S_k$,$X_k$ は,確率変数として取り扱われ,次の関係がある.
\[S_k = X_1 + X_2 + \cdots + X_k = \sum_{i=1}^k X_i , X_k = S_k - S_{k-1}\]
{$N(t) = k$} は,時刻 $t$ までに $k$ 個のフォールトが発見されることを意味し,{$N(t), t \ge 0$} は,経過時間に伴う累積発見フォールト数を表す確率過程として扱われる.
- ソフトウェア信頼性評価尺度
ソフトウェア信頼度(software reliability function)とは,時刻 $t$ までテストが進行しているとき,その後の時間区間 $(t, t + x]\ (t \ge0, x \ge 0)$ においてソフトウェア故障が発生しない確率として定義される.
定義より,ソフトウェア信頼度 $R(x|t)$ は,
\[ R(x|t) = \exp[-\{M(t+x) - M(t)\}] \]
のように求められる.
また,検出可能フォールト数が有限であることを仮定した平均ソフトウェア故障発生時間間隔(MTBF)の代替的尺度として次の尺度がある.
- 瞬間 MTBF(instantaneous MTBF)
\[ \mathrm{MTBF_I}(t) = 1 / m(t), \ m(t) = dM(t)/dt \]
- 累積 MTBF(cumulative MTBF)
\[ \mathrm{MTBF_C} = t/M(t) \]
ソフトウェア信頼性モデル (Software reliability model)
定量的なソフトウェア信頼性評価を目的とした数理モデルであり,ソフトウェアの高信頼化を支援する基盤技術として利用されている.ソフトウェア信頼性モデルを構築する際には,開発プロセスに関する要因(レビュー回数,レビュー工数密度など),プロダクトに関する要因(開発規模,ファンクションポイントなど),及び資源要因(テスト人員,テスト項目数など)を考慮したシンプルでかつ精度良く信頼性評価を行えるモデルが必要とされる.
- 経験モデル (Empirical model)
開発プロセスにおいて経験的もしくは実験的に収集されるデータを用いて,種々の信頼性特性との関連性を定式化する.
- 解析モデル (Analytical model)
- 動的モデル
ソフトウェアの実行過程に依存した信頼性特性の時間的挙動を記述する. ソフトウェア信頼度成長モデル(Software Reliability Growth Model: SRGM)と呼ばれる.
- 非同次ポアソン過程モデル
- マルコフ過程モデル
- 統計的データ解析モデル
ロジステック曲線モデル,ゴンペルツ曲線モデル,修正指数曲線モデル
- 静的モデル
ソフトウェアの実行過程に依存した信頼性特性の時間的挙動を考慮しない.
- フォールト領域モデル
- フォールト埋め込みモデル
意図的にプログラム中にフォールトを埋め込んでおき,テストにより発見されたフォールトのうち意図的に埋め込まれたフォールトの発見率から全体のバグの数を推定する.
- 2段階エディット法
2人のプログラマに独立にテストを実行させ,共通に発見したバグ数からテスト開始前に潜在した固有バグ数を推定する.それぞれ摘出したバグ数を $E_1$,$E_2$,共通するバグ数を $E_c$ とするとき,潜在バグ数を ($E_1・E_2)/E_c$ で推定する.
- サンプリング法
全ての $T_t$ 個のテスト項目から $T_s$ 個のテスト項目を選択してテストし, $E_s$ 個のバグを摘出した場合,潜在バグ数を $E_s(T_t/T_s)$ で推定する.
- データ領域モデル
入力データをランダムに選択しテストし,障害が発生する確率を求める (MTBF による残存バグ数推定).
ソフトウェア信頼度成長モデル
ソフトウェア信頼度成長モデルは,一般的に,費やされたテストもしくは運用時間や実行されたテストケース数などの時間的要因と発見フォールト数やソフトウェアハザードレートなどの信頼性特性との関係性を定式化した数理モデルである.
時間的要因と発見フォールト数との関係性を定式化したモデルはフォールト発見数モデル(fault count model)と呼ばれ,ソフトウェアハザードレートとの関係性を定式化したものはハザードレートモデル(hazard rate model)と呼ばれる.フォールト発見数モデルを信頼性評価に適用する場合は,フォールト発見数もしくはソフトウェア故障観測数を一定の時間ごとに数え上げた信頼性データが必要である.
- 非同次ポアソン過程モデル(Nonhomogeneous poisson process: NHPP)
フォールト発見数モデルの代表的かつ実用的なモデルである非同次ポアソン過程モデルは,次の3つの基本的仮定に基づいて構築される.
- ソフトウェア故障が発生した場合,その原因となるフォールトは直ちにかつ完全に修正・除去される.
- 各ソフトウェア故障発生時刻は,それぞれ独立かつ同一の確率分布 $\mathrm{Pr}\{T \le t\} ≡ F(t)$ に従う.
- テスト開始前にソフトウェア内に潜在する総フォールト数 $N_0 \gt 0$ は,有限であり,平均 $ω (\gt 0)$ のポアソン分布に従う.
この仮定から,時刻 $t$ までに $m$ 個のフォールトが発見される確率関数は,次のように求められる.
\begin{eqnarray}
\mathrm{Pr}\{N(t)=m\} &=& \sum_{n} {}_n\mathrm{C}_m \{F(t)\}^m\{1-F(t)\}^{n-m} \mathrm{Pr}\{N_0=n\} \\
&=& \sum_{n} {}_n \mathrm{C}_m \{F(t)\}^m \{1-F(t)\}^{n-m} (ω^n/{n!}) e^{-ω} \\
&=& [\{ω F(t)\}^m/{m!}] \exp\{-ω F(t)\} \quad (m=0, 1, 2,\ldots, n)
\end{eqnarray}
ここで,$M(t) = ω F(t)$ は,時間区間 $(0, t)$ において発見される総期待フォールト数,すなわち $N(t)$ の期待値を表し,NHPP の平均値関数と呼ばれる.
ここで,
$F(t)$ に対して指数分布や 2次のガンマ分布を適用した場合,それぞれ,指数形ソフトウェア信頼度成長モデルや遅延S字形ソフトウェア信頼度成長モデルが得られる.