<HTML>

<!-- ************ --><!-- ** ヘッダ ** --><!-- ************ -->
<HEAD>
	<TITLE>
		第一種＆高度午前対策テキスト(４回目)(基本ソフトウェア・ソフトウェア工学)
	</TITLE>
</HEAD>

<!-- ************ --><!-- ** ボディ ** --><!-- ************ -->
<BODY BGCOLOR="#FFFF99">
21586<!-- ******************** --><!-- ** ページタイトル ** --><!-- ******************** -->
	<CENTER>
		<HR>
		<FONT SIZE=5>
			<BR>
			第一種＆高度午前対策テキスト(４回目)<BR>
			<BR>
			第4部　基本ソフトウェア<BR>
			第6部　ソフトウェア工学<BR>
			<BR>
		</FONT>
		<HR>
	</CENTER>

	<!-- ********************** --><!-- ** ページの注意書き ** --><!-- ********************** -->
	<BLOCKQUOTE>
		<UL>
			<LI>本ページの著作権は、<A HREF="http://itac.gr.jp/">情報処理技術者勉強会[iTAC]</A>の主宰者に帰属します。無断での転載、複写を禁止します。
			<LI>本ページは<A HREF="http://itac.gr.jp/">情報処理技術者勉強会[iTAC]</A>の主宰者である<A HREF="mailto:mizuoka@itac.gr.jp">水岡先生</A>の講義をまとめたものです。ただしビデオで録画していたわけではありませんので、聞き逃していたり、間違って解釈しているところもあるかもしれません。その場合は<A HREF="http://itac.gr.jp/juku/bbs/">ｉＴＡＣ塾掲示板：http://itac.gr.jp/juku/bbs/</A>へ投稿して下さい。
			<LI>本ページはCAIT(中央情報教育研究所)の「第一種共通カリキュラム」に沿った構成となっています。
			<LI>本ページでは、ダウンロード時間の短縮のため、図をテキストで表現しているところが多数あります。したがって等幅フォントでご覧になることをオススメします。
			<LI>本ページの文責はすべて<A HREF="mailto:hirochen@arkweb.co.jp">鈴木　博之（ヒロチェンコ）</A>にあります。
		</UL>
	</BLOCKQUOTE>
	<!-- ************** --><!-- ** 更新履歴 ** --><!-- ************** -->
	<CENTER>
		<HR>
		<BR>
		更新履歴<BR>
		<TABLE BORDER=1>
		<TR>
			<TD ALIGN="CENTER">年月日
			<TD ALIGN="CENTER">更新内容
		<TR>
			<TD>1999.12.25
			<TD>第3版をアップしました
		<TR>
			<TD>1999.11.01
			<TD>誤記の修正を行いました
		<TR>
			<TD>1999.04.09
			<TD>初版をアップしました
		</TABLE>
		<BR>
	</CENTER>

	<!-- ****************** --><!-- ** 本文タイトル ** --><!-- ****************** -->
	<CENTER>
		<HR>
		<BR>
		<FONT SIZE=5>
			第4部　基本ソフトウェア<BR>
		</FONT>
		<BR>
	</CENTER>

	<!-- ************** --><!-- ** 本文開始 ** --><!-- ************** -->
	<BLOCKQUOTE>

		<FONT SIZE=4 COLOR="BLUE"><B>■タスク／プロセス制御</B></FONT><BR>

		<BR>
		○ジョブ、タスク、プロセス、スレッド<BR>
		<BR>
		ＯＳの機能として、<FONT COLOR="RED">タスク</FONT>管理、<FONT COLOR="RED">プロセス</FONT>管理がある。どちらもほぼ同義語である。タスクはメインフレーム系、プロセスはＵＮＩＸ，ＰＣ系の用語である。<BR>
		<BR>
		タスク、プロセスはシステムから見た仕事の単位、つまりシステムの都合である。<BR>
		<BR>
		これに対して<FONT COLOR="RED">ジョブ</FONT>という用語がある。ジョブはＵＮＩＸやＰＣで言えばバッチ処理である。これはユーザから見た仕事の単位、つまりユーザの都合である。<BR>
		<BR>
		例えばＡＴＭでお金を引き出す場合を考える。キャッシュカードをスロットに挿入して、暗証番号と必要な金額を入力する。しばらく待つとお金が引き出される。この時システム内部では暗証番号確認、残高照会、引き落としなどの処理が行われている。これらの処理を総称してジョブという。ジョブには一つ一つの処理の流れ、ストーリー性がある。これを<FONT COLOR="RED">ジョブステップ</FONT>という。ジョブステップがタスク、プロセスに相当する。<BR>
		<BR>

		<TABLE BORDER=0><TR><TD><PRE>
　　　┌┌─────┐
　　　││本人確認　←タスク
ジョブ││残高照会　←タスク
　　　││引き落し　←タスク
　　　││お金を渡す←タスク
　　　└└─────┘
		</PRE></TABLE>

		タスク、プロセスをさらに細分化したものを<FONT COLOR="RED">スレッド（軽量プロセス）</FONT>という。スレッドはＣＰＵ以外の資源を他のスレッドと共用している。<BR>
		<BR>
		○ジョブ管理<BR>
		<BR>
		ジョブには、ジョブ投入からジョブ終了までに４つのプロセスがある。<BR>
		<BR>
		まず<FONT COLOR="RED">リーダ</FONT>が動き出す。リーダはジョブ全体の環境設定を行う。ジョブステップにしたがって一つ一つのタスクをコールする。例えばレポートを１００部作成する場合を考えると、ワープロを打つ要員と、イラストを描く要員と、コピーを取る要員が必要となる。リーダはこれらの要員の手配を行う。<BR>
		<BR>
		次に<FONT COLOR="RED">イニシエータ</FONT>が動き出す。イニシエータはそれぞれのタスクに資源を与える。レポートの例では、ワープロを打つ要員にワープロを与えるイメージである。イニシエータは各要員に必要な機材を与える。<BR>
		<BR>
		イニシエータが動き出せば、タスク、プロセス管理に制御が移る。<BR>
		<BR>
		タスク、プロセスが終了すれば、<FONT COLOR="RED">ターミネータ</FONT>が起動する。ターミネータは資源の解放などの後処理を行う。レポートの例では、ワープロを片付け、イラスト要員に紙とペンを与える。<BR>
		<BR>
		ここまでの処理でジョブが終了していなければ、再びイニシエータが起動し、タスク、プロセスを起動する。<BR>
		<BR>
		ジョブがすべて終了していれば、ライタが起動する。<FONT COLOR="RED">ライタ</FONT>はジョブの結果を出力する。レポートの例では、上長にレポートを提出するのがこれに当たる。<BR>
		<BR>
		ジョブ全体を管理するものをジョブスケジューラという。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
      　　 ジョブ投入
      　　　　 ↓
  ┌  　┌──────┐
  │  　│   リーダ   │
  │  　└──────┘
  │  　　　　 │
  │  ┌──→ │
  │  │　　　 ↓
ジ│  │┌──────┐
ョ│  ││イニシエータ│
ブ│  │└──────┘
ス│  │
ケ│  │　　　 →タスク・プロセス管理
ジ│  │
ュ│  │┌──────┐
｜│  ││ターミネータ│
ラ│  │└──────┘
  │  │　　　 │
  │  └─── │
  │  　　　　 ↓
  │  　┌──────┐
  │  　│   ライタ   │
  └    └──────┘
      　　　　 ↓
      　　 ジョブ終了
		</PRE></TABLE>

		上図において、イニシエータが起動すると、タスク、プロセス管理に制御が移るという表現があった。ここからはタスク、プロセス管理について解説する。頻出分野であるタスク、プロセスの状態遷移図の解説である。<BR>
		<BR>
		タスク、プロセス管理は、マルチタスク、マルチプロセスのために必要となった技術である。<BR>
		<BR>
		タスクがジョブスケジューラによって生成されると、まず<FONT COLOR="RED">Ｒｅａｄｙ（実行可能状態）</FONT>になる。実行可能状態の実体は単なる待ち行列である。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
                                      タスク
                                      生成
                                      　│
                                      　│
                                      　↓
                          <FONT COLOR="RED">┌───────┐</FONT>
                          <FONT COLOR="RED">│　Ｒｅａｄｙ　│</FONT>
                          <FONT COLOR="RED">│(実行可能状態)│</FONT>
                          <FONT COLOR="RED">└───────┘</FONT>
		</PRE></TABLE>

		次に<FONT COLOR="RED">ディスパッチャ</FONT>によりＣＰＵが割り当てられる。これをＣＰＵ割当て（ディスパッチ）という。ＣＰＵ割当てのアルゴリズムとして、<FONT COLOR="RED">ＳＪＦ</FONT>、<FONT COLOR="RED">ラウンドロビン</FONT>がある。ＣＰＵ割当てはタスクスケジューリングともいう。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
              <FONT COLOR="RED">ＣＰＵ割当</FONT>  ┌───────┐
            <FONT COLOR="RED">(ディスパッチ)</FONT>│　Ｒｅａｄｙ　│
                  <FONT COLOR="RED">←───</FONT>│(実行可能状態)│
                  　　　　└───────┘
		</PRE></TABLE>

		ＣＰＵ割当てが行われると、タスク、プロセスは<FONT COLOR="RED">Ｒｕｎ（実行状態）</FONT>に遷移する。ここで処理が終了すれば、タスクは消滅する。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
<FONT COLOR="RED">┌───────┐</FONT>        ┌───────┐
<FONT COLOR="RED">│　　Ｒｕｎ　　│</FONT>        │　Ｒｅａｄｙ　│
<FONT COLOR="RED">│　(実行状態)　│</FONT>←───│(実行可能状態)│
<FONT COLOR="RED">└───────┘</FONT>        └───────┘
		</PRE></TABLE>

		ここでもし入出力が発生すると、入出力の間ＣＰＵは何もしないことになる。そこでタスクを<FONT COLOR="RED">Ｗａｉｔ（待ち状態）</FONT>に遷移させ、ＣＰＵを他のタスクに明け渡す。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
　　　　　　<FONT COLOR="RED">┌───────┐</FONT>
　　　　　　<FONT COLOR="RED">│　 Ｗａｉｔ　 │</FONT>
　　　　　　<FONT COLOR="RED">│　(待ち状態)  │</FONT>
　　　　　　<FONT COLOR="RED">└───────┘</FONT>
　　　　　　　　　<FONT COLOR="RED">┐</FONT>
　　　　　　　　<FONT COLOR="RED">／</FONT>
　　　　　　　<FONT COLOR="RED">／</FONT>
　　　　　　<FONT COLOR="RED">／</FONT>
　　　　　<FONT COLOR="RED">／</FONT>
┌───────┐　　　　┌───────┐
│　　Ｒｕｎ　　│　　　　│　Ｒｅａｄｙ　│
│　(実行状態)　│←───│(実行可能状態)│
└───────┘　　　　└───────┘
		</PRE></TABLE>

		入出力が終わっても、実行状態に遷移せず、実行可能状態に遷移する。つまりＣＰＵ待ちの最後に並ばせる。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
　　　　　　┌───────┐
　　　　　　│　 Ｗａｉｔ　 │
　　　　　　│　(待ち状態)  │
　　　　　　└───────┘
　　　　　　　　　┐　　<FONT COLOR="RED">＼</FONT>
　　　　　　　　／　　　　<FONT COLOR="RED">＼</FONT>
　　　　　　　／　　　　　　<FONT COLOR="RED">＼</FONT>
　　　　　　／　　　　　　　　<FONT COLOR="RED">＼</FONT>
　　　　　／　　　　　　　　　　<FONT COLOR="RED">┘</FONT>
┌───────┐　　　　┌───────┐
│　　Ｒｕｎ　　│　　　　│　Ｒｅａｄｙ　│
│　(実行状態)　│←───│(実行可能状態)│
└───────┘　　　　└───────┘
		</PRE></TABLE>

		タスクスケジューリング（ＣＰＵ割当て）には、いくつか方法がある。まず最初に考え出された方法が<FONT COLOR="RED">ＦＩＦＯ(First In First Out)</FONT>である。ＦＩＦＯは単なる待ち行列である。<BR>
		<BR>
		例えば職場のコピー機を考える。コピー機は１台で、そこに次々とコピーしたい人がやってくる。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌────┐
│        │────────────
│コピー機│(Ａ)　(Ｂ)　　(Ｃ)←
│        │────────────
└────┘100枚 1枚　　 10枚
		</PRE></TABLE>

		ＦＩＦＯでは、途中で入出力割り込みが発生したら、また待ち行列の後ろに並ばねばならない。またどんなに処理に時間がかかっても、一度実行状態になったら、終わるまで次のタスクにＣＰＵを譲らない。コピー機に例えれば、コピーを取っている間に別の用事が入ったら、コピーはそこで中断、別の用事をこなして帰ってきたらまた列の後ろに並ばねばならない。また自分が１００枚のコピーを取るとして、後ろに１枚の人が並んでいたら、通常は後ろの人に譲るであろう。ＦＩＦＯには譲るという概念がないし、割り込みが入ればまた並び直しとなる。<BR>
		<BR>
		そこで次の人が１枚のコピーだったら先に譲る方式が考え出された。それが<FONT COLOR="RED">ＳＪＦ(Short Job First)（最短時間順）</FONT>である。（Jobはこの場合タスクを表している）。これは処理時間の少ないタスクを先に通す方式である。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌────┐
