ソフトウェア概要（基本ソフトウェア、応用ソフトウェア、ミドルウェア）

＜目次＞
・ソフトウェアとは
・基本ソフトウェア（システムソフトウェア）
・応用ソフトウェア（アプリケーションソフトウェア）
・ミドルウェア

##◆　ソフトウェアとは
ソフトウェアはコンピュータを動かすプログラムの総称で、物理的な機械を指すハードウェアと対比する用語です。
ソフトウェアは分類すると、以下3つに分けられます。
1. OSなどの基本ソフトウェア（システムソフトウェア）
2. ワープロなどの応用ソフトウェア（アプリケーションソフトウェア）
3. 基本ソフトウェアと応用ソフトウェアの間で動作する、ミドルウェア

階層的には、以下
・アプリケーション
・ミドルウェア
・OS
・ハードウェア
となります。ハードウェアがあって、中核に汎用的な機能を担うOSがあり、アプリケーションの土台となるミドルウェアが乗って、アプリケーションが乗ってくる、というイメージです。


##◆　基本ソフトウェア（システムソフトウェア）
基本ソフトウェアはいわゆる「広義のOS (Operating System)」と言われます。キーボードやマウスからの入力を受け付けて表示する、メモリの使用状況を管理する、CPUを効率的に使用できるよう制御する、といった、端末の基本操作に関わるソフトウェアであることから基本ソフトウェアと言われています。
昔のコンピュータはハードウェアの仕様はバラバラ、コンピュータを動かす基本ソフトもそれぞれの機器専用というもので、そのコンピュータで別のハードウェアを使用しようとしてもそのままでは使用できない（ソフトの再設定やプログラムの組みなおしが必要）という状態だったようです。
こういった状況の中で「共通で使用できるソフトウェア」の誕生により、異なるハードウェアでも統一した操作ができるようになりました。これがOSです。
PCではWindowsやMac OS、LinuxやUNIX、スマートフォンではiOSやAndroidがあたります。
基本ソフトウェア（広義のOS）には以下の3つが含まれます。

***
###・制御プログラム、カーネル（狭義のOS）
OSの中核的な役割を担います。OSとしての処理は原則的にカーネルを通じて行われます。
具体的には主に以下5つの役割を担っています。

####1．システムコールのインターフェース
システムコールとは、コンピュータ上で実行中のプログラム（アプリケーション）がOS
のカーネルの特権的な機能（プロセスやメモリの管理、デバイス操作など）を呼び出す仕組みです。「カーネルの実行依頼」というと分かりやすいでしょうか。
アプリケーションが単体でデバイス操作や他のアプリケーションに影響を与える操作ができてしまうと、セキュリティ上問題があります。
アプリケーション側からしてもシステムコールというシンプルなインターフェースがあることにより、その向こう側のハードウェアの詳細について意識する必要がないというメリットがあります。

####2．プロセス管理
プロセスとはOSから見た仕事の単位（プログラムの実行単位）のことです（ユーザー側からはジョブといいます）。何らかのアプリケーションを実行すると、実際には1つ以上のプロセスが起動することになります。
HDDなどにあるプログラムが呼び出されメモリに読み込まれて実行状態になったものがプロセスです。タスクマネージャーのプロセス欄にはアプリ（ChromeやExcelなど）やバックグラウンドプロセスなどが並んでいますよね。

プロセス管理とは、いつ・どのプロセスに・どれくらいの時間CPUを割り当てるかを管理することです。
基本的に1つのCPUはメモリに取り込まれた1つのプロセスしか処理することができません（4コアであれば4つのプロセスまで、ということですね）。

OSはプログラムなどから要求があるとプロセスを生成します。生成されたプロセスは直後「実行可能状態」になります。実行可能状態とはOSからCPUの使用権が割り当てられるのを待っている、順番待ちのような状態です。
順番が来たプロセスはCPU使用権が割り当てられて「実行状態」となります。
実行状態中に入出力待ちが生じた場合は、入出力処理が完了するまで「待ち状態」となります。入出力処理が完了したプロセスは実行可能状態になります。
また、実行状態中に他の優先順位の高いプロセスが実行可能状態になった場合、「割込み」が発生してそのプロセスにCPU使用権が割り当てられるため、現在実行中のプロセスが実行可能状態に戻る場合もあります。

