基本ソフトウェアについて色々調べてみた（３）

どうも初めまして！　

最近基本情報技術者の資格取得に向けて勉強中な駆け出しエンジニアのワカです。

#■この記事を書こうと思ったきっかけ
最近書籍を購入して勉強しているのですが、暗記ばかりでなかなか身にならないと思いました。

そこで基本情報に書かれている内容を自分なりに解釈したものをここに備忘録として書き残すことにしました。
そうすれば手も動かせるし人にみられると思うとその分責任感出ますしね！

あと個人的に今自作PCを作りたいとも考えているのでこの機会に詳しくなっとこうと思ったのも理由の一つです笑

もしかすると間違っている点などあるかもしれませんので、その時は指摘していただけると嬉しいです。

#◼️実記憶管理
マルチプログラム環境において主記憶空間を効率よく使えるようプログラムを配置するのが**実記憶管理**です。

実記憶管理には以下のような様々な方式によってプログラムを割り当てています。


##固定区画方式
固定長の区画（**パーティション**）を設ける管理方式です。

|方式  | 説明 |
|:-:|:--|
| 単一区画方式  | 主記憶一つを単一区画とする方式<br>一つのプログラムしかロード出来ないのでマルチプログラミングには不向き  |   |
| 多重区画方式  |主記憶領域を事前に分割しておき、同時に作動させる方式<br>サイズが均等でなくとも良いため任意の大きさを組み合わせることができる。 |  

###【メリット＆デメリット】
予め決めたサイズに区画を分割してそこにプログラムを配置割り当てるだけなので記憶管理は容易です。

しかし、もし区画内に余りスペースが生じた場合、その領域を使用することができず、区画サイズ以上のプログラムを読み込むこともできないため、利用効率はあまり良くないといえます。


##可変区画方式
プログラムをロードするタイミングで必要なサイズに区切る管理方式です。

###メリット
・区画内に空きスペースが生じないため、固定区画方式よりも記憶の利用効率は良い。
・サイズが大きいプログラムも実行できる

###デメリット
プログラムの完了タイミング次第で空き領域がバラバラに発生する（**フラグメンテーション（断片化）**）ため連続してまとまった空き領域を使えない

**解消方法**
**メモリコンパクション**または**ガーベジコレクション**・・・ロードされているプログラムを再配置すること


##オーバーレイ方式
セグメントという単位に分割して、その時に必要なセグメントだけを主記憶にロードして実行する方式。

プログラムと言っても実行するためには中身を細かく分けて順番に行う必要があるため、領域を細かく分けることで実際に使う部分だけ実行できる

##スワッピング方式
割り込みなどの発生時、実行中のものを中断させて切り替える際に実行可能状態や待機状態のプログラムが主記憶上にたくさん残ってしまわないように行う方式



**スワップアウト**・・・優先度の低いプログラムが使っていた主記憶領域の内容を一旦補助記憶装置にまるごと退避させることで空き容量を作りだすこと

**スワップイン**・・・滞在プログラムに再びCPUの使用権が与えられる時は退避させた内容を補助記憶装置から主記憶へとロードし直しすこと

「スワップアウト」と「スワップイン」 を合わせた処理のことをまとめて**スワッピング**と呼びます。

###デメリット
主記憶の代用として低速な補助記憶装置へのアクセスを行うことになるので処理速度が極端に低下します。

#■再配置可能プログラム

プログラムが主記憶情をあっちこっち移動するとした場合予想されるのが「プログラムの場所（アドレス）がワケワカメ…」になることです。

この時に使われるのが前記事にて紹介した主記憶装置の読み込み方法の一つである**ベースアドレス指定方式**です。ベースアドレス指定方式を使うことによって、どこにロードされたとしても実行に問題はないワケなのです 

"ベースアドレス指定方式・・・プログラムが主記憶上にロードされた時の先頭アドレスからの差分を使って命令やデータの位置を指定しています”


このような性質を持つプログラムを**再配置可能プログラム**と呼びます。以下にその性質を紹介していきます。


##再配置可能(リローケタブル)
ベースアドレス指定方式などでロードされた意図に応じてメモリアドレスの情報を補正している形をとっている

簡単にいうと…**主記憶上のどこに配置しても実行ができるよー**ってこと

##再使用可能(リユーザブル)

処理を終えたプログラムを主記憶から破棄しないでその後もう一回実行させるために変数の値をプログラムの最初か最後に初期化しておくこと。

簡単にいうと…プログラムを繰り返し実行できるようにしましたーってこと

##再入可能(リエントラント)

”再ロードしなくても繰り返し実行はできる”だけじゃなくて”並行して複数のタスクから呼び出されてもちゃんとそれぞれに正しい結果を返すことができます。

簡単にいうと…**再使用可能（リユーザブル）**のプログラムを複数のタスクから呼び出してもお互いに干渉することなく同時に実行できるよーってこと