│        │────────────
│コピー機│(Ａ)　(Ｂ)　　(Ｃ)←
│        │────────────
└────┘100枚 1枚　　 10枚

　　　　　　　││
　　　　　　　＼／
┌────┐
│        │────────────
│コピー機│(Ｂ)　(Ａ)　　(Ｃ)←
│        │────────────
└────┘1枚　 100枚　 10枚
		</PRE></TABLE>

		しかし３日後の会議の資料をコピーしたい人と、１０分後の会議の資料をコピーしたい人が並んだ場合、後者が優先であろう。そこで優先度順方式が考え出された。優先度順方式は待ち行列の中にさらに複数の待ち行列がり、それぞれに優先度をつけたものである。優先度の高いタスクは優先度の高い待ち行列に、優先度の低いタスクは優先度の低い待ち行列に並ぶ方式である。コピーの例では、１０分後の会議に使う資料のコピーには高い優先度の待ち行列に、３日後の会議に使う資料のコピーには低い優先度の待ち行列に並ぶイメージである。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌────┐
│        │────────
│コピー機│(Ａ)            今日必要なコピーの待ち行列
│        │────────
└────┘────────
            (Ｂ)            明日でよいコピーの待ち行列
            ────────
            ────────
            (Ｃ)            明後日でよいコピーの待ち行列
            ────────
		</PRE></TABLE>

		ここまでは、一度実行状態に入ったら、タスクが終了するまでは他にＣＰＵを明け渡すことはない。コピーの例では１００枚のコピーが始まったら、次に１枚だけコピーする人が並んでいようと、絶対に譲らないイメージである。<BR>
		<BR>
		ここまではこれは実行状態から実行可能状態への遷移（矢印）がない。<BR>
		<BR>
		そこで実行状態から実行可能状態への遷移の概念、つまりタイマ割り込みの概念が誕生した。<BR>
		<BR>
		それが<FONT COLOR="RED">ラウンドロビン方式</FONT>である。ラウンドロビン方式はＦＩＦＯ＋タイマ割り込みである。ラウンドロビン方式の待ち行列は１つだけである。<BR>
		<BR>
		コピーの例では、まずタイマを「一度にコピーできる枚数は１０枚まで」と決める。そこへコピーを取る人Ａさん、Ｂさん、Ｃさんがやってくる。Ａさんは２０枚のコピー、Ｂさんは１枚、Ｃさんは１５枚である。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌────┐
│        │────────────
│コピー機│(Ａ)　(Ｂ)　　(Ｃ)←
│        │────────────
└────┘ 20枚 1枚　　 10枚
		</PRE></TABLE>

		コピーは最初に並んだＡさんから取り始める。Ａさんが２０枚のうち、１０枚コピーを取ると、コピー機から強制的に引き離されて、後ろに並ばされる。次にＢさんがコピーを始める。Ｂさんは１枚なのですぐ終了する。次にＣさんがコピーを始める。ＣさんもＡさん同様１５枚中１０枚のコピーが終了した時点でコピー機から引き離され、Ａさんの後ろに並ばされる。Ａさんは残りのコピーを取り、次いでＢさんも残りのコピーを取る。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌────┐
│        │────────────
│コピー機│(Ａ)　(Ｂ)　　(Ｃ)←
│        │────────────
└────┘ 20枚 1枚　　 10枚

　　　　　　　││１０枚コピー終了
　　　　　　　＼／
┌────┐
│        │────────────
│コピー機│(Ｂ)　(Ｃ)　(Ａ)←列の後ろに並ぶ
│        │────────────
└────┘1枚　 10枚　10枚
		</PRE></TABLE>

		ラウンドロビン方式はタスクが平等に行われるが、優先度を考慮していない。そこで<FONT COLOR="RED">多段待ち行列方式</FONT>が考え出された。多段待ち行列方式も一本の待ち行列の中に、さらに優先度ごとの待ち行列がある方式である。<BR>
		<BR>
		タスクは最初は一番優先度の高い待ち行列に並ぶ。もしそれよりも優先度の高いタスクが到着したら、最初のタスクはそのタスクに順番を譲り、次の優先度の待ち行列に並ぶ。高い優先度の待ち行列が空になった時点で、次の優先度に並んでいるタスクが高い優先度に移る。<BR>
		<BR>
		コピーの例では、コピー待ちの行列に役員専用の列、部長専用の列、課長専用の列があるようなものである。優先度は役員専用の列が一番高く、以下部長専用、課長専用と続く。最初に到着した人が課長の場合、課長はまず役員専用の列に並ぶ。次に部長が到着した場合、課長は部長に順番を譲り、自分は部長専用の列に並ぶ。次に到着したのが役員なら、部長は役員に順番を譲り、自分は部長専用の列に並ぶ。部長専用の列に並んでいた課長は係長専用の列に並ぶ。ただしこれでは新人がいつまでたってもコピーできないので、同情した上の者が一時的に部長権限や役員権限を与えて、役員の列に並ばせたりもする。<BR>
		<BR>
		多段待ち行列方式は、ラウンドロビン＋優先度順である。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌────┐
│        │────────
│コピー機│(Ａ)            役員専用待ち行列
│        │────────
└────┘────────
            (Ｂ)            部長専用待ち行列
            ────────
            ────────
            (Ｃ)            課長以下の待ち行列
            ────────
		</PRE></TABLE>

		今あるほとんどのパソコンは、タスク、プロセス管理としてラウンドロビン方式、もしくは多段待ち行列方式を採用している。ラウンドロビン方式と多段待ち行列方式は<FONT COLOR="RED">フィードバック待ち行列方式</FONT>ともいう。<BR>
		<BR>
		タスクの切り替え方式には、自分の仕事が終わるまでＣＰＵを独占し、仕事が終わったら明け渡す<FONT COLOR="RED">ノンプリエンプション方式</FONT>と、たとえ作業中でもあらかじめ決められてタイマ（時間）を使い切ったらＣＰＵを明け渡す<FONT COLOR="RED">プリエンプション方式</FONT>の２種類の方式がある。<BR>
		<BR>
		身近な例では、プリエンプション方式はＷｉｎｄｏｗｓ９５、ノンプリエンプション方式はＷｉｎｄｏｗｓ３．１。Ｗｉｎｄｏｗｓ３．１では、プロセスが作業を始めたらマウスカーソルが砂時計に変わり、その間は何もできないが、Ｗｉｎｄｏｗｓ９５ではマウスカーソルの右上に砂時計が表示され、別の作業中でも他のアイコンをクリックできる場合がある。<BR>
		<BR>

		○セマフォ<BR>
		<BR>
		共用ドライブ上にあるＷｏｒｄファイルを開く場合を考える。別の人が同じファイルを開こうとすると「このファイルは○○さんによって編集中です。」という警告が表示され、参照専用で開く事はできるが、更新はできない。これはＷｏｒｄどうしが連絡を取り合い、使用中のファイルを更新させないようにしているためである。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌────┐                ┌────┐
│パソコン│──┐    ┌→×│パソコン│
│　 Ａ   │    ↓    │    │　 Ｂ   │
├────┤  ┌────┐  ├────┤
└────┘  │Ｗｏｒｄ│  └────┘
              │　文書  │
              └────┘
		</PRE></TABLE>

		ここで、スレッドＡと、スレッドＢを考える。スレッドは軽量プロセスとも呼ばれ、タスクをさらに細分化した実行単位である。スレッドはＣＰＵ以外の資源は共有する。したがって同じ資源（ファイルなど）にアクセスする場合は<FONT COLOR="RED">排他</FONT>というしくみが必要である。排他を実現する方式が<FONT COLOR="RED">セマフォ</FONT>である。セマフォとは線路に他の列車が入ってこないようにさせる腕木のことである。（セマフォはオランダ語の腕木である）。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌────プロセス────┐
│　　　　　　　　　　　　│
│┌タスクＡ┐┌タスクＢ┐│
││ＣＰＵ  ││ＣＰＵ  ││
││メモリ  ││メモリ  ││
││ファイル││ファイル││
│└┼───┘└───┼┘│
└─┼────────┼─┘
    │                │
    │  ┌ファイル┐  │
    │  │        │  │
    └→│        │×┘
  ロック│        │使用不可
        └────┘
		</PRE></TABLE>

		セマフォのキーワードは<FONT COLOR="RED">Ｐ操作</FONT>と<FONT COLOR="RED">Ｖ操作</FONT>である。Ｐ操作はその資源を使用中とする。Ｖ操作はその資源を空き状態とする。<BR>
		<BR>

		<FONT SIZE=4 COLOR="BLUE"><B>■主記憶管理とプログラム制御</B></FONT><BR>

		<BR>
		ＯＳの機能として、タスク管理、プロセス管理、ジョブ管理の他に、メモリ管理がある。（Ｗｉｎｄｏｗｓ９５で言えば、マイコンピュータのプロパティで「パフォーマンス」タブを選択すると、搭載しているメモリのサイズが確認できる）。<BR>
		<BR>
		メモリには<FONT COLOR="RED">実メモリ</FONT>と<FONT COLOR="RED">仮想メモリ</FONT>の２種類があり、実メモリは主記憶装置（つまりＤＲＡＭ）、仮想メモリは補助記憶装置（つまりハードディスク）である。実メモリに収まりきれないデータを収めようとしたり、プログラムを実行しようとした場合、データやプログラムをいくつかの部分に分割して仮想メモリに待避する。仮想メモリに待避した部分が必要になれば、実メモリに読み込む。この時の方式として<FONT COLOR="RED">固定区画方式</FONT>と<FONT COLOR="RED">可変区画方式</FONT>の２種類がある。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌────┐ ┐
│        │ │
│ メモリ │ │実メモリ
│ (DRAM) │ │
│        │ │
├────┤ ┤
│        │ │
│        │ │
│        │ │
│　仮想　│ │仮想メモリ
│ メモリ │ │
│  (HD)  │ │
│        │ │
│        │ │
└────┘ ┘
		</PRE></TABLE>

		○可変区画方式<BR>
		<BR>
		可変区画方式は、メモリ確保の要求があればそのまま割り当てる方式である。メモリに飛び飛びの空き領域（<FONT COLOR="RED">フラグメンテーション</FONT>）が発生した場合は、飛び飛びの領域を詰めて、まとまった大きさのメモリ領域を確保する。<BR>
		<BR>
		例えば１６ＭＢ（メガバイト）のメモリがあり、そこに３ＭＢを消費するＥｘｃｅｌと、５ＭＢを消費するＷｏｒｄと、６ＭＢを消費するインターネットエクスプローラを読み込む。（メモリの消費量は説明の都合上設定した値である）。メモリの残りは２ＭＢである。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌────┐  ┌────┐        ┌────┐
│ メモリ │←│ Excel  │        │ Excel  │
│１６ＭＢ│  └────┘        ├────┤
│        │  ┌────┐        │ Word   │
│        │←│ Word   │        │        │
│        │  │        │  ─＼  ├────┤
│        │  └────┘  ─／  │Internet│
│        │  ┌────┐        │Exproler│
│        │  │Internet│        │        │
│        │←│Exproler│        ├────┤
│        │  │        │        │        │
└────┘  └────┘        └────┘
		</PRE></TABLE>

		そこでＷｏｒｄを終了させ、５ＭＢの領域を開放した。残りのメモリは合計７ＭＢである。<BR>
		<BR>
		まだメモリに余裕があるので、７ＭＢを消費するＰｏｗｅｒＰｏｉｎｔを起動した。しかしまとまった７ＭＢの領域が確保できないので、メモリ不足となり起動に失敗する。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌────┐
│ Excel  │
├────┤    ┌────┐
│        │    │Power   │
│        │×←│  Point │
├────┤    │        │
│Internet│    │        │
│Exproler│    └────┘
│        │
├────┤
│        │
└────┘
		</PRE></TABLE>

		このような飛び飛びの領域の事をフラグメンテーションという。フラグメンテーションのため、トータルでは起動するのに十分なメモリ量でも、メモリ不足となるり、メモリ確保に失敗する。<BR>
		<BR>
		この問題を解決するために、飛び飛びの領域を詰めて、まとまった大きさの領域を確保する。この操作を<FONT COLOR="RED">メモリコンパクション</FONT>という。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌────┐                      ┌────┐
│ Excel  │                      │ Excel  │
├────┤                      ├────┤
│Internet│                      │Internet│
│Exproler│                      │Exproler│
│        │                ─＼  │        │
├────┤  ┌────┐  ─／  ├────┤
│   ↑   │  │Power   │        │Power   │
│        │←│  Point │        │  Point │
│        │  │        │        │        │
│        │  │        │        │        │
└────┘  └────┘        └────┘
		</PRE></TABLE>

		○固定区画方式<BR>
		<BR>
		固定区画方式は、メモリを一定の大きさの領域に区切り、それぞれにデータやプログラムを格納する方式である。データやプログラムが区切った領域よりも大きい場合、データやプログラムを分割して複数の領域に格納する。<BR>
		<BR>
		この一定の大きさに区切る単位をページという。<BR>
		<BR>

		先ほどの例で考える。ページの単位を２ＭＢとすると、３ＭＢを消費するＥｘｃｅｌは２ページ、５ＭＢを消費するＷｏｒｄは３ページ、６ＭＢを消費するインターネットエクスプローラは３ページを使用する。残りは０ページである。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌────┐