順番待ちのような状態と記述しましたが、プロセスのスケジューリングには様々な方式があり、順番待ちである「到着順方式」の他、処理時間順（短いものから）や優先度順、ラウンドロビン（到着順の亜種）などの方式があります。

決められたスケジューリング方式に基づいて生成されたプロセスに対して、順々にCPU使用権を割り当てていくことがプロセス管理ということですね。

実際にタスクマネージャーで見てみましょう
![スクリーンショット 2021-08-22 112847.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667316/5ba8d013-705a-2bbc-7d87-451302b479d7.png)
現在321個のプロセスが動作していますね。しかしCPU使用率を見ると3%しか使用していません。4コアなので1コアの1割も使用していない状況です。そのためこれらのプロセスのほとんどは前述した「実行可能状態」にあたります。

プロセスの詳細を見てみましょう
![スクリーンショット 2021-08-22 133829.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667316/94419869-92d5-a20e-444b-8f54758a1cd1.png)
起動しているアプリのうちChromeやエクスプローラー、タスクマネージャーは 0% ~ 1% ほどで推移しています。Chromeで新しいタブを開くと3，4% 程まで使用率が上がります。
また139個動作しているバックグラウンドプロセスも必要に応じてCPUが割り当てられ処理を行っています。
実行可能状態なので既にメモリに読み込んだ分は % に大きな変化はないですね。

以上のように生成されたプロセスが実行可能状態となり、我々の操作や内部の必要処理などに応じてCPUがOSから割り当てられて実行処理されています。

####3.メモリ管理
　前述したとおり、HDDなどにあるプログラムが実行時にはメモリ上に呼び出されて配置され、実行が終わればメモリ上から消去されます（これをメモリ領域の獲得と解放といいます）が、このメモリを効率よく使用するために管理することもカーネルの役割の一つです。
代表的な効率の良い管理の方法として以下があります。

######・スワッピング
  スワップは「交換」という意味で、メモリ容量が不足して実行したい複数のプログラムをメモリ上に配置できない場合に、実行中のプログラムのうち優先度の低いプログラムを一時中断してストレージに移動（スワップアウト）し、優先度の高いプログラムをメモリに配置する（スワップイン）というものです。移動先のストレージで確保する領域のことを「スワップ領域」といいます。

######・メモリコンパクション
　conpact:圧縮する の名詞形、conpaction:圧縮 という意味です。
OSがメモリ領域を獲得し、その後スワップアウトや処理完了をする過程で細切れの未使用領域が発生（フラグメンテーションといいます）することがあります。このフラグメンテーションの発生によって、本来合計すると十分なメモリ未資料領域がある場合でも必要な分を獲得できないといったことが起こります。
これを解決するのがコンパクションという、発生した細切れの空き容量を1つにまとめて利用可能にするというものです。

######・仮想メモリ（バーチャルメモリ）
　仮想メモリはプロセスから見たメモリのことです。仮想的なメモリによって実際のメモリ（仮想に対比して物理メモリといいます）よりも多くの容量があるように見せることで、多くのプロセス、またメインメモリより大きいサイズのプロセスも起動が可能になります。
物理メモリのアドレス上で連続していなくても、解放されているアドレスをつなげて仮想的に1つの連続したメモリを確保します。メインメモリにマッピングしてあふれた容量はストレージにマッピングします。プロセス実行時にはストレージのデータはスワッピングされます。
仮想メモリのアドレス空間をページと呼ばれる固定長のブロックに分割することを「ページング」といいます。各ページがメインメモリのどの物理アドレスにマッピングされているか記録したものを「ページテーブル」（名の通りページNo、仮想アドレス、物理アドレスの列が
あるテーブルのイメージです）といいます。
仮想‐物理アドレスの変換はMMU（メモリ管理ユニット）が行います。

スワップと区別すると、仮想メモリは物理メモリのアドレスと、あふれた分をストレージのスワップ領域にマッピングし、スワップはストレージにスワップ領域を確保してメインメモリとの入れ替えをするものです。


