Linuxの基本的な概要まとめ

# Linux概要

プログラミング経験が浅くOSの知識もそれほど深いわけではないので、備忘録的な意味も込めてLinuxの概要や機能をざっと書いてみました。
書き留めておきたいことが増えればその都度追記していくつもりです。

## Linuxとは

- OSの一種

OSとはオペレーティング・システムのことで、コンピュータを動かす基本プログラム。
キーボードやスクリーン等のデバイスの入出力機能とアプリケーションを繋ぐなど、
ソフトウェアとハードウェアを連携させる。

- オープンソース

Linuxの最大の特徴といっても良い点。
通常のOSは有料のものが多い中（MicroSoftのWindowsは1万数千円など）、無償で提供されている。
さらにオープンソースのため、中のソースコードを見ることもでき、自由に改良することもできるなど、自由度が非常に高い。

- サーバとして使用されることが多い

上記の通り無料で利用でき自由度が高いため、サーバとして好んで利用される。サーバに占めるLinuxの割合は非常に高い。

- 種類が豊富

主に次のような種類がある。

**RedHat系**
Fedora、CentOSなど。
RPM形式でのパッケージ管理をしている。
yumコマンドを使うことができる。

**Debian系**
Ubuntu、Debianなど。
deb形式のパッケージ。
aptコマンドを使うことができる。

- 複数プロセスを同時に実行

他のOSにもある機能。実際に同時に動かしているわけではない。詳しくは後ほど。

- デバイスドライバ

他のOSにもある機能。プロセスが直接ドライバを動かせないよう、デバイスドライバが働く。

## Linux起動の流れ

コンピュータの電源ON
↓
BIOS、UEFI等のファームウェアが起動、ハードウェアの初期化
↓
ブートローダの読み込み、起動させるOSの選択

## CPUの話

プロセスが何らかの処理をする時、中央処理装置であるCPUが動きます。
プロセスはデバイスを直接処理できないという話がありましたが、その分離を確実なものにするため、CPUがデバイスの処理をしている間はプロセスがCPUにアクセスできないようになっています。
この時のCPUをカーネルモードと呼びます。
デバイスに限らず、カーネル関連の処理をする時にCPUはカーネルモードになります。そして、プロセスがCPUを使用している時のCPUはユーザモードになっています。CPUは、このユーザモードとカーネルモードを切り替えながら処理を実行しています。
プロセスがカーネルに処理を依頼したい時は、システムコールというものを発行します。するとCPUはカーネルモードになり、処理を実行します。この間プロセスはCPUを使えません。処理が終わるとCPUはユーザモードに戻り、再びプロセスのアクセスを受け付けるようになります。

![スクリーンショット 2018-06-28 17.07.17.png](https://qiita-image-store.s3.amazonaws.com/0/267114/a46bc1b2-5aba-e8b7-cf8f-855b87d7281d.png)

##プロセススケジューラ

先ほど、Linuxは複数プロセスを同時に実行すると書きましたが、実際のところは少し違います。CPUは、そもそも同時に2つ以上のプロセスを実行できないようになっています。

各プロセスはミリセカンド単位の非常に短い時間に区切られ（タイムスライス）、CPUはそのタイムスライスごとに順番に処理を実行していきます。
プロセスからプロセスへ切り替わる時間が非常に短いため、人間の感覚ではプロセスが同時に実行されているように見えるのです。
この処理を担当しているのが、プロセススケジューラです。

タイムスライス時のプロセスの交代のことをコンテキストスイッチを呼びます。
コンテキストスイッチはプログラムのきりの良いところで発生するとは限らないため、処理が中途半端なまま次のプロセスに切り替わることもあります。

##メモリの話

メモリは一時的な記憶装置のことです。メモリの使用量が増えると空き容量が少なくなるため、当然コンピュータの動作が遅くなります。

![スクリーンショット 2018-06-28 17.19.47.png](https://qiita-image-store.s3.amazonaws.com/0/267114/ac7eff9e-3d27-15f5-47d1-14a6db21704d.png)

そして空き容量が0になると、コンピュータが全く動かなくなってしまいます。この状況をOOM（Out Of Memory）と呼びます。

このOOM対策として、OOM Killerと呼ばれる機能があります。これは今動いているプロセスの中から適当に選んでそれを強制終了することでメモリに空き領域を作る昨日です。

OOM Killerは強制終了するプロセスを選択できないためどのプロセスが終了するのかが分かりません。
そのため重要なプロセスが強制終了されてしまうという危険性を孕んでおり、業務では推奨されていません。

###仮想メモリの話
---

メモリには各領域にアドレスというものが割り当てられており、メモリを使用する時はそのアドレスを指定するようになっています。しかし、プロセスが直接実際のアドレス（物理アドレス）にアクセスすることは不可能であり、仮想メモリという仕組みが使われています。

仮想メモリとは、それぞれの物理アドレスに仮想アドレスというものを更に割り当て、仮想アドレスを指定することでメモリにアクセスする仕組みです。

![スクリーンショット 2018-06-28 17.37.40.png](https://qiita-image-store.s3.amazonaws.com/0/267114/7d19ca23-e2cf-b280-7184-1a4113f0f3c8.png)

仮想メモリの仕組みによって、どのようなメリットがあるのでしょうか。
主なメリットの2つを書いておきます。

######1

まず、連続していない空き領域を、連続している領域のように扱うことができるようになります。

![スクリーンショット 2018-06-28 17.47.17.png](https://qiita-image-store.s3.amazonaws.com/0/267114/b2277481-38b5-e372-e0b5-b8083c3ed103.png)

上図のように断片的に100バイトの空き領域が3つずつある場合、合計で300バイトの空き領域があるにも関わらず領域が飛び飛びになっているため、コンピュータのパフォーマンスが低下してしまいます。このような現象をフラグメンテーションと呼びます。

仮想メモリを使うとこのような飛び飛びの空き領域も連続した仮想アドレスに割り当てることができるため、パフォーマンスの損傷を抑えることができます。

######2

物理メモリにはカーネルが使用している領域があり、ここにもアドレスはあります。そのため、カーネルが使用しているメモリのアドレスを指定するとアクセスができてしまい、カーネルの動作に異常が発生する危険性があります。
また、他のプロセスのアドレスにアクセスすることでそのプロセスに以上を発生させる恐れもあります。
仮想アドレスを通してしかメモリにアクセスできないようにすると、カーネルが使用するメモリ領域に仮想アドレスを割り振らなければアクセスはできないため、こういった事態を防ぐことができます。


---

OOMを回避するための仕組みとしてOOM Killerがありますが、これは危険性の高いものでした。
これに代わるものとして、仮想記憶の仕組みを使った措置があります。それがスワップと呼ばれるものです。

この処置では、OOMになると使用中のメモリの一部をスワップ領域と呼ばれるストレージデバイスの領域に移動させます。こうすることによって一時的にメモリに空き領域を作り出すのです。

ただしストレージデバイスへのアクセスはメモリへのアクセスに比べて速度が格段に落ちてしまいます。