│ Excel  │
├────┤
│ Excel  │
├────┤
│ Word   │
├────┤
│ Word   │
├────┤
│ Word   │
├────┤
│ IE     │
├────┤
│ IE     │
├────┤
│ IE     │
└────┘
		</PRE></TABLE>

		そこでＥｘｃｅｌとインターネットエクスプローラを終了させると、５ページ分の領域が開放さる。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌────┐
│        │
├────┤
│        │
├────┤
│ Word   │
├────┤
│ Word   │
├────┤
│ Word   │
├────┤
│        │
├────┤
│        │
├────┤
│        │
└────┘
		</PRE></TABLE>

		ここで８ＭＢを消費するＡｃｃｅｓｓを起動すると、４ページを必要とするが、この場合ページが飛び飛びであってもメモリに読み込む事は可能である。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌────┐                      ┌────┐
│        │                      │ Access │
├────┤                      ├────┤
│        │                      │ Access │
├────┤                      ├────┤
│ Word   │                      │ Word   │
├────┤                      ├────┤
│ Word   │                ─＼  │ Word   │
├────┤  ┌────┐  ─／  ├────┤
│ Word   │  │ Access │        │ Word   │
├────┤  │        │        ├────┤
│        │  │        │        │ Access │
├────┤  │        │        ├────┤
│        │←│        │        │ Access │
├────┤  │        │        ├────┤
│        │  │        │        │        │
└────┘  └────┘        └────┘
		</PRE></TABLE>

		メモリコンパクションを行うと、プログラムが格納された領域も移動する必要がある。このとき移動可能なプログラムと、移動不可能なプログラムがある。移動可能なプログラムを<FONT COLOR="RED">再配置可能</FONT>なプログラムという。<BR>
		<BR>
		再配置可能なプログラムでも、実行中に再配置できるものと、実行中は再配置できないものがある。実行中に再配置できるプログラムを<FONT COLOR="RED">動的再配置可能</FONT>なプログラムといい、実行中に再配置できない（再配置するには再度起動せねばならない）プログラムを<FONT COLOR="RED">静的再配置可能</FONT>なプログラムという。<BR>
		<BR>
		再配置可能や、再利用可能、再帰的など、頭に「再」がつく言葉がいくつかある。以下に整理する。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
プログラム┬再入可能（リエントラント）──┬再帰（リカーシブ）
　　　　　│　　　　　　　　　　　　　　　└非再帰（非リカーシブ）
　　　　　└非再入可能（非リエントラント）┬逐次再使用可能
　　　　　　　　　　　　　　　　　　　　　└逐次再使用不可能
		</PRE></TABLE>

		○再入可能（リエントラント）<BR>
		<BR>
		<FONT COLOR="RED">再入可能</FONT>とは、複数のプロセスからコールされても、並行して実行可能であり、並行で実行しても矛盾が生じない構造のプログラム。Ｅｘｃｅｌを複数起動して、タスクバーにいくつものＥｘｃｅｌが並んでも、メモリ不足になることはない。これは起動しているＥｘｃｅｌは一つだけだからである。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌────┐
│        │
│        │
│        │
│        │
├────┤
│        │
│ Excel  │←Ｅｘｃｅｌそのものは
│        │　メモリ上に一つ
├────┤
│        │
└────┘
		</PRE></TABLE>

		○再帰的（リカーシブ）<BR>
		<BR>
		<FONT COLOR="RED">再帰</FONT>とは、自分自身を呼び出すこと。Ｗｏｒｄのウィンドゥの中でさらに複数の文書ウィンドゥが開いているのが再帰のイメージである。再帰は再入可能プログラムでもある。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌─┬─────────┬─┬─┬─┐
│◇│＝＝＝＝＝＝＝＝＝│＿│□│×│
├─┴─────────┴─┴─┴─┤
│        ┌─┬───┬─┬─┬─┐│
│        │◇│＝＝＝│＿│□│×││
│    ┌─┼─┴─┬─┼─┼─┼─┤│
│    │◇│＝＝＝│＿│□│×│  ││
│    ├─┴───┴─┴─┴─┤  ││
│    │                      │  ││
│    │                      │  ││
│    │                      │  ││
│    │                      ├─┘│
│    │                      │    │
│    └───────────┘    │
└─────────────────┘
		</PRE></TABLE>

		○非再入可能（非リエントラント）<BR>
		<BR>
		<FONT COLOR="RED">非再入可能</FONT>とは、複数のプロセスからコールされても、並行して実行することが不可能なプログラムのことである。非再入可能なプログラムには、逐次再使用可能なプログラムと、逐次再使用不可能なプログラムに分かれる。<BR>
		<BR>

		○逐次再使用可能<BR>
		<BR>
		<FONT COLOR="RED">逐次再使用可能</FONT>とは、複数のプロセスからコールされても、同時には使用できないが、メモリ上のプログラムは排他的に共有しているプログラムのことである。Ｗｉｎｄｏｗｓ９５のダイアルアップネットワークはアイコンを何度クリックしても起動するプログラムは一つである。これは逐次再使用可能なプログラムである。<BR>
		<BR>

		<CENTER>
		<HR>
		<BR>
		<FONT SIZE=5>
			６章　ソフトウェア工学とシステム開発能力<BR>
		</FONT>
		<BR>
		</CENTER>

		<FONT SIZE=4 COLOR="BLUE"><B>■システム開発のプロセスモデル</B></FONT><BR>

		<BR>

		１９６０年代、ＩＢＭは<FONT COLOR="RED">ソフトウェア危機</FONT>を唱えた。当時のハードウェアは億単位の金額であったが、ソフトウェアはあくまでおまけであり、ユーザはソフトウェアに対してお金を支払うという意識がなかった。プログラマは職人であり、いかに処理効率を上げるか、いかにメモリを節約するかなどの職人技を磨いていた。しかし職人技であるため、プログラマの育成に１０年近い年月を必要とした。<BR>
		<BR>
		そこでソフトウェア開発に要するコストをユーザに負担してもらうため、いくらかかって、その根拠はこうだと言えるためのコストモデルが考え出された。<BR>
		<BR>
		また経験の浅い人でもベテランと同じ品質でソフトウェアが作れるような方法論としてプロセスモデルが考え出された。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌───┐    ┌───┐    ┌───┐
│      │    │      │    │      │
│  コ  │    │  ソ  │    │  プ  │
│  ス  │    │  フ  │    │  ロ  │
│  ト  │─＼│  ト  │／─│  セ  │
│  モ  │─／│  ウ  │＼─│  ス  │
│  デ  │    │  ェ  │    │  モ  │
│  ル  │    │  ア  │    │  デ  │
│      │    │      │    │  ル  │
└───┘    └───┘    └───┘
└────────┬────────┘
　　　　　 ソフトウェア工学
		</PRE></TABLE>

		○コストモデル<BR>
		<BR>
		第一種としては、コストモデルとしてＣＯＣＯＭＯ、ファンクションポイント法、ハルステッドモデルの３つを押さえておけばよい。<BR>
		<BR>
		・<FONT COLOR="RED">ＣＯＣＯＭＯ</FONT><BR>
		<BR>
		ＣＯＣＯＭＯ(Constructive Cost Model)はソースコードのステップ換算でコストを求めるモデルである。したがってコメントが多ければコストも高い。またベテランほどステップ数が少ないためコストが低い。どちらもコンパイルすれば同じステップ数であるが、方法や経験によってコストに誤差が生じるモデルである。<BR>
		<BR>
		・<FONT COLOR="RED">ファンクションポイント法</FONT><BR>
		<BR>
		ファンクションポイント法は機能ごとにポイントをつけるモデルである。例えば入力画面１枚につき３０万円、出力画面１枚につき４０万円などである。<BR>
		<BR>
		・<FONT COLOR="RED">ハルステッドモデル</FONT><BR>
		<BR>
		ハルステッドモデルはアセンブラ換算した場合のコストを見積もる方法である。つまり実行形式にしたときのステップ数で見積もるということである。ハルステッドモデルは「脳みそのかいた汗に比例する」と言われている。<BR>
		<BR>

		○プロセスモデル<BR>
		<BR>
		第一種としては、プロセスモデルとしてウオーターフォールモデル、プロトタイピング、スパイラルモデルの３つを押さえておけばよい。<BR>
		<BR>
		・<FONT COLOR="RED">ウオーターフォールモデル</FONT><BR>
		<BR>
		水が上流から流れてくるように、後戻りすることのないプロセスモデル。<BR>
		<BR>
		・<FONT COLOR="RED">プロトタイピング</FONT><BR>
		<BR>
		見本。試供品を作ってユーザに見せ、イメージをつかんでもらう。<BR>
		<BR>
		・<FONT COLOR="RED">スパイラルモデル</FONT><BR>
		<BR>
		スパイラルとは渦巻き、らせんのこと。分析、設計、製造、テストの工程を繰り返す。作ってみて、足りない部分を新たに作り込む。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
テ      ┃──┐分
ス┌──╂─┐│析
ト│┌─╂┐││
  ││┌┃│││
━┿┿┿╋┿┿┿━
  ││└╂┘││
製│└─╂─┘│設
造└──╂──┘計
		</PRE></TABLE>

		ウオーターフォールモデルを手本にした設計技法が<FONT COLOR="RED">構造化技法</FONT>、スパイラルモデルを手本にした設計技法が<FONT COLOR="RED">オブジェクト指向技法</FONT>である。<BR>
		<BR>
		以下にそれぞれについて解説する。<BR>
		<BR>
		○構造化技法<BR>
		<BR>
		構造化技法は、分析、設計、プログラミングの順で行われる。しかし構造化技法が発展してきた手順は全く逆で、プログラミング、設計、分析の順番である。<BR>
		<BR>
		まず始めにあったのはプログラミングである。１９５０年代のプログラムはＧＯＴＯ分が多用された、いわゆるスパゲッティプログラムであった。それを見たダイクストラは・順次・反復・繰返しの３つでプログラミングができると提唱した。これが構造化プログラミングである。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
                                    ┌────┐
                                    │ 構造化 │
                                    │プログラ│
                                    │ミング  │
                                    │        │
                                    └────┘
		</PRE></TABLE>

		次に構造化設計が登場した。すなわちモジュール分割技法の登場である。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
                  ┌────┐      ┌────┐
                  │        │      │ 構造化 │
                  │ 構造化 │      │プログラ│
                  │  設計  │      │ミング  │
                  │        │      │        │
                  └────┘      └────┘
		</PRE></TABLE>

		最後に構造化分析が登場した。すなわちＤＦＤ（データフローダイアグラム）の登場である。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌────┐      ┌────┐      ┌────┐
│        │      │        │      │ 構造化 │
│ 構造化 │      │ 構造化 │      │プログラ│
│  分析  │      │  設計  │      │ミング  │
│        │      │        │      │        │
└────┘      └────┘      └────┘
		</PRE></TABLE>

		工程としては分析、設計、プログラミングの順であるが、概念としては逆の順番で成立してきた。<BR>
		<BR>
		構造化技法はウオーターフォールモデルであるから、前の工程に戻ることはできない。矢印は一方向である。したがって次の工程に進めるかどうかの見極めのために、各工程の区切りで<FONT COLOR="RED">レビュー</FONT>を行う。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌────┐      ┌────┐      ┌────┐
│        │      │        │      │ 構造化 │
│ 構造化 │ ─＼ │ 構造化 │ ─＼ │プログラ│
│  分析  │ ─／ │  設計  │ ─／ │ミング  │
│        │┌─┐│        │┌─┐│        │
└────┘│レ│└────┘│レ│└────┘
            │ビ│            │ビ│
            │ュ│            │ュ│
            │｜│            │｜│
            └─┘            └─┘
		</PRE></TABLE>

		構造化技法に基づいたＤＢが<FONT COLOR="RED">ＲＤＢ</FONT>である。ＲＤＢではデータとプログラムが明確に独立している。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌────┐      ┌────┐      ┌────┐ │ ┌────┐
│        │      │        │      │ 構造化 │ │ │        │
│ 構造化 │ ─＼ │ 構造化 │ ─＼ │プログラ│ │ │ ＲＤＢ │
│  分析  │ ─／ │  設計  │ ─／ │ミング  │ │ │        │
│        │      │        │      │        │ │ │        │
└────┘      └────┘      └────┘ │ └────┘
                                             データ独立
		</PRE></TABLE>

		○オブジェクト指向技法<BR>
		<BR>
		オブジェクト指向技法も構造化技法と同様に、プログラミング、設計、分析の順で発達してきた。<BR>
		<BR>
		まず初めにあったのが、オブジェクト指向プログラミングである。オブジェクト指向プログラミングは１９７２年に登場した<FONT COLOR="RED">Ｓｍａｌｌｔａｌｋ</FONT>が有名である。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
                                    ┌────┐
                                    │オブジェ│
                                    │クト指向│
                                    │プログラ│
                                    │ミング  │
                                    └────┘
		</PRE></TABLE>

		次いでオブジェクト設計が登場した。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
                  ┌────┐      ┌────┐
                  │オブジェ│      │オブジェ│
                  │クト指向│      │クト指向│
                  │  設計  │      │プログラ│
                  │        │      │ミング  │
                  └────┘      └────┘
		</PRE></TABLE>

		次いでオブジェクト分析が登場した。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌────┐      ┌────┐      ┌────┐