####4.ファイル管理
　コンピュータで扱われるデータをファイル形式でまとめて管理することもOSの役割です。OSはファイルシステムと呼ばれる機能でファイルを管理します。
全てのプログラムやドライバ、アプリケーションや作成データなどは、コンピュータで利用するためのどこかに保存する必要があり、これらはストレージに保存されますが、これらをファイルシステムで管理することにより効率的な保存、取り出しが行えるようになります。
ファイル管理には「ディレクトリ」という概念があります。プログラムやデータはすべて「ファイル」という形で保存され、ファイルシステムでは頂点から値を張るような構造でファイルの入れ物であるディレクトリが配置されていきます。
「ディレクトリ」が主に使用される言葉ですが、Windowsでは「フォルダ」という名前になっています。
この構造の最上階のディレクトリを「ルートディレクトリ」と呼びます。「Cドライブ配下」を指す C:¥ もルートを指しています。
このルートから保存したファイルまでを繋ぐとファイルを一意に識別することができます。この一続きのものをパスといいます。
ルートを起点にしたパスを絶対パス、ルート以外のディレクトリを起点にしたパスを相対パスと呼びます。
ファイルシステムはドキュメントの保存の他、ファイルの暗号化や圧縮などの機能も持っています。


####5.デバイスドライバ
　デバイスドライバはPCに接続されている周辺装置をOSによって制御するためのプログラムです。
たとえばディスクやNICなどは、多くのベンダーが独自の製品を提供していますが、それぞれに対応したアプリケーションを作成することは現実的ではないため、カーネルはデバイスドライバを利用し、その下にあるデバイスを制御する役割を担います。
キーボードやマウス、USBなどの共通化が進んだデバイスに関しては、OSがほとんどの場合、ジェネリックドライバと呼ばれる標準のドライバを用意しています。標準ドライバがサポートしていない場合に関しては、デバイスを提供する（ベンダー）がデバイスドライバを製作してCD-ROMで添付していたり、インターネット上のサイトからダウンロードできるようにしています。
OSが標準ドライバーを用意している場合でも、メーカーがデバイスの機能を最大限引き出すように最適化したドライバを用意している場合もあります。

***
###・言語プロセッサ
　言語プロセッサとは、JavaやRubyなどのプログラミング言語で記述したソースコードをコンピュータが処理できる機械語（バイナリデータ）、あるいは中間のバイトコードに変換するソフトウェアです。
言語プロセッサは以下の3つに大別されます。

######1．コンパイラ
　一括して実行可能な形式に変換する言語プロセッサです。
ソースコードを実行可能なファイルへコンパイルする必要があるプログラミング言語をコンパイラ型言語といい、C言語やJavaが代表的なものです。
ソースコードを書き込んだファイルのことを「ソースファイル」と呼び、例えばJavaであれば「ソースファイル名.java」のように拡張子を.javaとする決まりになっています。
コンパイラではこのソースファイルを「ファイル名.class」という「クラスファイル」というものに変換され、ソースコードはコンピュータが実行できるバイトコード（0と1の羅列）になっています。
後述しますが、Javaではコンパイルした後のバイトコードをインタプリタで（詳細には内部のJVMで）読み込んでマシンコードに変換し、CPUに送って処理を実行させます。
コンパイラは一括して実行するためプログラムの実行速度は速いですが、コンパイル⇒ファイル作成⇒実行という流れ自体に手間が多いため、実行するまでに時間がかかります。
「実行速度は速いが、実行までに比較的時間がかかる」ということですね。


######2．インタプリタ
　一括して変換するコンパイラに対して、命令を1つずつ実行可能な形式に変換しながら実行する言語プロセッサがインタプリタです。RubyやPHP、Pythonがインタプリタ言語にあたります。
コンパイラとは異なりソースコードをそのままマシンコードに変換し、並行して実行するため、実行までが速いですが、1行ずつ変換するため実行速度はコンパイラに比べ遅いです。「直ちに実行できるが、実行速度が遅い」ということですね。
また1行ずつの変換と同時にエラー報告も行うため、コンパイラに比べエラーが発見しやすいことも特徴の一つです。

