Linuxシステム入門

## 0. Linuxシステムについて
### 0-1. OS（オペレーティングシステム）とは

- 以下の役割を持つソフトウェア。
    - ハードウェアを管理する。
    - プロセス (実行中のプログラム) からハードウェアにアクセスする方法を提供する。

[Operating system - Wikipedia](https://en.wikipedia.org/wiki/Operating_system)

OSの例（LinuxOS以外を含む）

![1_OZ5CW34BSLp4vJ0xcxOWUQ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54467/949db8c9-9639-df58-8f0f-7bc7fb5d4d70.png)

[An Excess of Operating Systems - Jean-Louis Gassée](https://mondaynote.com/an-excess-of-operating-systems-b0521f227654)

OSのインターフェイス（GUI/CUI）の例

![Neofetch-7-support-macOS-Catalina.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54467/07acad8d-25b7-58d4-cffe-92b343719db0.jpeg)

[様々なPCのシステム情報をターミナルに表示してくれるコマンドラインツール「neofetch」がmacOS 10.15 Catalinaに対応。](https://applech2.com/archives/20200310-neofetch-support-macos-10-15-catalina.html)

### 0-2. Linuxディストリビューション

* Linuxカーネルを含むOS全体をパッケージ化したもの。
* ユーザーがコンピュータ（OS）をすぐに利用できる形で提供される。
* Linuxディストリビューションの主な要素
    * Linuxカーネル（後述）
    * システムツール
    * ユーザープログラム
        * CLIやシェル `bash` 、 `zsh`
    * パッケージマネージャー
        * Debian系の `APT`
        * Red Hat系の `YUM` 、`DNF` ※ それぞれ `RPM（Red Hat Package Manager）` の後継
        * Arch系の `pacman` など
    * デスクトップ環境やGUI
    * 各種アプリケーション
        * テキストエディタ `vim`
        * Webブラウザ `Firefox` 、 `Chromium`
        * メディアプレーヤー `VLC` 、 `mpv`
* Linuxディストリビューションの例
    * **Ubuntu**
        * Debian というディストリビューションがベース。
        * 初心者向けのディストリビューション。
    * **CentOS**
        * Red Hat系のディストリビューションであり、RHEL（Red Hat Enterprise Linux）というディストリビューションがベース。
        * 無料のディストリビューションで、開発・テスト環境などで用いられる。
    * **Arch Linux**
        * シンプルなディストリビューションで、必要なパッケージをインストールしてシステムを構築する。

### 0-3. Linuxシステムの全体像

- OSを含むLinuxシステムの全体像を理解するために、コンピュータを三つの主要なレベルで考える。

1. **ハードウェア**
    - 1個以上のCPUを含む物理機器。
    - OSが動作する基盤を提供しており、OSはハードウェア上で動作する。
1. **カーネル**
    - OSのコア、中心部。メモリ上にあるソフトウェア。
    - ハードウェアと実行中のプログラムの連携を管理する。
        - ハードウェア（特にメインメモリ）を管理する。
        - 実行中のプログラムがハードウェアを操作するためのインタフェース（**システムコール**）を提供する。
1. **ユーザープロセス（ユーザー空間）**
    - 実行中のプログラムのこと。
    - カーネルによって管理される、OSのうちカーネル以外の要素。
        - アプリケーション、シェル、GUIなどが含まれる。

[Linux カーネルとは - Red Hat](https://www.redhat.com/ja/topics/linux/what-is-the-linux-kernel)

Linuxシステムの全体像

![linux-system-architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54467/9ab6c793-a2f7-c587-6d1c-4a3d803ab98d.png)

[組み込みLinuxシステムとは Linuxシステムアーキテクチャ - Armadillo](https://manual.atmark-techno.com/armadillo-guide/armadillo-guide-1_ja-2.0.0/ch02.html)

## 1. ハードウェア

- Linux OSはハードウェア上で動作し、ハードウェアと密接に関連しているため、Linuxシステムを理解する前提知識として、ハードウェアについて知っておく必要がある。

### 1-1. メインメモリ（DRAM）

- **主記憶装置**。ビット（0と1の集まり）を格納する大きな記憶領域。
- メインメモリというとき、RAM（Random Access Memory）、とくにDRAM（Dynamic RAM）を指すことが多い。
- RAMとは、**システムの物理メモリ**のこと。
    - DRAM
        - 揮発性(記憶されている情報を維持するために電源を常に供給する必要がある)のメモリであり、システムが利用する汎用メモリ。一定時間ごとに同じ内容を記録し直すリフレッシュ動作が必要なため、電力消費が大きい。
        - 1個のコンデンサと1個のトランジスタで構成される。
    - SRAM
        - DRAMと同じ揮発性メモリだが、フリップフロップ回路を利用することでリフレッシュ動作が不要。 
    - VRAM
        - 映像出力用のビデオメモリ。

RAMのイメージ

![ky_memory-01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54467/ca10ae54-d727-2ada-4862-64817f662430.jpeg)

[知らないと恥ずかしい？　メモリの「RAM」と「ROM」の違い - ITmedia NEWS](https://www.itmedia.co.jp/news/articles/1706/01/news051.html)

#### 1-1-1. キャッシュメモリ

- メインメモリとCPUの間に構成された、**高速アクセスが可能なメモリ**。
    - CPUがアクセスしたいデータを、メインメモリからコピーし保持（キャッシュ）する。
- DRAMよりも小容量で高速なSRAMによって構成される。
- 最近のCPU（プロセッサ）は処理速度が高速化しているにもかかわらず、メインメモリとなるDRAMのアクセス速度の向上が追いつかない問題（ノイマンズ・ボトルネック）があったため、キャッシュメモリによってその解消が図られた。

キャッシュメモリのイメージ

![cpu-cache-memory.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54467/6f571e2a-4d3d-033d-de76-95b8e817a2b1.jpeg)

[CPUのキャッシュメモリとは - BTOパソコンの教科書](https://bto-textbook.com/parts/cpu-cache-memory)

### 1-2. CPU（Central Processing Unit、プロセッサ）

- **中央演算処理装置**。**プロセッサ**。 ※ CPU ≠ コンピュータ
    - システム/プロセッサボードのソケットに装着される物理チップ。
    - プログラムの命令に従って動く、コンピュータの中核的な部分。
    - **データパス**と**制御**から構成される。
        - データパスは演算処理を行う。
        - 制御はプログラムの命令に従って何を行うべきかを、データパスとメモリと入出力に指示する。
    - **記憶装置（メモリ）に対して演算を行う**。
        - システム全般の計算処理（数値演算、数値の条件判定、入出力装置の駆動など）を行う。
- CPUと言うとき、レジスタ、ALU（Arithmetic Logic Unit/算出論理演算装置）など、命令を実行する一連の機能ユニットを指すが、現在では、プロセッサか仮想CPUを指すことが多い。

CPUのイメージ

![41ZlpceMzcL._AC_UF1000,1000_QL80_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54467/e62aca79-6fa1-77dc-151e-4dd8c4ce9744.jpeg) 

[Intel CPU Core i7-7700 3.6GHz 8Mキャッシュ 4コア/8スレッド - Amazon.co.jp](https://www.amazon.co.jp/i7-7700-3-6GHz-8M%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5-LGA1151-BX80677I77700/dp/B01N0L41N7)

#### 1-2-1. 代表的ななプロセッサ

* **Intel Core i3/i5/i7/i9**
    * x86_64ベースのアーキテクチャ
    * Intelの主力製品ラインで、デスクトップやラップトップ向けに広く採用されているプロセッサ。
    * i3はエントリーレベル、i5とi7はミドルレンジ、i9はハイエンドと、性能やコア数、ターボブースト機能に応じてさまざまなモデルが存在する。
* **AMD Ryzen**
    * x86_64ベースのアーキテクチャ
    * AMDが提供するデスクトップ、ラップトップ、サーバー向けのプロセッサで、特にマルチスレッド性能が優れている。
    * ゲーム、クリエイティブ作業（映像編集、3Dレンダリングなど）、サーバー用途で高いパフォーマンスを発揮し、Intelの競合製品と並ぶ人気を誇る。
* **Apple M1/M2**
    * ARMベースのアーキテクチャ
    * Appleが独自に設計したARMベースのプロセッサで、MacやiPadに搭載されている。高効率な省電力設計と、優れた処理性能が特徴。
    * CPU、GPU、メモリが統合されたSoC（System on a Chip）であり、Appleのソフトウェアとの深い統合によって優れたパフォーマンスを実現している。
* **AWS Graviton**
    * ARMベースのアーキテクチャ
    * AWSが提供するクラウドサーバー向けのプロセッサで、エネルギー効率に優れ、スケーラブルなクラウドインフラに最適化されている。
    * 特にコスト効率やパフォーマンスが求められるワークロードに向けて設計され、エネルギー消費を抑えつつ高いパフォーマンスを発揮する。

#### 1-2-2. プロセッサの主なアーキテクチャ

* **x86_64**
    * 64ビットのコンピュータアーキテクチャで、x86アーキテクチャを64ビットに拡張したもの。
        * 最初にAMDによって導入されたため、AMD64とも呼ばれる。
    * デスクトップPC、ラップトップ、サーバーなどの広範な用途に使用されており、Intel CoreシリーズやAMD Ryzenシリーズのほとんどがx86_64アーキテクチャに対応している。
    * 高性能であり、CISC（Complex Instruction Set Computing）アーキテクチャに基づいているため、複雑な命令セットをサポート。
* **ARM**
    * ARM Holdingsが設計したRISC（Reduced Instruction Set Computing）アーキテクチャで、シンプルかつ低消費電力が特徴。
    * モバイルデバイス、組み込みシステム、サーバー（例: AWS Graviton、Apple M1/M2）などに幅広く使用されている。
    * 命令セットが簡素で、ハードウェアの実装が容易なため、特に省電力を重視するデバイスで高い効率性を発揮する。

#### 1-2-3. マルチプロセッサ

- 2つ以上のプロセッサで構成されているコンピュータのこと。
    - 1つのプロセッサだけで構成されているコンピュータを**ユニプロセッサ**と言うが、今日ではユニプロセッサはほとんど見られない。

#### 1-2-4. GPU

- もともとは3Dレンダリング（動画・画像出力処理）の高速化用途のプロセッサだった。
    - 現在では、人工知能、機械学習、アナリティクス、暗号通貨のマイニングなどの用途でも用いられる。

#### 1-2-5. コア

- プロセッサは、コア、ハードウェアスレッドといった、**1つ以上の独立したCPUインスタンス**を含んでいる。
    - **コア**は、それぞれ独立したプロセッサのように振る舞い、単一のプロセッサのスケーラビリティを改善する。
    - **ハードウェアスレッド**は、1つのコアの上で複数のスレッドの並列実行をサポートする。ハードウェアベースのマルチスレッド。

#### 1-2-6. マルチコア（マルチコアプロセッサ）

- 複数のコアを搭載しているプロセッサのこと。
    - 1つのコアを搭載しているプロセッサを**シングルコア**と言うが、シングルコアプロセッサでは、1つのプロセスしか処理を行うことができない。
        - **マルチタスクOS** では、複数の**タスク**（マルチプロセス）を細かく切り替えることで実行（**並行処理**）できた。
    - マルチコアプロセッサでは、複数のマルチプロセスを同時に実行（**並列処理**）できる。

コアのイメージ

![jn200424mcy01_w545.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54467/522d16f4-a591-e0d7-a7c4-d1ea642b8874.jpeg)

[マルチコアマイコンとシングルコアマイコンの違い - EDN Japan](https://edn.itmedia.co.jp/edn/articles/2004/29/news003.html)

#### 1-2-7. クロック周波数（clock rate/clock speed）

- **クロック**は、プロセッサのロジックを動かすデジタル信号のこと。
- クロックに基づいたデジタル信号の時間間隔を、**クロックサイクル（CPUサイクル）** と言う。
    - 個々のCPU命令は、実行するために、ひとつ以上のクロックサイクル（CPUサイクル）を必要とする。
    - 例: 毎秒40億クロックサイクルは、1クロックサイクルあたり250ps（250ピコセカンド）。
- **クロック周波数** は、クロックサイクル時間の逆数である。
    - 例: 4GHz（ギガヘルツ）のCPUは、毎秒40億クロックサイクルで動作する。
- クロックスピードを上げればパフォーマンスが上がるわけではなく、クロックサイクル（CPUサイクル）が実際に何をしているかがパフォーマンスを左右することに注意。

[CPUの性能指標【クロック周波数/CPI/MIPS】 - Qiita](https://qiita.com/pli8xxx_yu/items/bbac6b20350b8d1f0c4a)

### 1-3. レジスタ

- CPU内部の**小さな記憶領域**。
- CPU命令が、RAMやROM（Read Only Memory）などのメインメモリにアクセスする際のアドレスを保持する。
- メインメモリよりも容量は小さいが、高速に動作する。
- プログラムでの変数は、コンパイラによってレジスタに割り付けられる。

![026-operation-fig10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54467/a2a02c85-e501-cd20-1f64-1c14d3f37c92.jpeg)

[コンピュータの仕組み - 情報科学の基本](https://kmownet.com/info-science-basic/020-principle/026-operation/026-operation.html)

### 1-4. ディスク（ストレージ）

- **補助記憶装置**。コンピュータのメインの**ストレージデバイス**。
    - 物理的にマシンに搭載されていることもあれば、ネットワークを経由して仮想的に接続されていることもある。
- CPUやメインメモリが、**全てのファイルの読み書きを行う場所**。
    - OS、アプリケーションコード、アプリケーションログ、アセット、データベースに対しての書き込みなどが保存される。
    - メインメモリ（主記憶装置）と比較するとレイテンシやスループットは遅いが、**大容量**。
- **HDD（ハードディスクドライブ / 回転磁気ディスク）**
    - 1枚以上のディスクから構成される。
- **SSD（ソリッドステートドライブ）**
    - 一部のSSDは不揮発性のDRAMを使っているが、 大半は**NANDフラッシュメモリ**を使用している。
    - 今日では、すべてのデジタル・カメラ、スマートフォン、PCが、ディスクの代わりにフラッシュメモリベースのSSDを使用している。

ストレージのイメージ

![main.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54467/ad252400-cef0-404a-6025-a64c892092f3.jpeg)

[SSDとHDDの違いは何？ストレージごとの特長と注意点を簡単に解説 - Logitec](https://www.pro.logitec.co.jp/about_hdd/hddssd/0718/)

### 1-5. ネットワークインタフェース

- ネットワーク接続に対するOS側のエンドポイント。システム管理者が構成し、管理する抽象。
- ネットワークインタフェースは、物理ネットワークポートにマッピングされ、ポートはネットワークに接続し、一般に別々の送信チャネルと受信チャネルを持つ。
- インターフェイスやリンクという用語は、OSが構成し、OSから見えるネットワークインタフェイスポートの論理インスタンスを指し、仮想インターフェイスを表す場合もある。

#### 1-5-1. NIC（ネットワークインターフェイスカード）

- コンピュータに有線のLANケーブルを挿すための口となるパーツ、アダプタ。
    - マイクロプロセッサ（**ネットワークコントローラ**）を搭載しており、ネットワークポートとシステムのI/Oトランスポートの間でパケットを転送する。
- **MACアドレス**（NICの製造元ごとに特定の数字）が割り当てられている。
- **IPアドレス** を1つ以上割り当てると、IPパケットを受信できるようになる。
- **ARP(Address Resolution Protocol)** によって、IPアドレスは対応するMACアドレスに変換される。

![Network_card.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54467/6c473d21-c254-af91-85f9-7d69c0260cac.jpeg)

[ネットワークカード - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%AB%E3%83%BC%E3%83%89)

[ネットワーク（TCP/IP）入門 NIC（Network Interface Card） - Qiita](https://qiita.com/yokoto/items/3b7dc79b750dcf6fc810#mac%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9media-access-control-address)

#### 1-5-2. インターフェイスポート

- 物理ネットワークコネクタのこと。

インターフェイスポートのイメージ

![CCNA002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54467/e9842c26-2347-f9c9-25b8-db80fc611d2f.png)

[ネットワークのおべんきょしませんか？ - Ciscoのインタフェース名について詳しく解説](https://www.n-study.com/cisco-basic/cisco-interface/)

## 2. カーネル

- ハードウェア、メモリ、CPUスケジューリングなどのシステムを管理する、**カーネルモード**というCPUモードで動作するプログラム。

Linuxシステムの全体像

![linux-system-architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54467/9ab6c793-a2f7-c587-6d1c-4a3d803ab98d.png)

[組み込みLinuxシステムとは Linuxシステムアーキテクチャ - Armadillo](https://manual.atmark-techno.com/armadillo-guide/armadillo-guide-1_ja-2.0.0/ch02.html)

### 2-1. カーネルモードとユーザーモード

- **カーネルモード**
    - ハードウェア（プロセッサやメインメモリ）へ直接制限なくアクセスする、特権的なCPUモード。
    - 高速だが、バグがあった場合OSが停止するリスクがある。
- **ユーザーモード**
    - メモリの一部へのアクセスと安全なCPU操作に制限されているCPUモード。
    - デバイスI/Oの実行時などは、システムコールやトラップを介してカーネルモードにアクセスできる。
- **モードスイッチ**
    - ユーザーモードとカーネルモードの切り替えのこと。

### 2-2. システムコール

- **ユーザープロセス（ユーザーモードのプログラム）がカーネルに処理を依頼するためのプロトコル**。
    - ユーザープロセスが、ハードウェアを操作したいとき、カーネル（デバイスドライバ）を通じてのみハードウェアを操作できるため、システムコール発行する。
- 一般に、OSは多くのシステムコールに対する使いやすいインタフェースとして、**C標準ライブラリ（たとえばlibc、glibcライブラリ）** を提供している。

#### 2-2-1. システムコールの例

- **プロセス管理**
    - fork(2) 新しいプロセスを作る
    - clone(2) 新しいプロセスまたはスレッドを作る
    - exec() 新しいプログラムを実行する
- **ファイルシステム操作**
    - open(2) ファイルを開く
    - read(2) バイトを読み出す
    - write(2) バイトを書き出す
    - close(2) ファイルを閉じる
    - stat() ファイルの統計量を取得する 
- **メモリ管理**
    - mmap() メモリアドレス空間にファイルをマッピングする
    - brk() ヒープポインタが指せる範囲を拡張する
- **ネットワーク通信**
    - connect() ネットワークホストに接続する
    - accept() ネットワーク接続を受け入れる
- その他
    - ioctl() I/Oプロパティのほか、雑多な機能属性を設定する
    - futex(2) 高速なユーザーモードミューテックス


### 2-3. プロセス管理

#### 2-3-1. プロセスの基本
- プロセスとは、**実行中のプログラムのインスタンス**のこと。
    - プログラムのコード、データ、スタック、およびその他のリソースを含む。
    - 各プロセスには、CPUで実行するための必要な情報（レジスタ、メモリアドレスカウンタ、ファイルディスクリプタ、スレッドスタック）が保持される。
- カーネルは、プロセスのライフサイクルを管理する。
    - 通常、制限されたユーザーモードで実行される。
    - 特権操作（ハードウェアアクセス、システムリソースの管理など）を行う際には、システムコールを通じてカーネルモードに切り替わる。

##### 2-3-1-1. プロセスID (PID)
- 各プロセスに割り当てられる一意の識別子。
- カーネルはPIDを用いてプロセスを管理し、区別する。

##### 2-3-1-2. スレッド

- プロセス内に1つ以上含まれる、実行可能な単位。
- スレッドは**同じメモリ空間を共有**する。
    - プロセスはメモリ空間を共有しない。

#### 2-3-2. プロセスのライフサイクル

- **プロセスの開始**
    - プログラムをメモリ上にロードし、実行可能な状態にする。
    - 新しいプロセスに一意のプロセスID (PID) を割り当てる。
    - 重要な2つのシステムコール
        1. **`fork()`**
            - プロセスの複製を作成する。
            - すべての新たなユーザープロセスは、 `fork()` の結果。
        1. **`exec()`**
            - プロセスを置き換え。
            - 新たなプログラムを開始するために実行する。
    - 例: ターミナルウィンドウで `ls` を入力すると、ターミナルウィンドウ内で実行しているシェルは、 `fork()` を呼び出して、そのシェルの複製を生成する。そして、その新たなシェルの複製が `exec（ls）` を呼び出して `ls` を実行する。
- **プロセスの一時停止**
    - 実行中のプロセスを一時的に停止し、他のプロセスにCPUを譲る。
    - コンテキストスイッチにより、プロセスの状態を保存する。
- **プロセスの再開**
    - 停止していたプロセスを再び実行可能な状態にする。
    - 保存されていたプロセスの状態を復元し、実行を再開する。
- **プロセスの終了**
    - プロセスが完了したとき、または異常終了したときに実行される。
    - 使用していたリソース（メモリ、ファイルディスクリプタなど）を解放し、プロセスIDを再利用可能にする。

##### 2-3-2-1. シグナル

- シグナルは、プロセスにイベントを通知する（プロセスに割り込む）機能。
- 例: 無限ループの停止 `kill ${proccess_id}` or Ctrl + C 
    - killコマンド
        - デフォルトで `SIGTERM` シグナルを送信する。
        - `kill -9 ${proccess_id}` とすると `SIGKILL` シグナルを送信する。

**SIGTERM** vs **SIGKILL**

| SIGTERM | SIGKILL |
|:-:|:-:|
| プロセスを正常に終了する  | プロセスを即座に強制終了する  |
| プロセスはシグナルを処理、無視、およびハンドルできる  | プロセスはシグナルを処理、無視、およびハンドルできない |
| 子プロセスを強制終了しない | 子プロセスも強制終了する  |
| ゾンビプロセスが作成される可能性は低い  |  ゾンビプロセスが作成される可能性がある |

[SIGTERM vs SIGKILL: What's the Difference?](https://linuxhandbook.com/sigterm-vs-sigkill/)

シグナルの種類

![php-15-320.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54467/7de0d043-bf46-7b8a-e874-1c6685d68513.png)


[PHPとシグナル、その裏側 |- slideshare](https://www.slideshare.net/do_aki/20171008-signal-onphp)

#### 2-3-3. プロセスのスケジューリング

- **スケジューラ**
    - CPU時間を複数のプロセス間で効率的に配分する（プロセスに個別のCPUを割り当てる、スケジューリングする）カーネルのコンポーネント。
        - スケジューラがスレッド（Linuxではタスク）に働きかけて、CPUにマッピングする。
    - 優先度やアルゴリズム（例：ラウンドロビン、優先度ベース）に基づいて、次に実行すべきプロセスを決定する。
- **ランキュー**
    - 実行可能状態のすべてのスレッドを管理する優先度別のキュー。
    - スケジューラは、ランキューによって、CPU時間をアクティブプロセスとスレッドの間で分割し、重要な仕事を早く実行できるようにする。
    - 利用できるCPUよりも実行したいスレッドの方が多い場合は、優先度の低いスレッドは自分の順番が来るまで待機する。

#### 2-3-4. マルチタスキング

- 複数のプロセスを同時に実行する機能。
- カーネルが迅速にコンテキストスイッチを行い、ユーザーには複数のプロセスが同時に動作しているように見せる。

#### 2-3-5. コンテキストスイッチ

- 現在実行中のプロセスの状態を保存し、別のプロセスの状態を復元する操作。
    - あるスレッドまたはプロセスから別のスレッド、プロセスへの実行の切り替えのこと。
- 効率的なスケジューリングのために頻繁に行われる。
- スケジューラは、実行中のCPUレジスタ群の内容（スレッドコンテキスト）を新しい内容に切り替える。
- ディスクI/OやネットワークI/Oなどのブロックを起こすシステムコール時にコンテキストスイッチを行う。
    - 呼び出し元がブロックされている間にほかのスレッドを実行するため。

### 2-4. ファイルシステム

- ファイルシステムは以下を備えている。
    - ファイルとディレクトリによってデータを構成し、アクセスするためのインターフェイス。
    - アクセス制御のためのファイルパーミッション。
- OSの最も重要な役割のひとつ。
- **ほとんどのファイルシステムタイプは、コンテンツを格納するためにストレージデバイス（ディスク）を使っている**が、 `/proc` や `/dev` のように、カーネルが動的に作成するファイルシステムタイプもある。
- 一般に、カーネルは、プロセスに与えるファイル名の名前空間を全体の一部だけに制限する `chroot(8)` などの方法を提供している。
    - また、Linuxでは名前空間を**マウント**する（ディレクトリに自分のツリーを付け加え、ツリーを結合する）ことができ、一般にコンテナで使われている。

#### 2-4-1. ファイルシステムのトップレベルディレクトリの例

- etc システム構成ファイルを格納する
- usr システム供給のユーザーレベルプログラム、ライブラリを格納する
- dev デバイスファイル（デバイスノード）を格納する
- var システムログなどの変化していくファイルを格納する
- tmp 一時ファイルを格納する
- home ユーザーのホームディレクトリを格納する

#### 2-4-2. inode（インデックスノード）

- 特定のファイルに関するデータの集まり。
- iノード番号、UID（ユーザーID）、GID（グループID）、パーミッション、ファイルサイズ、ファイル作成時間、更新日時、実際のデータの位置（ディスク上の物理的な場所）、そのファイル自身への参照数をデータとして管理するデータ構造。

[iノード（inode）とは - kazmax Linuxで自宅サーバー](https://kazmax.zpp.jp/linux_beginner/inode.html)

#### 2-4-3. シンボリックリンクとハードリンク

- **シンボリックリンク**
    - **リンク元の実体の「場所（名前）」を情報として持つ**。
        - リンク元の実体を移動すると参照できなくなる。
        - 実質的にエイリアスとして、奥深い場所にあるディレクトリパスへ素早くアクセスできるようにする。
    - シンボリックリンクを削除してもリンク元のファイルの実体が削除されることはない。
    - ディレクトリに対してもシンボリックリンクを作成できる。
    - ファイルシステムをまたいで作成することが可能。

```
$ ln -s リンク元のファイル名 シンボリックリンク名
```

- **ハードリンク**
    - 既存のinodeに対して、**別のファイル名で同じファイルの実体を共有**する。
    - ハードリンクを削除しても他のハードリンクが残っている場合は、ファイルの実体は削除されることはない。
    - （スーパーユーザー以外は）ディレクトリに対して作成することはできない。
    - 別のファイルシステム上のファイルに対して作成することはできない。
    - 現在ではめったに使われない。

```
$ ln リンク元のファイル名 ハードリンク名
```

[LinuCレベル1 101試験の例題と解説 1.02.3 ハードリンクとシンボリックリンク](https://linuc.org/study/samples/2424/)

#### 2-4-4. I/O（Input/Output）

- I/O（Input, 入力 / Output, 出力）とは、コンピュータシステムと外部との間のデータのやり取りのこと。
- 「入力」はシステムが受け取る信号やデータ、「出力」はシステムから送られる信号やデータ。

##### 2-4-4-1. I/Oの種類

- **ディスクI/O**
    - ディスク（HDD、SSDなど）の読み書きのこと。
    - ディスクドライブのコントローラを通じて行われ、CPUやメインメモリとディスク間でデータを転送する。
    - 少なくとも、方向（読み出しか書き出しか）、ディスクアドレス（位置）、サイズ（バイト）の指定を必要とする。
    - **シーケンシャルI/O**
        - 保存領域の最初から **逐次的に** 読み書きを行う。
        - HDDでは磁気ディスクを実際に回転させて読み書きを行っているため、シーケンシャルI/Oは比較的高速。
        - HDDのようなストレージデバイスのパフォーマンス上の特性から、ファイルシステムは、伝統的にディスク上にファイルを連続的にシーケンシャルに配置して、ランダムI/Oを減らそうとしてきた。
    - **ランダムI/O**
        - 比較的遅い。
        - SSDはHDDよりも、消費電力が少なく、軽量で、**ランダムI/Oが高速**に行える。
- **ネットワークI/O**
    - ネットワークを介してデータを送受信するプロセスのこと。
    - 例: アプリケーションがリモートのデータベースサーバーに対してデータを挿入、更新、削除する際に、ネットワークを介してSQLクエリを送信し、応答を受け取る。
    - TCP/IPやUDPなどのプロトコルを利用する。
- **ファイルI/O**
    - ファイルシステムを介してデータの読み書きを行うプロセスのこと。
    - 例: ログファイルへの書き込みなど。

##### 2-4-4-2. I/Oの実装方法

- **ブロッキングI/O**
    - I/Oが完了するまでプログラムの実行をブロックし、プログラムを待機状態にしておく、I/Oの方式。
        - I/Oが完了すると、プロセスは処理を再開する。
    - プロセスが、個々のI/Oの処理の完了を待つことを、**ブロック**する、と言う。
    - ブロッキングI/Oの問題点
        - **I/Oの並列実行のオーバーヘッド**
            - I/Oを並列実行する際、多数のスレッドを作らなければならないため、スレッドの作成と破棄、スレッドの維持に必要なスタックスペースのコストが増加し、システムのメモリ消費量が増大し、オーバーヘッドが発生する。
        - **コンテキストスイッチのオーバーヘッド**
            - 短時間で終了するI/Oを頻繁に行うと、頻繁にコンテキストスイッチを行うことによるオーバーヘッドのためにCPUリソースがかなり消費され、アプリケーションのレイテンシが高くなってしまう。
- **ノンブロッキングI/O**
    - I/Oが即時に完了しない場合はエラーを返し、スレッドをブロックしない。
        - プログラムはI/O操作が完了するまでの間、I/O操作の完了を確認するためにポーリングを行うか、他のタスクを処理する。
    - ブロッキングI/Oのパフォーマンス上の問題を解消する、
    - サーバーサイドJavaScriptアプリケーション環境であるNode.jsの重要な特徴。
- **非同期I/O**
    - I/O操作をバックグラウンドで実行し、操作が完了するまでプログラム全体をブロックしない。
        - プログラムはI/O操作が完了するまでの間、他のタスクを処理する。
    - Nginxは非同期I/Oを採用しており、これにより、同時に多数の接続を効率的に処理することができる。

[ノンブロッキングI/Oと非同期I/Oの違いを理解する- PAYFORWARD](https://blog.takanabe.tokyo/2015/03/%E3%83%8E%E3%83%B3%E3%83%96%E3%83%AD%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0i/o%E3%81%A8%E9%9D%9E%E5%90%8C%E6%9C%9Fi/o%E3%81%AE%E9%81%95%E3%81%84%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B/)
[【Linux】非同期IOブロッキングとかノンブロッキングの話 - 地方エンジニアの学習日記](https://ryuichi1208.hateblo.jp/entry/2021/01/09/105929)
[ブロッキングI/O, ノンブロッキングI/O, 同期, 非同期 - Zenn](https://zenn.dev/link/comments/a1d0a4a9b8bdfe)

##### 2-4-4-3. I/Oのパフォーマンス指標

- **スループット**
    - **単位時間あたりのデータ転送量**。
    - **bps（bit per second / 秒あたりのバイト数）** で計測される。
    - 一定時間において処理を行えたファイルサイズを指す。
- **レイテンシ**
    - **一度の読み書きなどの処理を行う際に発生する遅延**を指す。
    - I/Oの開始から終了までにかかった時間。
- **パーセンタイル**
    - **データを昇順（または降順）に並べた際に、全体の中で特定の割合がその値以下となる最小の値**を指す。
    - 特定の割合のユーザーにとって許容範囲にあることを計測するための手段として、SLAで指定されることもある。
    - 例1: **99.9パーセンタイル** が「14.5s」の場合、全データの99.9%が14.5s以下である
    - 例2: **99パーセンタイル** が「14.5s」の場合、全データの99%が14.5s以下である
    - 例3: **95パーセンタイル** が「14.5s」の場合、全データの95%が14.5s以下である
    - 例4: **50パーセンタイル（= 中央値）** が「14.5s」の場合、全データの50%が14.5s以下である
- **テイルレイテンシ**
    - **99.9パーセンタイルや99パーセンタイルのレイテンシ** を指す。
    - アプリケーションの中で最も遅い一定割合のレイテンシのこと。
    - システムの信頼性やユーザー体験にとって重要な役割を果たす。
- **IOPS（Input/Output Per Second）**
    - **1秒間に処理できるI/Oの数**。
    - この数字が大きければ大きいほど多くの読み書きができる。
    - 例: 100IOPSが担保されているストレージの場合、1秒間に100個のファイルを開いて読むことができることを指す。

### 2-5. メモリ管理

- メモリには以下のようにさまざまな種類がある。
    - 特定のプロセスに割り当てられているメモリ、プロセス間で共有されているメモリ、空きメモリ。
- カーネルは、すべてのメモリを管理する必要がある。
- 現代のCPUは、**仮想メモリ**と呼ばれるメモリアクセス方式を可能にしている **メモリ管理ユニット（MMU）** を持っている。
- `mmap()` **メモリアドレスマップ**
    - 仮想メモリが使われた場合、プロセスは、ハードウェア上のメモリの物理アドレスへ直接アクセスする代わりに、メモリ管理ユニットがそのアクセスを途中で補足し、メモリアドレスマップを使って、プロセスから見たそのメモリアドレスを、コンピュータ上の物理メモリアドレスに変換する。
    - カーネルは、メモリアドレスマップの初期化、切り替え等の管理を行なっている。

#### 2-5-1. メモリ領域

- 4つのセグメントに分割される。
1. **テキスト領域**
    - 機械語に翻訳されたプログラムが格納される。
        - この機械語の命令が1行づつ実行されることでプログラムが動く。
2. **静的領域**
    - グローバル変数などの静的変数が置かれる。
3. **ヒープ領域**
    - メモリの動的管理 (C 言語の `malloc` 関数や C++ の `new` 演算子でメモリを確保すること) で用いられる。
4. **スタック領域**
    - C関数の引数やローカル変数が積まれる。
    - LIFO（Last In First Out）のデータ構造。
    - スタックフレーム
        - スタック領域に積み重ねられる単位であるデータ構造のこと。
        - スタックフレーム1つが、1回の関数呼び出しに対応する。

[第5章 ガ－ベージコレクション - Rubyソースコード完全解](https://i.loveruby.net/ja/rhg/book/gc.html)
[メモリの4領域 - 工学院大学](https://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/MP/final/part06/node8.html)

#### 2-5-2. 仮想メモリ

- プロセスがメモリにアクセスする際に、システムに搭載されているメモリに直接アクセスさせるのではなく、仮想アドレスというアドレスを用いて間接的にアクセスさせるという機能。
    - システムに搭載されているメモリの実際のアドレスを物理アドレスと呼ぶ。
    - プロセスから物理アドレスに直接アクセスする方法は存在しない。
- 実際のメモリではなく、マルチタスク実行とオーバーサブスクリプションをサポートするように、メインメモリを抽象化したもの。
- 実質的にメインメモリが無限になる。
- ほとんどのOSでは、仮想メモリを実メモリにマッピングするのはオンデマンドで、つまりメモリに初めて書き込みをするときだけ。
- **仮想アドレス空間**
    - 仮想アドレスによってアクセス可能な範囲。各プロセスとカーネルが持つ、メモリのコンテキスト。

#### 2-5-3. ページング

- **ページング**
    - 仮想メモリ空間が物理メモリより大きい場合でも、メモリを効率的に管理するための仕組み。
    - 仮想メモリと物理メモリは、固定サイズのブロック（**ページ**）に分割される。
    - **ページテーブル** によって、仮想メモリのページが物理メモリのページにマッピングされる。
- **スワップ**
    - 物理メモリが不足したときに、補助記憶装置として使用されるディスク（HDDやSSD）上の領域のこと。
    - 仮想メモリの一部として機能し、より多くのメモリを利用できるようにする。
- **スワップイン**
    - 必要に応じて、スワップ領域に移動されたデータやプログラムを再びRAMに戻すこと。
- **スワップアウト**
    - RAMが不足したときに、使用頻度が低いデータやプログラムの一部をスワップ領域に移動し、物理メモリを解放すること。
- **ページフォールト**
    - プロセスが仮想メモリ上のページにアクセスし、そのページが物理メモリに存在しない場合に発生するイベント。
    - ページフォールトが発生すると、OSはディスクから該当ページを物理メモリに読み込み（ **ページイン** ）、プロセスが正常に実行できるようにする。

#### 2-5-4. カーネル空間とユーザー空間

- **カーネル空間**
    - カーネルだけがアクセスできる仮想メモリアドレス空間のこと。
- **ユーザー空間**
    - プロセスだけがアクセスできる仮想メモリアドレス空間のこと。
        - プロセスとは、OSの抽象で、プログラムを実行するための環境。
        - すべてのウェブサーバーはユーザープロセスとして動作する。
        - ユーザープロセスからのアクセス用にカーネルが割り当てるメインメモリ。
        - ※ ユーザープロセスとは、プロセスを具体的に表した用語。
    - ユーザーモードで実行される。
    - **Linuxシステムでは、実際の処理のほとんどがユーザー空間で行われている**。
    - カーネルの視点からはすべてのプロセスは基本的に同じだが、各プロセスは異なる処理を行う。

### 2-6. デバイスドライバ

- **物理デバイスの管理とI/Oを行うためのカーネルソフトウェア**。
- カーネルは、（ディスクのような）ハードウェアとプロセス間のインターフェイスの役割を果たし、ハードウェアを操作する。
- デバイスドライバは、ハードウェアデバイスを開発しているベンダーから提供されることが多い。
- デバイスドライバはカーネルの一部で、ユーザプロセスに対して統一されたインタフェースを提供する。
- カーネルは、物理デバイスにはカーネルモードでアクセスする。
    - 不適切なアクセス（ユーザープロセスが電源を切るように要求するなど）は、コンピュータをクラッシュできてしまうため。

## 3. ユーザープロセス（ユーザー空間）

### 3-1. ユーザーランド

- OSのうち、カーネル以外の要素のこと。
- ユーザーレベルプログラム、ライブラリ（/usr/bin、/usr/libなど）。

### 3-2. ユーザー

- ユーザーは、プロセスを実行しファイルを所有できる存在。
- 多くの場合、関連づけられたユーザー名（username）を持っており、カーネルはユーザーをユーザーIDという数値の識別子によって識別する。
- 主にパーミッションと境界をサポートするために存在している。
    - すべてのユーザー空間のプロセスには、所有者（owner）ユーザーが存在し、プロセスはその所有者として実行されている。
    - ユーザーは自分のプロセスを終了させたり、動作を変更させたりできるが、他のユーザーのプロセスには干渉できない。
    - ユーザーはファイルを所有し、他のユーザーとファイルを共有するかどうかを選べる。
#### 3-2-1. rootユーザー
- 最も重要なユーザー。
- rootユーザーは、他のユーザーのプロセスを修了したりへ脳したりでき、ローカルシステム上のあらゆるファイルへアクセスできるので、スーパーユーザー（superuser）として知られている。
- rootでの操作は危険を伴い、強力だが、カーネルモードではなく、ユーザーモードで動作する。

#### 3-2-2. グループ（group）

- ユーザーの集まりのこと。
- グループの主な目的は、ユーザーがグループの他のメンバーにファイルアクセスを共有できるようにすること。


引用: 
- [詳解 システム・パフォーマンス 第2版](https://www.oreilly.co.jp/books/9784814400072/)
- [スーパーユーザーなら知っておくべきLINUXシステムの仕組み 第1章 Linuxシステムの全体像](https://tatsu-zine.com/books/superuser-linux-system)
    - [書評 - スーパーユーザーなら知っておくべきLinuxシステムの仕組み](https://hiroga.hatenablog.com/entry/2022/04/03/202313)
- [［試して理解］Linuxのしくみ ―実験と図解で学ぶOS、仮想マシン、コンテナの基礎知識【増補改訂版】](https://gihyo.jp/book/2022/978-4-297-13148-7)
- [コンピュータの構成と設計　MIPS Edition　第6版　上](https://bookplus.nikkei.com/atcl/catalog/21/S70090/)
- [コンピュータの構成と設計　MIPS Edition　第6版　下](https://bookplus.nikkei.com/atcl/catalog/21/S70100/)
- [【CPUの基本】図解でよくわかる「マルチコア / スレッド」の意味 - ちもろぐ](https://chimolog.co/bto-cpu-core-thread/)
- [コンピュータの基本構成と動作原理〜知識編 - Qiita](https://qiita.com/zacky1972/items/ef4486e8a6d95edb68fd)
- [CPUからOSまで自作してみた話（ハードウェア編） - Qiita](https://qiita.com/yusuke_blog1026/items/71a2119e3fdb4a52bda9)
- [【CPUとは】クロック、コア、スレッド、キャッシュメモリを分かりやすく解説【PC初心者】 - YouTube](https://www.youtube.com/watch?v=CtqgR_351KM)
- [とってもやさしいGo言語入門 - Zenn](https://zenn.dev/ak/articles/1fb628d82ed79b)