│オブジェ│      │オブジェ│      │オブジェ│
│クト指向│      │クト指向│      │クト指向│
│  分析  │      │  設計  │      │プログラ│
│        │      │        │      │ミング  │
└────┘      └────┘      └────┘
		</PRE></TABLE>

		オブジェクト指向技法はスパイラル技法であるから、後戻りも可能である。したがって、矢印も両方向に出ている。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌────┐      ┌────┐      ┌────┐
│オブジェ│      │オブジェ│      │オブジェ│
│クト指向│／─＼│クト指向│／─＼│クト指向│
│  分析  │＼─／│  設計  │＼─／│プログラ│
│        │      │        │      │ミング  │
└────┘      └────┘      └────┘
		</PRE></TABLE>

		次いで<FONT COLOR="RED">オブジェクト指向データベース（ＯＯＤＢ）</FONT>が登場した。オブジェクト技法はデータとプログラム（データの操作）を一まとめにして扱う。（カプセル化）。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
                                  ┌──────────────┐
┌────┐      ┌────┐    │┌────┐    ┌────┐│
│オブジェ│      │オブジェ│    ││オブジェ│    │        ││
│クト指向│／─＼│クト指向│／─＼│クト指向│    │ＯＯＤＢ││
│  分析  │＼─／│  設計  │＼─／│プログラ│    │        ││
│        │      │        │    ││ミング  │    │        ││
└────┘      └────┘    │└────┘    └────┘│
                                  └──────────────┘
                                             カプセル化
		</PRE></TABLE>

		構造化技法とオブジェクト指向技法をまとめて表すと、以下のようになる。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌────┐      ┌────┐      ┌────┐ │ ┌────┐
│        │      │        │      │ 構造化 │ │ │        │
│ 構造化 │ ─＼ │ 構造化 │ ─＼ │プログラ│ │ │ ＲＤＢ │
│  分析  │ ─／ │  設計  │ ─／ │ミング  │ │ │        │
│        │      │        │      │        │ │ │        │
└────┘      └────┘      └────┘ │ └────┘
                                             データ独立

                                  ┌──────────────┐
┌────┐      ┌────┐    │┌────┐    ┌────┐│
│オブジェ│      │オブジェ│    ││オブジェ│    │        ││
│クト指向│／─＼│クト指向│／─＼│クト指向│    │ＯＯＤＢ││
│  分析  │＼─／│  設計  │＼─／│プログラ│    │        ││
│        │      │        │    ││ミング  │    │        ││
└────┘      └────┘    │└────┘    └────┘│
                                  └──────────────┘
                                             カプセル化
		</PRE></TABLE>

		両者を二日酔いの会社員に例えると、構造化技法の場合まず医者に行く。そして診断（分析）してもらう。診断が終わったら処方箋（設計）を書いてもらう。処方箋が出来たら、それを薬局に持っていい、薬を調合（プログラミング）してもらう。調合してもらった薬はビンや袋に詰めて（ＲＤＢ）渡される。<BR>
		<BR>
		オブジェクト指向技法の場合、まず自分で症状を分析する。頭痛なら薬箱（ＯＯＤＢ）から薬を取出して飲む。薬がなければ作る。薬を飲んだ結果、頭痛が直れば目的達成。しかしまだ吐き気があるなら再び薬箱から薬を取出す。オブジェクト指向はすなわち目的指向である。<BR>
		<BR>

		○ウオーターフォールモデルにおけるシステム開発のライフサイクル<BR>
		<BR>
		ウオーターフォールモデルは、設計からプログラミングまでを段階的に詳細化して行い、単体テストから総合テストまでを段階的に統合化していく方式である。水が上流から下流に流れるようなイメージで設計を行うため、この名前がついた。<BR>
		<BR>
		ウオーターフォールモデルは以下の手順で作業を行う。<BR>
		<BR>
		(1)分析・要求定義<BR>
		(2)外部設計<BR>
		(3)内部設計<BR>
		(4)プログラム設計<BR>
		(5)プログラミング<BR>
		(6)単体テスト<BR>
		(7)結合テスト<BR>
		(8)システムテスト<BR>
		(9)総合テスト<BR>
		<BR>
		以下、各手順について説明する。<BR>
		<BR>
		(1)分析・要求定義<BR>
		<BR>
		顧客の要求するシステムについて、要求事項を分析する。ここでは構造化分析が行われる。<BR>
		<BR>
		分析・要求定義を行うのがシステムアナリストである。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
<FONT COLOR="RED">┌───────┐</FONT>
<FONT COLOR="RED">│分析・要求定義│</FONT>
<FONT COLOR="RED">└───────┘</FONT>
		</PRE></TABLE>

		(2)外部設計<BR>
		<BR>
		システムをサブシステムに分解し、サブシステムの入出力を設計する。<BR>
		<BR>
		外部設計を行うのがアプリケーションエンジニアである。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌───────┐  
│分析・要求定義│  
└───────┘  
       ││         
       ＼／         
  <FONT COLOR="RED">┌───────┐</FONT>
  <FONT COLOR="RED">│   外部設計   │</FONT>
  <FONT COLOR="RED">└───────┘</FONT>
		</PRE></TABLE>

		ここでシステム、サブシステム、プログラム、モジュールの関係を以下に整理する。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
                  ┌───────┐
                  │   システム   │
                  └───┬───┘
        ┌────────┼────────┐
┌───┴───┐┌───┴───┐┌───┴───┐
│ サブシステム ││ サブシステム ││ サブシステム │
└───────┘└───┬───┘└───────┘
            ┌──────┼──────┐
      ┌──┴──┐┌──┴──┐┌──┴──┐
      │プログラム││プログラム││プログラム│
      └─────┘└──┬──┘└─────┘
            ┌──────┼──────┐
      ┌──┴──┐┌──┴──┐┌──┴──┐
      │モジュール││モジュール││モジュール│
      └─────┘└─────┘└─────┘
		</PRE></TABLE>

		(3)内部設計<BR>
		<BR>
		サブシステムをさらにプログラム単位（機能単位、コンパイル単位）に分割し、物理的な設計を行う。<BR>
		<BR>
		外部設計と内部設計を合わせて構造化設計という。構造化設計はすなわちモジュール分割である。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌───────┐    
│分析・要求定義│    
└───────┘    
       ││           
       ＼／           
  ┌───────┐  
  │   外部設計   │  
  └───────┘  
         ││         
         ＼／         
    <FONT COLOR="RED">┌───────┐</FONT>
    <FONT COLOR="RED">│   内部設計   │</FONT>
    <FONT COLOR="RED">└───────┘</FONT>
		</PRE></TABLE>

		(4)プログラム設計<BR>
		<BR>
		プログラム単位をさらにモジュール単位に分割し、詳細設計を行う。プログラム設計のことを構造化プログラミングという。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌───────┐      
│分析・要求定義│      
└───────┘      
       ││             
       ＼／             
  ┌───────┐    
  │   外部設計   │    
  └───────┘    
         ││           
         ＼／           
    ┌───────┐  
    │   内部設計   │  
    └───────┘  
           ││         
           ＼／         
      <FONT COLOR="RED">┌───────┐</FONT>
      <FONT COLOR="RED">│プログラム設計│</FONT>
      <FONT COLOR="RED">└───────┘</FONT>
		</PRE></TABLE>

		(5)プログラミング<BR>
		<BR>
		ＣやＣＯＢＯＬなどのプログラミング言語を用いてプログラミングを行う。いわゆるコーディングである。<BR>
		<BR>
		プログラミング以降の工程は、プロダクションエンジニアの担当する範囲である。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌───────┐      
│分析・要求定義│      
└───────┘      
       ││             
       ＼／             
  ┌───────┐    
  │   外部設計   │    
  └───────┘    
         ││           
         ＼／           
    ┌───────┐  
    │   内部設計   │  
    └───────┘  
           ││         
           ＼／         
      ┌───────┐
      │プログラム設計│
      └───────┘
                  ││  
                  ＼／  
                <FONT COLOR="RED">┌───────┐</FONT>
                <FONT COLOR="RED">│プログラミング│</FONT>
                <FONT COLOR="RED">└───────┘</FONT>
		</PRE></TABLE>

		これまでの各工程で、テスト項目を作成しておく。テスト項目は以下に述べるテスト工程にて消化する。<BR>
		<BR>

		(6)単体テスト<BR>
		<BR>
		モジュールごとに、プログラム設計通りに出来ているかを確認する。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌───────┐    
│分析・要求定義│    
└───────┘    
       ││           
       ＼／           
  ┌───────┐  
  │   外部設計   │  
  └───────┘  
         ││         
         ＼／         
    ┌───────┐
    │   内部設計   │
    └───────┘
           ││       
           ＼／       
      ┌───────┐  <FONT COLOR="RED">┌───────┐</FONT>
      │プログラム設計│  <FONT COLOR="RED">│  単体テスト  │</FONT>
      └───────┘  <FONT COLOR="RED">└───────┘</FONT>
                  ││      ／＼
                  ＼／      ││
                ┌───────┐
                │プログラミング│
                └───────┘
		</PRE></TABLE>

		(7)結合テスト<BR>
		<BR>
		単体テストが終了したモジュールを結合し、プログラム単位でテストを行う。結合テストは内部設計通りに出来ているかの確認である。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌───────┐  
│分析・要求定義│  
└───────┘  
       ││         
       ＼／         
  ┌───────┐
  │   外部設計   │
  └───────┘
         ││       
         ＼／       
    ┌───────┐      <FONT COLOR="RED">┌───────┐</FONT>
    │   内部設計   │      <FONT COLOR="RED">│  結合テスト  │</FONT>
    └───────┘      <FONT COLOR="RED">└───────┘</FONT>
           ││                    ／＼
           ＼／                    ││
      ┌───────┐  ┌───────┐
      │プログラム設計│  │  単体テスト  │
      └───────┘  └───────┘
                  ││      ／＼
                  ＼／      ││
                ┌───────┐
                │プログラミング│
                └───────┘
		</PRE></TABLE>

		(8)システムテスト<BR>
		<BR>
		結合テストが終了したプログラムをさらに結合して、サブシステム単位でテストを行う。システムテストは外部設計通りに出来ているかの確認である。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌───────┐
│分析・要求定義│
└───────┘
       ││       
       ＼／       
  ┌───────┐          <FONT COLOR="RED">┌───────┐</FONT>
  │   外部設計   │          <FONT COLOR="RED">│システムテスト│</FONT>
  └───────┘          <FONT COLOR="RED">└───────┘</FONT>
         ││                        ／＼
         ＼／                        ││
    ┌───────┐      ┌───────┐
    │   内部設計   │      │  結合テスト  │
    └───────┘      └───────┘
           ││                    ／＼
           ＼／                    ││
      ┌───────┐  ┌───────┐
      │プログラム設計│  │  単体テスト  │
      └───────┘  └───────┘
                  ││      ／＼
                  ＼／      ││
                ┌───────┐
                │プログラミング│
                └───────┘
		</PRE></TABLE>

		(9)総合テスト<BR>
		<BR>
		システムテストが終了したサブシステムを結合して、システム全体でテストを行う。総合テストは顧客の要求通りに出来ているかの確認である。総合テストは本番テスト（または移行テスト）ともいう。<BR>
		<BR>

		
		<TABLE BORDER=0><TR><TD><PRE>
┌───────┐              <FONT COLOR="RED">┌───────┐</FONT>
│分析・要求定義│              <FONT COLOR="RED">│  総合テスト  │</FONT>
└───────┘              <FONT COLOR="RED">└───────┘</FONT>
       ││                            ／＼
       ＼／                            ││
  ┌───────┐          ┌───────┐
  │   外部設計   │          │システムテスト│
  └───────┘          └───────┘
         ││                        ／＼
         ＼／                        ││
    ┌───────┐      ┌───────┐
    │   内部設計   │      │  結合テスト  │
    └───────┘      └───────┘
           ││                    ／＼
           ＼／                    ││
      ┌───────┐  ┌───────┐
      │プログラム設計│  │  単体テスト  │
      └───────┘  └───────┘
                  ││      ／＼
                  ＼／      ││
                ┌───────┐
                │プログラミング│
                └───────┘
		</PRE></TABLE>

		ウオーターフォールモデルは、工程が進むに従ってシステムをモジュールまで分割していく。これを段階的詳細化という。テスト工程では分割した単位を次々につなげてテストを実施する。これを段階的統合化という。<BR>
		<BR>

		高度情報処理技術者試験の各試験の担当範囲を、以下に整理する。<BR>
		<BR>
		・プログラミング〜総合テスト<BR>
		　　→プロダクションエンジニア<BR>
		　　→第一種情報処理技術者<BR>
		　　→第二種情報処理技術者<BR>
		<BR>
		・外部設計<BR>
		　　→アプリケーションエンジニア<BR>
		<BR>
		・要求分析・定義<BR>
		　　→システムアナリスト<BR>
		<BR>
		・システムの運用<BR>
		　　→システム運用管理エンジニア<BR>
		<BR>
		・システム構築全体の管理<BR>
		　　→プロジェクトマネージャ<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
       運用管理＝<FONT COLOR="RED">システム運用管理エンジニア</FONT>