######3．アセンブラ
　アセンブラはアセンブリ言語で記述されたプログラムを機械語で記述されたプログラム（数字の並び）に変換するプログラムです。
機械語を人間でも分かりやすくするために簡略化した英単語や記号を一対一に対応させたものをアセンブリ言語といいます。
他のプログラミング言語との違いは、機械語に一対一で対応していることです。つまりアセンブリ言語でプログラムを書くことは機械語を書くことに等しいといえます。
他のプログラミング言語は、一対一には対応せず、機械語を意識しなくてもプログラミングを行えるようになっているのが普通です。

機械語はCPUの全ての機能を直接操作可能で、最も効率よくプログラムを記述できる可能性があります。
よって、デバイスドライバやOSの中心部など機械を直接操作したり効率が重要な部分はアセンブリ言語を使ってプログラムが記述されることが多いです。
プログラム全体をアセンブリ言語で記述することは、とても手間の掛かることなので、通常は比較的小規模なプログラムやプログラムの効率が優先される部分を記述します。


***
###・ユーティリティソフトウェア
　ユーティリティソフトはコンピュータやOS、アプリケーションソフトなどの機能を補い、使い勝手や性能などを向上させる機能、あるいは小規模なソフトウェアのことを指します。
それ自体を目的に使用することはほとんどなく、コンピュータ利用の補助のために用いるためのソフトです。一般的にOSにインストールしてコンピュータ利用全般を補助するものを指すことが多く、電卓、時計、カレンダー、ファイル圧縮・伸張、ファイル形式の変換、メインメモリ管理、ストレージ管理、ウイルスなどのマルウェア対策、周辺機器の操作・管理、簡易なゲーム、スクリーンショットなどの機能があたります。

OS製品のソフトウェアパッケージには狭義のOS本体と共に基本的なユーティリティソフトが同梱されているのが一般的で、ストレージ管理の一部のツールなど、広義のOSの機能の一部とみなされているものもあります。
また、当初は外部の開発者がユーティリティソフトとして開発・提供していたものが、時代が下るとOSの機能の一部として取り込まれ、単体のユーティリティソフトは衰退ないし消滅するという過程もよく見られるようです。


##◆　応用ソフトウェア（アプリケーションソフトウェア）
　先述したユーティリティソフトはOSの機能補助の役割を担っていましたが、コンピュータ操作のためではなく、特定の機能や目的のために開発・使用されるソフトウェアを応用ソフトウェアと呼びます。
例えばWordは文章を作成する目的、Excelは表計算を行う目的で作成されたアプリケーションソフトです。その他会計ソフトやメール、チャット、画像編集など多岐にわたります。アプリやソフトなどと略されることが多いです。

アプリはOSに合わせて作成されるため、異なるOS上では動作しません。（Microsoft Office製品はMacOS上では使用できませんが、Mac用のOfficeが用意されている、ということもあります）


##◆　ミドルウェア
　ミドルウェアはコンピュータ制御するOSと処理を行うアプリケーションの間（なのでmiddle）でアプリケーションの土台の役割を担うソフトウェアです。
アプリケーションの複雑な処理を制御するのにOSの基本的な機能では制御しきれない場合に、間のミドルウェアが特化した処理を行う、といったイメージでしょうか。

ミドルウェアには以下3つの種類があります。

####1.Webサーバー（Web）
ユーザからのリクエストに対して「静的コンテンツを見せること」「APサーバに動的コンテンツを要求し、返ってきた結果を見せること」という2つの役割を担います。
「静的コンテンツ」は常に同じ内容を表示するもの、「動的コンテンツ」はネットバンキングの残高やネットショッピングのカートなどのイメージです。
どちらもブラウザからのリクエストに応じて表示を変化させ、動的なWebコンテンツへのリクエストだった場合にアプリケーションサーバーへリクエストを転送する、という流れになります。
Webサーバを操作する代表的なソフトウェアは「Apache（アパッチ）」と呼ばれるものなどがあります。

<!-- ↓処理要求　↑処理結果 -->