###実行できる理由
プログラムが「手続き部分」と「データ部分」に分かれていてこの「データ部分を」タスクごとに持つことで互いに干渉せず平行して作動させることができるワケです

##再帰納(リカーシブ)
簡単にいうと…実行中に再度自分自身（ファイル）を読み込むことができるよーってこと

例えば 「ファイルの中を調べてくれるというプログラムがあったとして、そのファイルの中よりさらに下層にファイルがあるかもしれない場合、同じプログラムを再度読み込みし直す」ような処理に使われます



#■仮想記憶管理
「**主記憶や補助記憶の存在を隠蔽することで広大なメモリ空間を自由に扱えるようにするもの**」

これまでに「主記憶上のメモリ空間をどう効率的に使うか？」を色々紹介してきましたが、
仮想記憶ではその主記憶上の空間を使うのはやめて、仮想のメモリ空間を使えるようにして問題解決を図ろうと生まれたのがこの仮想記憶の考え方です。


##なぜ仮想記憶だと自由なのか？
主記憶装置には物理的に容量が限られており、フラグメンテーションなどで容量があるのにまとまった領域が使えない…という問題が発生してしまうことがありました。
それを仮想記憶は物理的な領域を持たないことから物理的な領域不足と言った問題に縛られなくなるワケです。

では実際にどこにデータを記憶するのか？というと…

**実記憶上**に記憶されます。

「え？何も変わらないやん！？」となるかもしれませんね…。
ですが仮想記憶というのは「実記憶などの物理的な存在を隠蔽して仮想空間に マッピングをしてみせる」の技術であるため、
つまり「**実記憶上に配置するのは変わらないが、物理的制約を意識しなくて済む**」と認識してもらえれば良い訳です

ちなみにこの変換の時使われる装置として**MMU(Memory Management Unit)というハードウェアが担当します。
この仕組みを**動的アドレス変換機構（DAT：Dynamic Address Translator)**と言います。


##実記憶の容量よりも大きなサイズを提供できる仕組み

仮想記憶の特徴というのは「実記憶”など”の存在を隠蔽してマッピングしてみせる」こと
つまり、必ずしも**マッピング先が実記憶じゃなきゃ困るというわけじゃない**ワケです

ここで補助記憶装置がメモリの一部とみなすことで実の容量よりも大きなサイズの記憶空間を提供できるようにできるのです。

###【基本情報技術者試験における仮想記憶の扱われ方】
基本情報技術者試験では特にこの点がクローズアップされているらしいです…。

仮想記憶=「**主記憶として使うことができる見かけ上の容量を拡大させる仕組み**」という使われ方がよく出題されます実記憶に入りきらないぶんを補助記憶が引き受けてくれるワケです

簡単にいうと「**どこに何があるのかをわかりやすく整理するイメージ**」

##ページング方式

プログラムを**ページ**という単位で固定長の領域に分割して管理します。

ただ、プログラムというのはいろんな機能があるので、いつも全てを必要とするわけではありません。
そこで現在のOSでは実行に必要なページだけを実記憶に読み込ませる方法（デマンドページ）が主流になっています。

仮想記憶と実記憶の対応付けは**ページテーブル**と言う表によって管理されます。
ページテーブルによって仮想ページ番号が実記憶上のどのページと結びついているか確認できるワケです。
目的のページがない事が確認できたら初めて補助記憶から実記憶へとページが読み込まれるのです。

**ページイン**・・・補助記憶から実記憶へのページ読み込むこと

**ページアウト**・・・ページインしようとした時に実記憶がいっぱいでしたって時にいずれかのページを追い出すこと

**スラッシング**・・・実記憶の容量が少ないと上記のようにページの置き換えを必要とする精度が高くなりシステムの処理効率が極端に低下すること


###ページ置き換えのアルゴリズム
ページインさせた時にページアウトを行う必要ができた時、ページアウトするページの決め方の種類

**FIFO（First In First Out)方式**
最初にページにしたページを追い出し対象にします


**LIFO(Last In First Out)方式**
最後にページインしたページを追い出し対象にします

**LRU(Least Recently Used)方式**
最も長い間参照されていないページを追い出し対象にします

**LFU(Least Frequently Used)方式**
最も参照良さ回数の少ないページを 追い出し対象にします

##ページングと スワッ ピング

###広義のスワッピング
補助記憶装置と主記憶装置とでメモリ内容を出し入れすること全般を指すので違いはない

###狭義のスワッピング
プロセス単位で領域の出し入れを行うのが「**スワッピング**」

ページ単位で領域の出し入れを行うのが「**ページング**」

※試験では狭義のスワッピングを参照する事。

#■最後に

ここまで長々と読んでくださりありがとうございました！
少し説明がわかりにくかった部分があるかと思いますが、もしわからないところがあればコメントしていただけると嬉しいです。

では！次の記事にて！