<FONT COLOR="RED">システムアナリスト</FONT>
        ↓
┌───────┐              ┌───────┐
│分析・要求定義│              │  総合テスト  │←┐
└───────┘              └───────┘  │
       ││                            ／＼         │
       ＼／<FONT COLOR="RED">アプリケーションエンジニア</FONT>  ││         │
  ┌───────┐  │      ┌───────┐    │
  │   外部設計   │←┘      │システムテスト│←─┤
  └───────┘          └───────┘    │
         ││                        ／＼           │
         ＼／                        ││           │
    ┌───────┐      ┌───────┐      │
    │   内部設計   │      │  結合テスト  │←──┤
    └───────┘      └───────┘      │
           ││                    ／＼             │
           ＼／                    ││             │
      ┌───────┐  ┌───────┐        │
      │プログラム設計│  │  単体テスト  │←───┤
      └───────┘  └───────┘        │
          ↑      ││       ／＼                   │
          │      ＼／       ││                   │
          │     ┌───────┐                 │
          │     │プログラミング│ ←───────┤
          │     └───────┘                 │
          └───────────────┬────┘
                                          │
                              <FONT COLOR="RED">プロダクションエンジニア</FONT>
                              <FONT COLOR="RED">第一種情報処理技術者</FONT>
                              <FONT COLOR="RED">第二種情報処理技術者</FONT>

└─────────────────────────┘
プロジェクト全体のとりまとめ＝<FONT COLOR="RED">プロジェクトマネージャ</FONT>
		</PRE></TABLE>

		<FONT SIZE=4 COLOR="BLUE"><B>■ソフトウェア要求定義</B></FONT><BR>
		<BR>
		要求定義の手法として、<FONT COLOR="RED">ＤＦＤ(Data Flow Diagram:データフローダイアグラム)</FONT>がある。ＤＦＤはデータの流れを図に表したもので、以下の４つの記号を使用する。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
────→  データの流れ
   ＿＿
 ／    ＼
│      │  プロセス（処理）
 ＼    ／
   ￣￣
┌────
│          データストア（ファイル等）
└────
┌───┐
│      │  データの発生源、吸収先
└───┘
		</PRE></TABLE>

		要求定義の工程は、システムをサブシステムに分解することである。例えば問屋の注文システムを考える。注文システムは注文受付業務、在庫確認業務、出庫業務などで構成される。それらの業務がサブシステムである。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
                     注文システム
                          │
      ┌──────┬──┴───┬─────┐
      │            │            │          │
┌──┴──┐┌──┴──┐┌──┴──┐┌─┴─┐
│ 注文受付 ││ 在庫確認 ││ 出庫処理 ││・・・│サブシステム
└─────┘└─────┘└─────┘└───┘
		</PRE></TABLE>

		サブシステムをさらに突き詰めると、注文電文受付、注文電文解析、注文データ保存など、データの流れと処理だけで構成される図になる。つまり<FONT COLOR="RED">バブルチャート</FONT>である。バブルチャートはＤＦＤの一種である。<BR>
		<BR>
		要求定義では、開発の対象となるシステムを５〜７のサブシステムに分割する。<BR>
		<BR>
		ＤＦＤは、現物理モデル、現論理モデル、新論理モデル、新物理モデルの４種類を作成する。<BR>
		<BR>
		<FONT COLOR="RED">現物理モデル</FONT>は、今の業務をありのままに記述する。例えば伝票に手書きする、請求書を書くなどである。<BR>
		<BR>
		<FONT COLOR="RED">現論理モデル</FONT>は、現物理モデルから人間的な部分を排除したものである。例えば入力する、出力するなど、機能に注目して作成する。<BR>
		<BR>
		<FONT COLOR="RED">新論理モデル</FONT>は、システム化する部分について、現論理モデルの問題点の解決や、新たな業務処理の追加を行う。<BR>
		<BR>
		ここまでは要求定義の工程である。次の新物理モデルは外部設計の工程となる。<BR>
		<BR>
		<FONT COLOR="RED">新物理モデル</FONT>は、システム化した部分を使って新たな業務の流れを記述したものである。新システムが導入された後の仕事の流れを記述したものである。<BR>
		<BR>
		これを図に表すと、以下のような流れになる。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
        ┌現物理モデル
要求定義│    ↓
  ・分析│現行論理モデル
        │    ↓
        └新規論理モデル
        ┌    ↓
外部設計│新規物理モデル
        └
		</PRE></TABLE>

		これで要求定義の終了である。次は設計に入る。<BR>
		<BR>

		<FONT SIZE=4 COLOR="BLUE"><B>■ソフトウェア設計</B></FONT><BR>
		<BR>
		構造化設計とは、すなわちモジュール分割である。モジュール分割にはデータの流れに基づく分割法と、データの構造に基づく分割法がある。<BR>
		<BR>
		○データの流れに基づく分割法<BR>
		<BR>
		データの流れに基づく分割法にはＳＴＳ分割法、トランザクション分割法、共通機能分割法の３つがある。<BR>
		<BR>
		・<FONT COLOR="RED">ＳＴＳ分割法</FONT><BR>
		<BR>
		ＳＴＳ分割法とはSource（源泉）、Transfer（変換）、Synk（吸収）の略である。源泉が入力、変換が処理、吸収が出力である。業務でモジュールを前処理、主処理、後処理に分ける場合はＳＴＳ分割を行っている。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
  入力      処理     出力
    ○  ┃        ┃ ○
        ┃   ○   ┃
  ○○  ┃        ┃    ○
━━━━┻━━━━┻━━━>
        ↑        ↑
           抽象点
		</PRE></TABLE>

		例えば数字の月を入力すると英語名を表示するプログラムを作ったとする。もし"１４月"とか"ＡＢ月"が入力されたら変換せず、エラーを表示せねばならない。ＳＴＳ分割法では、変換部分は安心して変換できるように入力の段階で不正なデータは弾く。したがってＳＴＳ分割は入力部分が大きい。<BR>
		<BR>

		・<FONT COLOR="RED">トランザクション分割法</FONT><BR>
		<BR>
		トランザクション分割法は、複数の変換処理があるときに使用する。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
    ┌─╂─→○─╂─┐
    │  ┃        ┃  │
○─┼─╂─→○─╂─┼→○
    │  ┃        ┃  │
    └─╂─→○─╂─┘
━━━━┻━━━━┻━━━→
		</PRE></TABLE>

		・<FONT COLOR="RED">共通機能分割法</FONT><BR>
		<BR>
		共通機能分割法は、処理が共通している部分をくくり出す分割法である。例えばエラーメッセージ表示はどの処理でも必要とするので、エラーメッセージ表示専用のモジュールを作成し、各処理がこの関数を使用する。<BR>
		<BR>

		○データの構造に基づく分割法<BR>
		<BR>
		データの構造に基づく分割法として<FONT COLOR="RED">ジャクソン法</FONT>と<FONT COLOR="RED">ワーニエ法</FONT>の２つの方法がある。ジャクソン法は入力データと出力データの両方の構造に着目して分割していく。ワーニエ法は入力データのループに着目して分割していく。主処理がループという場合は、ワーニエ法により分割されたと言える。<BR>
		<BR>
		モジュール分割がうまくできたかどうかの判断基準として、モジュール強度とモジュール結合度がある。モジュール強度は強いほどよく、モジュール結合度は弱いほどよい。<BR>
		<BR>
		モジュール強度とモジュール結合度については<A HREF="http://itac.gr.jp/pe/goro.html">http://itac.gr.jp/pe/goro.html</A>を参照のこと。<BR>
		<BR>

		<FONT SIZE=4 COLOR="BLUE"><B>■ソフトウェアの品質特性</B></FONT><BR>
		<BR>
		テストは品質を高めるための工程である。テストの観点として、以下に示す<FONT COLOR="RED">ベームの品質特性</FONT>を観点として行う。<BR>
		<BR>
		　・機能性<BR>
		　・信頼性<BR>
		　・使用性<BR>
		　・効率性<BR>
		　・保守性<BR>
		　・移植性<BR>
		<BR>
		憶えにくい場合は「昨日紳士候補と一緒だった」と憶えればよい。<BR>
		<BR>
		なお、ベームの品質特性には、経済性がない。ソフトウェアそのもののコストは考慮しないのである。<BR>
		<BR>
		レビューもまた、品質を高めるためのものである。ウオーターフォールモデルでは次の工程に進む前にレビューを行うが、その観点としてもベームの品質特性が使用される。<BR>
		<BR>
		レビューには<FONT COLOR="RED">インスペクション</FONT>と<FONT COLOR="RED">ウオークスルー</FONT>の２種類がある。<BR>
		<BR>
		インスペクションは公式なレビューであり、司会者が主体でレビューを進める。結果は記録され、現場にフィードバックされる。<BR>
		<BR>
		ウオークスルーは非公式なレビューであり、開発者が主体となって説明しながらレビューを進める。結果は記録されず、現場へのフィードバックもない。インスペクションに備えての「根回し」といえる。<BR>
		<BR>

		<FONT SIZE=4 COLOR="BLUE"><B>■プログラムのテスト</B></FONT><BR>
		<BR>
		プログラミングが終了したら、モジュール単位に単体テスト、プログラム単位（コンパイル単位）に結合テスト、サブシステム単位にシステムテスト、最後に全システムをつなげた総合テストを行う。<BR>
		<BR>
		○単体テスト<BR>
		<BR>
		単体テストは主に<FONT COLOR="RED">ホワイトボックステスト</FONT>でテストを行う。ホワイトボックステストはプログラムの内部構造に注目したテストである。<BR>
		<BR>
		ホワイトボックステストの方法としては<FONT COLOR="RED">命令網羅</FONT>、<FONT COLOR="RED">判定条件網羅</FONT>、<FONT COLOR="RED">条件網羅</FONT>、<FONT COLOR="RED">判定条件／条件網羅</FONT>、<FONT COLOR="RED">複数条件網羅</FONT>の５種類の方法がある。以下のフローチャートを元に解説する。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
    │
   ／＼
 ／A>0 ＼ No
<  and   >───┐
 ＼ B>0／       │
   ＼／     ┌─┴─┐
    │Yes   │      │
    │      └─┬─┘
    │          │
    │←────┘
    │
		</PRE></TABLE>

		<BR>
		・命令網羅<BR>
		<BR>
		命令（四角）に注目する。すべての命令（すべてのステップ）を通過すればよい。したがって与える条件としてはＡ＝−３もしくはＢ＝−６のどちらかでよい。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
    │
   ／＼
 ／A>0 ＼ No
<  and   ><FONT COLOR="RED">───┐</FONT>
 ＼ B>0／       <FONT COLOR="RED">│</FONT>
   ＼／     <FONT COLOR="RED">┌─┴─┐</FONT>
    │Yes   <FONT COLOR="RED">│      │</FONT>←ここを通ればよい
    │      <FONT COLOR="RED">└─┬─┘</FONT>
    │          <FONT COLOR="RED">│</FONT>
    │<FONT COLOR="RED">←────┘</FONT>
    │
		</PRE></TABLE>

		・判定条件網羅<BR>
		<BR>
		判定（ひし形）に注目する。すべての判定の出口を通ればよい。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
    │
   ／＼
 ／A>0 ＼ No
<  and   ><FONT COLOR="RED">─→</FONT>
 ＼ B>0／
   ＼／
    <FONT COLOR="RED">│</FONT>
    <FONT COLOR="RED">↓</FONT>
		</PRE></TABLE>

		すべての判定の出口を通過する条件として以下の２つを挙げればよい。<BR>
		　・Ａ＝４　，Ｂ＝２<BR>
		　・Ａ＝−３，Ｂ＝−６<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
    │
   ／＼
 ／A>0 ＼ No