####2．アプリケーションサーバー（AP）
処理の中核となるサーバーです。Webサーバから受けたリクエストをもとにアプリケーションを実行して動的コンテンツを生成し、必要であればDBサーバへリクエストを行い、返ってきたデータを加工して動的コンテンツに埋め込む、といったことを行います。
“必要であれば”というのは、例えば「1+1は？」というリクエストに対して、四則演算のアプリケーションが実装されているAPサーバであればわざわざDBサーバに問い合わせてデータを持ってくる必要はないですが、
「リンゴとバナナの合計金額は？」というリクエストの場合は、APサーバにはリンゴとバナナの値段のデータが存在しないため、DBサーバにリクエストし、帰ってきた値段を元にAPサーバ上で計算して結果をWebサーバに返す、といったことが必要になるためです。　
代表的なものは「Tomcat」と呼ばれるものがあります。
⇒Tomcatはアプリケーションサーバですが、簡易的なWebサーバ機能も備えています。

<!-- ↓データ要求　↑要求されたデータ -->

####3．データベースサーバー（DB）
データベース管理システムが動作しているサーバです。大量なデータの保管は「ストレージ」の役割で、DBサーバはストレージに新たなデータを書き込んだり、必要な情報を引き出し更新したりします。
APサーバのリクエストに従って「SQL」というデータベース言語を実行し
その結果をAPサーバに返します。
代表的なものはOrcleのOlacleやMySQL、MicroSoftのSQLServerなどがあります。

以上のクライアントからのリクエストに対する処理のことを
「Web3層構造」と呼びます。
Web3層構造が採用される理由の1つに「セキュリティの高さ」があげられます。
DBサーバには多くの顧客情報が保存されており、Web、AP、DBがすべて1台にインストールされたシステムではクライアントから直接DBサーバにアクセスできてしまいますが、Web3層構造ではクライアントとDBサーバの間にWebサーバ、APサーバ、そしてセキュリティ製品を配置できるためより堅牢になります。

また、「管理がしやすい」点も大きな理由です。
システムは『止まってもすぐに復旧できる』ことを前提に作られるため
サーバに不具合が発生した場合も、Web機能がおかしいのであればWebサーバの故障、アプリケーションエラーが出ているのならAPサーバ故障と、1台に機能が集約されている場合と比較しても故障の影響が軽微になり、システム全体としても全停止ではなく一部機能の停止で済みます。また、例えばAPサーバの拡張が必要な場合にもAPサーバのみと柔軟に対応することが可能です。
　


参考文献
この記事は以下の情報を参考に執筆いたしました。
‐TECH CAMPブログ，” OSとは？機能・種類を解説！パソコン・スマホで使われているOSも紹介 ” ,株式会社div (2021-07-20)
https://tech-camp.in/note/pickup/1013/
-モーット知り部 情報科学の基本 ” OSの概念 ” (2017-09-16) 
http://kmownet.com/info-science-basic/040-software/041-os/0411-os-outline/0411-os-outline.html
-@IT atmarkIT ” 第3回　プロセスとスレッド ” (2014-10-30)
https://atmarkit.itmedia.co.jp/ait/articles/1410/30/news150.html
-SEの道標 ” 【図解】仮想記憶(仮想メモリ)の本質や仕組み、メリット　〜スワップ、MMU、ページングテーブルについて〜 ” (2020-08-29)
https://milestone-of-se.nesuke.com/sv-basic/architecture/virtual-memory-and-swap/
-ほげほげテクノロジー ” 【Linux カーネル: OS 基礎入門３】メモリ管理 ”　(2021-07-31)
https://hogetech.info/2020/12/05/linux-%E3%83%A1%E3%83%A2%E3%83%AA%E3%80%90%E5%85%A5%E9%96%80%E3%80%91/
-EnterpriseZine ” ITインフラのキホン：３階層型システムを見てみよう【前編】 ”(2020-09-14)
https://enterprisezine.jp/article/detail/13391?p=2
-CodeCanpus ” コンパイラとインタプリタとは？現役エンジニアが分かりやすく解説 ”(2020-10-13)
https://blog.codecamp.jp/compiler-interpreter-commentary
-IT用語辞典 e-Words　” ユーティリティソフト 【utility software】 ”(2017-07-30)
https://e-words.jp/w/%E3%83%A6%E3%83%BC%E3%83%86%E3%82%A3%E3%83%AA%E3%83%86%E3%82%A3%E3%82%BD%E3%83%95%E3%83%88.html