<  and   ><FONT COLOR="RED">───┐</FONT>
 ＼ B>0／       <FONT COLOR="RED">│</FONT>
   ＼／     <FONT COLOR="RED">┌─┴─┐</FONT>
    <FONT COLOR="RED">│Yes   │      │</FONT>
    <FONT COLOR="RED">│      └─┬─┘</FONT>
    <FONT COLOR="RED">│          │</FONT>
    <FONT COLOR="RED">│←────┘</FONT>
    <FONT COLOR="RED">│</FONT>
		</PRE></TABLE>

		・条件網羅<BR>
		<BR>
		条件式に注目する。すべての条件式が、真と偽を満たせばよい。<BR>
		<BR>

		<TABLE BORDER=1>
			<TR><TD ALIGN="CENTER">Ａ＞０<TD ALIGN="CENTER">Ｂ＞０
			<TR><TD ALIGN="CENTER">真<TD ALIGN="CENTER">真
			<TR><TD ALIGN="CENTER">真<TD ALIGN="CENTER">偽
			<TR><TD ALIGN="CENTER">偽<TD ALIGN="CENTER">真
			<TR><TD ALIGN="CENTER">偽<TD ALIGN="CENTER">偽
		</TABLE>
		<BR>
		したがって条件として以下の２つを与えればよい。<BR>
		<BR>
		　・Ａ＝５　，Ｂ＝４<BR>
		　・Ａ＝−２，Ｂ＝−３<BR>
		<BR>
		または以下のような組み合わせでもよい。<BR>
		<BR>
		　・Ａ＝５　，Ｂ＝−４<BR>
		　・Ａ＝−２，Ｂ＝３<BR>
		<BR>
		しかしこの条件の場合、通らない判定の出口が存在するため、判定条件網羅を満たさない。そこで判定条件／条件網羅が考え出された。<BR>
		<BR>

		・判定条件／条件網羅<BR>
		<BR>
		判定条件／条件網羅は、条件網羅では通らない判定の出口があるという問題点の解決のために必要となった。条件網羅で解説した条件に、先程の問題点を解決する条件を追加すればよい。<BR>
		<BR>
		　・Ａ＝５　，Ｂ＝−４<BR>
		　・Ａ＝−２，Ｂ＝３<BR>
		　・Ａ＝５　，Ｂ＝３<BR>
		<BR>

		・複数条件網羅<BR>
		<BR>
		複数条件網羅は条件網羅の上位に位置し、すべての真、偽の組み合わせをテストする。<BR>
		<BR>

		<TABLE BORDER=1>
			<TR><TD ALIGN="CENTER">Ａ＞０<TD ALIGN="CENTER">Ｂ＞０
			<TR><TD ALIGN="CENTER">真<TD ALIGN="CENTER">真
			<TR><TD ALIGN="CENTER">真<TD ALIGN="CENTER">偽
			<TR><TD ALIGN="CENTER">偽<TD ALIGN="CENTER">真
			<TR><TD ALIGN="CENTER">偽<TD ALIGN="CENTER">偽
		</TABLE>
		<BR>
		したがって必要な条件は４通りとなる。しかし条件式が３つなら条件は８通り、条件式が４つなら条件は１６通りとなり、条件式が多いほど必要な条件が増えるので、非現実的である。<BR>
		<BR>

		○結合テスト<BR>
		<BR>
		結合テスト工程以降は<FONT COLOR="RED">ブラックボックステスト</FONT>でテストを行う。ブラックボックステストは内部構造には注目せず、外部仕様にのみ注目してテストを行う。<BR>
		<BR>
		モジュールを結合してテストする方法としては、作成した上位モジュールに仮の下位モジュールを結合してテストする<FONT COLOR="RED">トップダウンテスト</FONT>と、作成した下位モジュールに仮の上位モジュールを結合してテストする<FONT COLOR="RED">ボトムアップテスト</FONT>、すべてのモジュールを一斉に結合する<FONT COLOR="RED">ビッグバンテスト</FONT>がある。<BR>
		<BR>
		トップダウンテストで使用する仮の下位モジュールを<FONT COLOR="RED">スタブ</FONT>、ボトムアップテストで使用する仮の上位モジュールを<FONT COLOR="RED">ドライバ</FONT>という。どちらがスタブで、どちらがドライバか混乱する場合は「戸田の酢豚」と憶えればよい。（戸田（トップダウン）の酢豚（スタブ））<BR>
		<BR>

		<TABLE BORDER=0><TR><TD><PRE>
        ┏━━━━━┓
        ┃┌───┐┃←トップダウンテスト
        ┃│      │┃　　　Ｓ１、Ｓ２：仮の下位モジュール(スタブ)
    ┏━┛└─┬─┘┃
    ┃  ┌──┼──╂──┐
    ┃  │    │    ┃┏━┿━┓
    ┃┌┴┐┌┴┐┏┛┃┌┴┐┃←ボトムアップテスト
    ┃│S1││S2│┃  ┃│D1│┃　　　Ｄ１：仮の上位モジュール(ドライバ)
    ┃└┬┘└─┘┃  ┃└┬┘┃
    ┗━┿━━━━┛┏┛  │  ┃
  ┌──┼──┐  ┏┛┌─┴┐┗┓
┌┴┐┌┴┐┌┴┐┃┌┴┐┌┴┐┃
│  ││  ││  │┃│  ││  │┃
└─┘└─┘└─┘┃└─┘└─┘┃
                  ┗━━━━━━┛
		</PRE></TABLE>

		ブラックボックステストとしては、<FONT COLOR="RED">同値分割</FONT>、<FONT COLOR="RED">限界値分析</FONT>、<FONT COLOR="RED">原因・結果グラフ</FONT>という手法がある。例として数字で月を入力したら英語の月を返すプログラムを考える。もし値が不正なら「値が不正です」というエラーメッセージを表示する。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌─┬─────┬─┬─┬─┐
│◇│＝＝＝＝＝│＿│□│×│
├─┴─────┴─┴─┴─┤
│                          │
│        ┌───┐        │
│        │    <BLINK>│</BLINK>│月      │
│        └───┘        │
│    __________________    │
└──────↑──────┘
出力エリア（正常の時は英語の月、
異常時はメッセージを表示）
		</PRE></TABLE>

		・同値分割<BR>
		<BR>
		結果として<FONT COLOR="RED" SIZE=5>同</FONT>じになる<FONT COLOR="RED" SIZE=5>値</FONT>の集合を考える。<BR>
		<BR>
		テストデータの集合としては、正常に終了するグループ（１〜１２）と異常終了するグループ（０以下の数字や数字以外の文字）に分けて、それぞれの代表を選んでテストを行う。<BR>
		<BR>

		
		<TABLE BORDER=0><TR><TD><PRE>
「処理続行」    「値が不正です」
  グループ          グループ
   ＿＿＿            ＿＿＿
 ／      ＼        ／      ＼
│        │      │ 0  -5  │
│  1〜12 │      │   14   │
│        │      │  A  B  │
 ＼      ／        ＼      ／
   ￣￣￣            ￣￣￣
     ↓                ↓
   代表"3"          代表"16"
		</PRE></TABLE>

		上記より、同値分割で必要となるテストケースは２つとなる。<BR>
		<BR>

		・限界値分析<BR>
		<BR>
		「バグは境界値で発生する」とよく言われる。月で言えば１２月は存在するが１３月は存在しない。もし値として１３が与えられたらエラーメッセージを表示する必要があるが、ループカウンタの終了条件が誤まっているなどで１３月でエラーが出ない場合も考えられるので、限界値分析を行う。<BR>
		<BR>
		ここでメッセージにバリエーションを持たせる。今までは「値が不正です」のみであったが、０以下を指定した場合は「値が小さいです」、１３以上を指定した場合は「値が大きいです」、数字以外の文字が指定された場合は「数字ではありません」と表示することとする。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
「値が小さいです」  「値が大きいです」
     グループ            グループ  
      ＿＿＿              ＿＿＿   
    ／      ＼          ／      ＼ 
   │ -2     │        │  15    │
   │  -3  -5│        │   13   │
   │        │        │     20 │
    ＼      ／          ＼      ／ 
      ￣￣￣              ￣￣￣   
        ↓                  ↓     
      代表"-3"            代表"14"

「数字ではありません」 「処理続行」
     グループ            グループ  
      ＿＿＿              ＿＿＿   
    ／      ＼          ／      ＼ 
   │  A     │        │        │
   │  B     │        │  1〜12 │
   │     Z  │        │        │
    ＼      ／          ＼      ／ 
      ￣￣￣              ￣￣￣   
        ↓                  ↓     
      代表"C"             代表"3"  
		</PRE></TABLE>

		<BR>
		この場合処理を続行するグループは１〜１２の値だが、限界値としては１と１２を代表として選ぶ。<BR>
		<BR>
		「値が小さいです」と表示するグループは０以下の値だが、限界値としては０を代表として選ぶ。<BR>
		<BR>
		「値が大きいです」と表示するグループは１３以上の値だが、限界値としては１３を代表として選ぶ。<BR>
		<BR>
		したがってこの場合のテストデータは０、１、１２、１３となる。<BR>
		<BR>

		・原因・結果グラフ<BR>
		<BR>
		条件と、その結果をマトリクスで表したチェックリストである。原因・結果グラフの例を以下に示す。<BR>
		<BR>
		<TABLE BORDER=1>
			<TR><TD ROWSPAN=5>条件<TD ROWSPAN=5>入力データ<TD>０以下<TD>○<TD>　<TD>　<TD>　<TD>　
			<TR>                        <TD>１<TD>　<TD>○<TD>　<TD>　<TD>　
			<TR>                        <TD>１２<TD>　<TD>　<TD>○<TD>　<TD>　
			<TR>                        <TD>１３以上<TD>　<TD>　<TD>　<TD>○<TD>　
			<TR>                        <TD>数字以外<TD>　<TD>　<TD>　<TD>　<TD>○

			<TR><TD ROWSPAN=5>結果<TD COLSPAN=2>英語の月を表示する<TD>　<TD>○<TD>○<TD>　<TD>　
			<TR><TD COLSPAN=2>「値が小さいです」<TD>○<TD>　<TD>　<TD>　<TD>　
			<TR><TD COLSPAN=2>「値が大きいです」<TD>　<TD>　<TD>　<TD>○<TD>　
			<TR><TD COLSPAN=2>「数字ではありません」<TD>　<TD>　<TD>　<TD>　<TD>○

		</TABLE>
		<BR>

		○システムテスト、総合テスト<BR>
		<BR>
		システムテスト、総合テストは主に機能、性能のチェックである。<BR>
		<BR>
		単体テスト、結合テストで発見された問題点はバグとして扱われ、そのバグを解消する事をデバッグというが、システムテスト、総合テストではチューニングという。<BR>
		<BR>

		<FONT SIZE=4 COLOR="BLUE"><B>■オブジェクト指向パラダイム</B></FONT><BR>
		<BR>
		オブジェクト指向には、普段聞きなれない用語が多く出題されるので、整理して憶えて欲しい。<BR>
		<BR>
		過去に出題された用語としては、クラス、メソッド、継承、スーパクラス、サブクラス、隠蔽、汎化−特化構造、分解−集約構造などがある。<BR>
		<BR>
		○クラス、メソッド、隠蔽<BR>
		<BR>
		オブジェクト指向では、<FONT COLOR="RED">クラス</FONT>を定義していくことでプログラミングを行う。クラスとは、データとデータ操作の関数をひとまとめにして定義したものである。データ操作の関数を<FONT COLOR="RED">メソッド</FONT>という。データの操作はメソッドを介して行われるので、外部からの不正な操作はできない。これを<FONT COLOR="RED">隠蔽</FONT>という。<BR>
		<BR>
		○継承（インヘリタンス）、スーパクラス、サブクラス<BR>
		<BR>
		例えばラジカセを考える。ラジカセはラジオにカセットテープの録音・再生機能をつけたものといえる。ラジカセはもともとあったラジオの性質を受け継ぎつつ、新しい機能をつけてラジカセとしている。このように元からあったものの性質を受け継ぐ事を<FONT COLOR="RED">継承（インヘリタンス）</FONT>という。このときラジオは<FONT COLOR="RED">スーパクラス</FONT>、ラジカセは<FONT COLOR="RED">サブクラス</FONT>という。オブジェクト指向による開発はこのように、もとのクラスにない機能を追加するという形で行われる。<BR>
		<BR>
		○汎化−特化構造<BR>
		<BR>
		例えばＤＯＳ／ＶとＭａｃがあるとする。その２つのパソコンを一般化するといわゆるパソコンになる。ＤＯＳ／ＶとＭａｃはパソコンを特化したものである。このような関係を<FONT COLOR="RED">汎化−特化構造</FONT>という。汎化−特化構造は<FONT COLOR="RED">ｉｓ　ａ</FONT>の関係ともいう。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
        ┌─────┐
        │ パソコン │
        └──┬──┘
      ┌───┴───┐
┌──┴──┐  ┌──┴──┐
│ＤＯＳ／Ｖ│  │  Ｍａｃ  │
└─────┘  └─────┘
		</PRE></TABLE>

		○分解−集約構造<BR>
		<BR>
		例えばパソコンを考える。パソコンを分解すると、ＣＰＵとメモリに分解できる。このような関係を<FONT COLOR="RED">分解−集約構造</FONT>という。分解−集約構造は<FONT COLOR="RED">ｐａｒｔ　ｏｆ</FONT>の関係ともいう。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
        ┌─────┐
        │ パソコン │
        └──┬──┘
      ┌───┴───┐
┌──┴──┐  ┌──┴──┐
│  ＣＰＵ  │  │  メモリ  │
└─────┘  └─────┘
		</PRE></TABLE>

		<FONT SIZE=4 COLOR="BLUE"><B>ＣＡＳＥツール</B></FONT><BR>
		<BR>
		<FONT COLOR="RED">ＣＡＳＥツール</FONT>とは、Computer Aided Software Engineeringの略で、コンピュータ支援によるソフトウェア工学のことである。<BR>
		<BR>
		ＣＡＳＥツールには上流ＣＡＳＥツールと下流ＣＡＳＥツール、統合ＣＡＳＥツールの３種類があり、ウオーターフォールモデルのどの工程を支援するかによって分かれている。<BR>
		<BR>
		○<FONT COLOR="RED">上流ＣＡＳＥツール</FONT><BR>
		<BR>
		要求定義・分析〜設計までの工程を支援する。データフローダイアグラムの作成など。<BR>
		<BR>
		○<FONT COLOR="RED">下流ＣＡＳＥツール</FONT><BR>
		<BR>
		製造〜テストまでの工程を支援する。ソースコードの自動生成、テストデータの作成支援など。<BR>
		<BR>
		○<FONT COLOR="RED">統合ＣＡＳＥツール</FONT><BR>
		<BR>
		上流ＣＡＳＥツールと下流ＣＡＳＥツールのどちらの機能も持ち、全行程を支援するもの。<BR>
		<BR>
		ＣＡＳＥツールの機能として、工程に沿った支援を行う機能を<FONT COLOR="RED">フォワードエンジニアリング</FONT>、工程をさかのぼって支援する機能を<FONT COLOR="RED">リバースエンジニアリング</FONT>という。今では大規模システムを１から作ることはなく、ほとんどがリニューアルである。リニューアルの際には、既存システムに対してリバースエンジニアリングを行い、システム構築のノウハウをＤＢに蓄積し、それを活用してフォワードエンジニアリングを行う。その際に使用するＤＢを<FONT COLOR="RED">リポジトリ</FONT>、リポジトリを活用してフォワードエンジニアリングを行うことを<FONT COLOR="RED">リエンジニアリング</FONT>という。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
              リバース
              エンジニアリング
              ┌
    ──┐  ＼  ＼
    分析│    ＼  ＼
 ┌     └─┐  ＼  ＼
   ＼   設計│    ＼  ＼
 上流＼     └─┐  ＼  ＼
 CASE  ＼／ 製造│    ＼  ＼
       ／＼     └─┐  ＼  ＼
           ＼ テスト│    ＼  ＼
         下流＼             ┘
         CASE  ┘        フォワード
                         エンジニアリング
		</PRE></TABLE>

		<FONT SIZE=4 COLOR="BLUE"><B>■分散処理の構成</B></FONT><BR>
		<BR>
		最近では水平・垂直分散の区分けは失われてきた。変わって登場したのが３層クライアント・サーバ構成（３層ＣＳ）である。<BR>
		<BR>
		３層ＣＳ構成は、<FONT COLOR="RED">データベースマネジメントブロック（ＤＭＢ）</FONT>、<FONT COLOR="RED">アプリケーションレイヤロジック（ＡＬＬ）</FONT>、<FONT COLOR="RED">プレゼンテーションレイヤロジック（ＰＬＬ）</FONT>の３つがある。<BR>
		<BR>
		ＤＭＢはデータそのもののことである。ＡＬＬはＤＭＢにアクセスするアプリケーション、すなわちＤＢＭＳを指している。ＰＬＬはＤＢＭＳを使用するクライアントのことである。ＡＬＬはＯＳＩ７階層のアプリケーション層、ＰＬＬはプレゼンテーション層に相当している。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌─────┐
│  ＤＭＢ  │データベースマネジメントブロック
├─────┤
│  ＡＬＬ  │アプリケーションレイヤロジック
├─────┤
│  ＰＬＬ  │プレゼンテーションレイヤロジック
└─────┘
		</PRE></TABLE>

		<BR>
		ＤＭＢ，ＡＬＬ，ＰＬＬをどこに置くかによって、リモートプレゼンテーション、リモートアクセス、ストアドプロシージャ、分散データベースの４種類に分類できる。<BR>
		<BR>
		○<FONT COLOR="RED">リモートプレゼンテーション</FONT><BR>
		<BR>
		データとＤＢＭＳをサーバ側に置いたもの。これが一般的なＣ／Ｓシステムである。日本航空はブラウザでチケットの予約ができるが、この構成がまさにリモートプレゼンテーションである。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌─────┐
│  ＤＭＢ  │
├─────┤
│  ＡＬＬ  │
└──┬──┘
      │      
      │      
      │      
┌──┴──┐
│  ＰＬＬ  │
└─────┘
		</PRE></TABLE>
		
		○<FONT COLOR="RED">リモートアクセス</FONT><BR>
		<BR>
		すべてのクライアントにＤＢＭＳを入れた構成。回線を流れるデータ量が多い。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌─────┐
│  ＤＭＢ  │
└──┬──┘
      │      
      │      
      │      
┌──┴──┐
│  ＡＬＬ  │
├─────┤
│  ＰＬＬ  │
└─────┘
		</PRE></TABLE>

		○<FONT COLOR="RED">ストアドプロシージャ</FONT><BR>
		<BR>
		サーバ側とクライアント側の両方にＤＢＭＳを置いた構成。リモートアクセスでは回線を流れるデータ量が多かったが、この方式とすることで必要なデータのみをやり取りできるので、回線を流れるデータ量は少ない。ＯＬＴＰもこの方式に分類される。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌─────┐
│  ＤＭＢ  │
├─────┤
│  ＡＬＬ  │
└──┬──┘
      │      
┌──┴──┐
│  ＡＬＬ  │
├─────┤
│  ＰＬＬ  │
└─────┘
		</PRE></TABLE>

		○<FONT COLOR="RED">分散データベース</FONT><BR>
		<BR>
		データをサーバ側とクライアント側の両方に置いた構成。この構成のみが分散データベースという。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
┌─────┐
│  ＤＭＢ  │
└──┬──┘
      │      
┌──┴──┐
│  ＤＭＢ  │
├─────┤
│  ＡＬＬ  │
├─────┤
│  ＰＬＬ  │
└─────┘
		</PRE></TABLE>

		<FONT SIZE=4 COLOR="BLUE"><B>■キャパシティプランニング</B></FONT><BR>
		<BR>
		キャパシティプランニングとは、性能設計のことであり、つまり待ち行列のことである。<BR>
		<BR>
		待ち行列では、マクドナルドとか、銀行の窓口などのモデルを作る。<FONT COLOR=RED>Ｍ／Ｍ／１</FONT>もモデルの一つであるが、第一種ではＭ／Ｍ／１のみが出題される。<BR>
		<BR>
		Ｍ／Ｍ／１は、<FONT COLOR=RED>到着／サービス／窓口数</FONT>を表す。Ｍ／Ｍ／１モデルの場合、到着は<FONT COLOR=RED>ポアソン分布</FONT>に従い、サービスは<FONT COLOR=RED>指数分布</FONT>に従う。どちらも一定ではなくランダムという意味であるが、意味が少し異なる。<BR>
		<BR>
		コンビニの例で考えると、ポアソン分布はお客さんが店に入ってくる頻度である。お客さんはある時は集団で入ってきたり、まったく来なかったりする。ポアソン分布は０にもなりうる。（高速道路を走る車もポアソン分布と言える）。<BR>
		<BR>
		指数分布はレジがお客さんをさばく頻度である。レジではお弁当を温めたり、領収証を要求するお客さんに対しては時間がかかるが、缶コーヒーを買うお客さんに対しては時間はかからない。しかし時間が０ということはない。これが指数分布である。<BR>
		<BR>
		どちらがポアソン分布で、どちらが指数分布か分からなくなったら「ポアソンとーちゃん、シースルーでサービス」と憶えよう。<BR>
		<BR>
		窓口数は、レジが一つかどうかを表す。２つあればＭ／Ｍ／２，３つあればＭ／Ｍ／３となるが、第一種での窓口数は１つである。<BR>
		<BR>
		サービス時間が一定であるＭ／Ｄ／１モデルというのもある。イメージとしては観覧車のイメージであるが、これも第一種の範囲外である。<BR>
		<BR>
		銀行のＡＴＭ装置を例に考える。ＡＴＭにおいては残高照会、振込、引出などのサービスを提供しており、それぞれのサービス時間は異なるが平均で３分とする。またこのＡＴＭは１時間当たり１６人が利用するものとする。<BR>
		<BR>
		まず、<FONT COLOR=RED>窓口利用率ρ</FONT>（"ろー"と読む）を求める。<BR>
		<BR>

		<TABLE BORDER=0><TR><TD><PRE>
　　　λ(到着率)
ρ＝───────
　　μ(サービス率)
（"λ"は"らむだ"、"μ"は"みゅー"と読む）
		</PRE></TABLE>
		まずλとμの単位を決める。単位の分子は処理単位（この場合は「人」）、分母は時間の単位（この場合は「時間」）とする。<BR>
		<BR>

		<TABLE BORDER=0><TR><TD><PRE>
　　　λ(到着率)　(人／時間)
ρ＝────────────
　　μ(サービス率)(人／時間)
		</PRE></TABLE>
		
		分子には到着の頻度、分母には処理能力を入れる。（窓口利用率は、情報処理技術者試験的には１より小さい値となる。従って単位をそろえたならば、分子に小さい値、分母に大きい値を入れればよい。）<BR>
		<BR>

		<TABLE BORDER=0><TR><TD><PRE>
　　　λ(到着率)　　到着の頻度　１６(人／時間)
ρ＝───────＝─────＝───────＝０．８
　　μ(サービス率)　 処理能力　 ２０(人／時間)
		</PRE></TABLE>

		窓口利用率ρを求めたら、並んでいる人数と、<FONT COLOR=RED>平均待ち時間</FONT>と<FONT COLOR=RED>平均応答時間</FONT>を求める。<BR>
		<BR>
		並んでいる人数は、以下の式で求める。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
　　　　　　　　　ρ　　　０．８
並んでいる人数＝───＝─────＝４(人)
　　　　　　　　１−ρ　１−０．８
		</PRE></TABLE>

		平均待ち時間は、ＡＴＭ装置の行列に並び始めてから、自分の番が来るまでの時間である。したがって、４人のお客さんにそれぞれ３分かかるので、平均待ち時間は以下の式となる。<BR>

		<BR>
		<TABLE BORDER=0><TR><TD><PRE>
平均待ち時間＝並んでいる人数×処理能力(分)＝４(人)×３(分)＝１２(分)
		</PRE></TABLE>

		このＡＴＭ装置は、１２分は並んで待たねばならないということである。<BR>
		<BR>
		平均応答時間は、ＡＴＭ装置の行列に並び始めてから、自分の処理が終了するまでの時間である。したがって、先に求めた平均待ち時間１２分に、自分の処理にかかる時間を加えればよい。平均応答時間の式は以下のようになる。<BR>
		<BR>

		<TABLE BORDER=0><TR><TD><PRE>
平均応答時間＝平均待ち時間(分)＋自分の処理に要する時間(分)＝１２(分)＋３(分)＝１５(分)
		</PRE></TABLE>

		平均応答時間は以下の式でも求めることができる。上記手順で求めるのもいいが、試験では時間との戦いになるので、式を覚えられるのなら覚えてしまったほうがよい。<BR>
		<BR>

		<TABLE BORDER=0><TR><TD><PRE>
　　　　　　　　　　　　　１　　　　　　　　　１　　　１
平均応答時間＝─────────────＝─────＝─(時間)＝１５(分)
　　　　　　　μ(人／時間)−λ(人／時間)　２０−１６　４
		</PRE></TABLE>

		<BR>
		以下に待ち行列についてのiTAC掲示板の議論を引用する。
		<BR>
<!-- 引用開始 -->
<hr><font color="#00ffff"><b>マクドナルドに行きました</b></font>
投稿者：<font color="#444444"><b>宮ちゃん</b></font>
　投稿日：8/29  23:48:07</font>
<blockquote>
先生の講義で、待ち行列でマクドナルドを例に出されていましたので<br>
実際に行ってみました。（別に意図して行ったわけではないのですが）<br>
4分36秒(276秒)並んで、バリューセット500円いや買うのに1分50秒(110秒)<br>
でした。サービス（買い物）中を含む待ち時間は、276+110=386秒でした。<br>
30分ねばって、何人入ってきたか数えました。30分で46人でした。<br>
カウンタ数は4で、やはりカウンタごとに行列ができていました。<br>
ということはM/M/1モデルが４つですね。<br>
サービス率（μ）は、1人110秒なので、1時間当たり32.72人[3600/110]<br>
到着率（λ）は、30分で56人だったので、1時間当たり23.00人[46*2/4]<br>
よって利用率（ρ）は、0.70<br>
サービス中を含む待ち時間は、１／（μ−λ）なので<br>
1/(32.72-23.00)=0.1028(時間)=370.37(秒)<br>
理論上の計算と実際がほぼぴったり、納得した１日でした<br>
しかし時計を何度も見ていたので店員から変に思われたかな<br>
今度は銀行のＡＴＭコーナでウォッチングしてみよう（怪しまれるかな）<br>
</blockquote>

<hr><font color="#00ffff"><b>待ち行列</b></font>
投稿者：<font color="#444444"><b>水岡祥二</b></font>
　投稿日：8/31  18:33:55</font>
<blockquote>
マクドナルドでのウォッチング、素晴らしい実践ですね。<br>
待ち行列の公式を導き出したアーランも、毎朝、パン屋さんの行列に並んで<br>
暇だったので、人数、時間をウォッチングして、公式を導き出したのです。<br>
でも、計算上の答えはあくまでも、「平均」の待ち時間です。<br>
宮ちゃんの場合、たまたま、計算上の値と、実際の値があっていたのですが、<br>
元々ランダムなので多少誤差があるはずです。<br>
それにしても今日は月末だったので、銀行混んでいましたね。７分並んで<br>
３分。心理的には、並ぶ時間のほうがはるかに長いですね</blockquote>


<!-- 引用終了 -->


<BR><HR><BR><CENTER><FONT SIZE=4>
### その他の議論 ###
</FONT></CENTER><BR>

<BR>
ここでは、iTACの掲示板で実際に行われた議論のうち、講義中には取り上げなかった範囲について掲載します。
<BR>

<BR><HR><BR>

■フェイル〜、フォールト〜に関する議論<BR>

<BR>

<hr><font color="#00ffff"><b>フェイルセーフとフェイルソフト</b></font>　投稿者：<font color="#444444"><b>Chary Two</b></font>　投稿日：11/8 00:03:06</font>
<blockquote>
あ、Chary Twoです。誰もが訳わからなくなるフェイルセーフとフェ<BR>
イルソフトなのですが、私は以下の方法で回避しています。<br>
<br>
一台が故障してももう一台でぜったい安心安全（セーフ）<BR>
　　−−−フェイルセーフ<br>
<br>
一台が故障したら本処理機を切り離しても、なんとか待機系で維持<BR>
する、つまり、ソフトランディングしてなんとかがんばる<BR>
　　−−−フェイルソフト<br>
<br>
このような認識方法でやっています。他の方法があったらぜひぜひ<BR>
教えてください。<br>
<br>
また、<br>
デュアルシステムはＤＵＡＬだから２台で片方だめでも<br>
もう一台でぜったい安心安全なのでフェイルセーフで、<br>
デュプレックスシステムはデュアルシステムよりも複雑（Ｃｏｍｐ<BR>
ｌｅｘ）なのでなんとかセーフランディングするシステムなのでフェ<BR>
イルソフトと認識します。<br>
<br>
ではでは。<br>
<br></blockquote>


<hr><font color="#00ffff"><b>Re:フェイルセーフとフェイルソフト</b></font>　投稿者：<font color="#444444"><b>ＮＩ</b></font>　投稿日：11/8 09:52:24</font>
<blockquote>
この掲示板では、はじめまして。ＮＩです。旧一種ホルダー(10年前<BR>
)です。<br>
<br>
>一台が故障してももう一台でぜったい安心安全（セーフ）−−−フ<BR>
>ェイルセーフ<br>
<br>
この部分はちょっと違いますね。<br>
<br>
フェールセーフ：故障して停止するときは安全側になるよう(安全な<BR>
　　　　　　　　状態で停止するよう)にし、事故の拡大を防止する<BR>
　　　　　　　　方式<br>
<br>
たとえば、車が故障して停止するときに、道の真ん中で止めないで<BR>
なんとか端に寄せて停止させる、という考え方です。<br>
<br>
原子力発電所では、(ある程度以上の)重大な異常がみつかったら、<BR>
無理に運転を継続せず、自動的に原子炉を停止する(スクラムと言う<BR>
)ような設計になっていますが、これもフェールセーフの例です。<br></blockquote>


<hr><font color="#00ffff"><b>フェイルセーフとフェイルソフト</b></font>　投稿者：<font color="#444444"><b>Umya</b></font>　投稿日：11/9 00:42:10</font>
<blockquote>
フェールセーフ、フェールプルーフについて僕はこう考えます。<br>
<br>
フェールセーフ　危険回避　システムの安全性の観点からのシステ<BR>
ム設計をする。<br>
僕の覚え方として、信号機に異常が発生したとき必ず赤信号点灯で<BR>
停止するよう信号機を設計。<br>
事故の発生を未然に防ぐ。全体として安全状態になるようにする。　<br>
<br>
フェールソフト　部分回復　システムの信頼性の観点からのシステ<BR>
ム設計をする。<br>
信号機に異常が発生したとき、信号機は赤信号点滅、あるいは警官<BR>
が交通整理。<br>
もう一つの考えとして、矢印のある信号機（分かります？）、例え<BR>
ば「青、黄、赤、↑、→」の信号機で異常が発生したとき矢印部分<BR>
の信号機のみ機能して、「青、黄、赤」の信号機は機能を赤信号で<BR>
停止している。<br>
直進車と右折車は交差点に進入することはできるが、左折車は交差<BR>
点に進入することができない。<br>
信号機の処理能力を落としてでもなんとか機能させるか、それとも<BR>
ある部分で機能を完全に放棄信号機全体で機能を停止させるのでは<BR>
なく残った機能で出来るとこまで処理をする。<br>
<br>
フールプルーフ　異常そのものを極力発生させないようにシステム<BR>
を設計する。赤信号の時に交差点直前に壁がせりあがり、赤信号の<BR>
時はどんなことがあっても絶対交差点に進入できない。<br>
<br>
フールプルーフは蛇足でしたね。<br>
文章が汚いですが分かります？</blockquote>


<hr><font color="#00ffff"><b>RE:フェイルセーフとフェイルソフト</b></font>　投稿者：<font color="#444444"><b>力波604</b></font>　投稿日：11/9 02:41:37</font>
<blockquote>
>フェールセーフ、フェールプルーフについて僕はこう考えます。<br>
<br>
私の覚えているポイントは（『』でくくりました）、<br>
フェイルセーフ・・・・システムは常に『安全側』に働くです。<br>
つまり、異常があっても２次災害などを引き起こさないように中途<BR>
半端に停止させないで、できる限り安全な状態へ移行してから停止<BR>
するような設計、または突然の停止状態がすでに安全な状態を確保<BR>
している設計のこと。<br>
<br>
フェールセーフ・・・・『一部の故障がシステム全体を停止させて<BR>
しまう致命傷にならない』ような設計。できる限り運転を続けよう<BR>
とする指針があります。たとえば故障が発生した部分を切り離し、<BR>
機能や性能を落としてでも運転を続けるシステムなどです。またこ<BR>
のような切り離す機能退行動作をフォールバックと言います。<br>
<br>
フォールトトレラント・・・・システムを２重化するなどして『冗<BR>
長度をもたせ、障害が発生しても障害前と同等の機能、性能を提供<BR>
し続ける』ことができるような設計のこと。あとですね、フォール<BR>
トトレラントにはもうひとつ意味があって、誤動作や故障などの異<BR>
常時に働く自己診断や自己修正の機能を指すこともあるはずなんで<BR>
す。これについては少し自信がないのでどなたかフォロー下さい。<br>
<br>
フールプルーフ・・・・直訳すると『バカ防止』(笑)　要はうっか<BR>
りを防ぐような設計のことで、主に人為的なミスがあっても受け付<BR>
けないようにしたりすることですから、ヒューマンインタフェース<BR>
と考えても良いのではないでしょうか。<br>
<br>
私はUmyaさんの<br>
>フールプルーフ　異常そのものを極力発生させないようにシステム<BR>
>を設計する。赤信号の時に交差点直前に壁がせりあがり、赤信号の<BR>
>時はどんなことがあっても絶対交差点に進入できない。<br>
はフォールトアボイダンスのような気がします。</blockquote>


<hr><font color="#00ffff"><b>ちゃんと調べてみました。</b></font>　投稿者：<font color="#444444"><b>Umya</b></font>　投稿日：11/9 16:07:29</font>
<blockquote>
フェイルセーフ、フェイルソフト、フールプルーフ<br>
こなへん、私も知識があいまいですので、手元にある本で調べてみ<BR>
ました。<br>
<br>
フォールトアボイダンス技術<br>
　　　　障害を出さないための技術。品質管理技術、各種テスト技<BR>
　　　　術、技法、品質向上のための設計技法。<br>
<br>
フォールトトレランス技術<br>
　　　　障害は避けられないとして、その対策技術。運用、保守段<BR>
　　　　階での信頼性を向上させるアプローチ。ソフトウェア、ハ<BR>
　　　　ードウェアの冗長性を利用して高信頼性を図るアプローチ。<br>
　　　　フォールトトレランス技術の概念として、フェイルセーフ、<BR>
　　　　フェイルソフト、フールプルーフがある。<br>
　　　　その他にも、運用方式技術として、ホットスタンバイ、コ<BR>
　　　　ールドスタンバイ等。<br>
　　　　システム構成技術にデュプレックスシステム、やデュアル<BR>
　　　　システム等がある。障害の検出技術や自動修復技術もこれ<BR>
　　　　に含まれる。<br>
<br>
セキュリティ技術<br>
　　　　コンピュータをとりまくさまざまな脅威からシステムを保<BR>
　　　　護する技術。<br>
　　　　　　外的セキュリティ<br>
　　　　　　　　自然災害、人的偶発事故などの外的、物理的脅威<BR>
　　　　　　　　からコンピュータシステムを護る。<br>
　　　　　　内的セキュリティ<br>
　　　　　　　　主にソフトウェア、データに対するセキュリティ<BR>
　　　　　　　　技術。データの改ざん、不正アクセスからシステ<BR>
　　　　　　　　ムを保護する。<br>
いかがでしょうか？<br>
<br>
>私はUmyaさんの<br>
>          >フールプルーフ　異常そのものを極力発生させないようにシステムを設計する。<br>
>          >赤信号の時に交差点直前に壁がせりあがり、赤信号の時はどんなことがあっても絶対交差点に進入できない。<br>
>          はフォールトアボイダンスのような気がします。<br>
失礼、わたしが間違っておりました。ここの部分は忘れてください。</blockquote>


<hr><font color="#00ffff"><b>クイズ？フェールソフト？</b></font>　投稿者：<font color="#444444"><b>ゆきお</b></font>　投稿日：11/11 01:04:45</font>
<blockquote>
H10NSP午前５４問のおさらいです<br>
<br>
システムの信頼性を保証する設計に関する記述のうち、<br>
フェールソフトの説明はどれか。<br>
<br>
<br>
ア<br>
システムの一部に故障や異常が発生した時、<br>
データの消失、装置への障害、及び運転員への危害を<br>
減じる方向に作動すること。<br>
<br>
イ<br>
システムを運用しながら故障部分の修復を可能とし、<br>
２４時間３６５日の連続運転をすること。<br>
<br>
ウ<br>
装置の一部が故障しても、システムの全面的なサービス停止になら<BR>
ないようにすること。<br>
<br>
エ<br>
ユーザの入力に対して確認のメッセージを出力したり、<br>
決められた順序で入力しなければ動作しないようにしたりして、<br>
単純なミスが起こらないようにすること。<br>
<br>
正解者にはCafeBar iTACでワンショット！プレゼント<br>
だだしマスターのおごりで<br>
<br>
ＰＳ・ふゆうさん<br>
私も大阪、但し３０半ばの元大学生 うぅぅぅ<br>
<br>
<br>
</blockquote>


<hr><font color="#00ffff"><b>re:H10NSP午前５４問のおさらい</b></font>　投稿者：<font color="#444444"><b>力波604</b></font>　投稿日：11/11 01:38:04</font>
<blockquote>
×ア　危害を減じる方向、つまり『安全側』です。フェイルセーフ。<br>
×イ　故障後もサービスを継続させようとしているからフォールト<BR>
　　　トレラント、としていいのかな？<br>
○ウ　後述参照。フェイルソフト。<br>
×エ　単純なミス、つまり『うっかり』です。フールプルーフ。<br>
<br>
<br>
なお、今さらですが、先日の私の発言に誤りがありました。<br>
>フェールセーフ・・・・『一部の故障がシステム全体を停止させて<BR>
>しまう致命傷にならない』<br>
>ような設計。できる限り運転を続けようとする指針があります。た<BR>
>とえば故障が発生した<br>
もうおわかりですね。混乱させる内容で申しわけありませんでした。</blockquote>


<hr><font color="#00ffff"><b>ANS  H10NSP午前５４問</b></font>　投稿者：<font color="#444444"><b>ゆきお</b></font>　投稿日：11/11 23:05:43</font>
<blockquote>
ピンポーん<br>
マスター力波さんに、バーボン、ワンショット<br>
<br>
おっと、すばやいレス、ありがとうございます。<br>
<br>
＞×イ　故障後もサービスを継続させようとしているから<br>
＞フォールトトレラント、としていいのかな？<br>
フォールトトレラントでしょうね、<br>
詳しく言うとフォールトトレラント技術のうち、<br>
システムの二重化およびホットスワップ<br>
（電源入れたまま、ユニットの交換が可能）<br>
を取り入れた、ノンストップコンピュータ<br>
の事が言いたいとだと思います。<br>
</blockquote>




		（講義録ここまで）<BR>


	</BLOCKQUOTE>
</BODY>
</HTML>

