[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

Linux

2019-07-28 02:48:46

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

  • 第1章 コンピュータシステムの概要
  • 第2章 ユーザモードで実現する機能
  • 第3章 プロセス管理
  • 第4章 プロセススケジューラ
  • 第5章 メモリ管理
  • 第6章 記憶階層
  • 第7章 ファイルシステム
  • 第8章 ストレージデバイス

第1章 コンピュータシステムの概要

p.2

  • コンピューターシステムが動作するときのハードウェア上の基本動作

    • 入力デバイスまたはネットワークアダプタを介してコンピューターに何らかの処理を依頼
    • メモリ上に存在するを命令を呼び出し、CPU上で実行、結果をメモリ上のデータを保持領域に書き込む
    • 目盛上のデータをHDDやSDDなどのストレージデバイスに書き込む、またはネットワークを介して別のコンピューターに転送する、あるいは出力デバイスを介して人間に見せる
    • 最初に戻る
  • プログラムの種類

    • アプリケーション
    • ミドルウェア
      • アプrケーションに共通した処理をくくりだして、アプリケーションの実行を補助する
    • OS
      • ハードウェアを直接操作し、アプリケーションやミドルウェアの実行に必須な機能を提供

p.4

  • プログラムは互いに連携して動作する
    • OSは各種プログラムをプロセスという単位で実行
    • 各プログラムは1つまたは複数のプロセスから構成
  • Linuxの外部デバイスの操作
    • OSがないと外部デバイスを独自に操作するコードを書く必要がある
    • デバイスドライバ
      • デバイスを操作する処理をまとめたもの
      • プロセスからデバイスには、デバイスドライバを介してアクセスするようにする
      • あるプロセスが、バグによってこのルールを破った場合、複数プロセスが同時にデバイス操作をするという状況が発生してしまう
        • CPUのカーネルモード、ユーザーモードがプロセスのデバイスへのアクセスをコントロールする
        • プロセスはユーザーモードで動作
        • デバイスドライバはカーネルモードで動作
        • カーネルモードで動作するものの例
          • プロセス管理システム、プロセススケジューラ、メモリ管理システムなど

第2章 ユーザモードで実現する機能

  • N/A

第3章 プロセス管理

2段階のプロセス生成

p.28

  • Linuxにおけるプロセス生成の2つの目的
    • 同じプログラムの処理を複数のプロセスに分割して処理する
    • 異なるプログラムを生成する

第4章 プロセススケジューラ

p.40

  • プロセススケジューラ
    • 複数プロセスを同時に動作させる(させているようにみせかける)ための機能
      • 1つのCPU上で同時に処理するプロセスは1つだけ
      • 複数プロセスが実行可能な場合、個々のプロセスを適当な長さの時間ごとにCPU上で順番に処理する

コンテキストスイッチ

p51

  • 論理CPU上で動作するプロセスが切り替わること
    • タイムスライスのタイミングで発生

プロセスの状態

p.53

  • ps ax | wc -l
    • システム上のプロセスの数
  • プロセスの状態(主な状態だけリストアップ)
    • 実行状態
      • 現在論理CPUを使っている
    • 実行待ち状態
      • CPU時間が割り当てられるのを待っている
    • スリープ状態
      • 何らかのイベント発生を待っている。
      • イベント発生まではCPU時間を消費しない
    • ゾンビ状態
      • プロセスが終了した後に親プロセスが終了状態を受け取るの待っている

スループットとレイテンシ

p.60

  • スループット
    • 単位時間当たりの総仕事量
    • 高いほど良い
  • レイテンシ
    • それぞれの処理の開始から終了までの経過時間
    • 短いほど良い

p.64

  • スケジューラがラウンドロビン方式のとき
    • 論理CPUの能力を使い切っている場合(=すべての論理CPUがアイドル状態にならない状況)では、プロセスを増やしてもスループットは変化しない
    • プロセスを増やすほどレイテンシは悪化する
    • 各プロセスのレイテンシは等しい

優先度の変更

p.83

  • nice()
    • プロセスの実行優先度をつけるシステムコール
    • -19~20までの間で設定できる。デフォルトは0。
      • 数字が大きいほど多くのCPU時間を得られる

第5章 メモリ管理

Out Of Memory

p.92

  • Out Of Memory
    • メモリ使用量が増え続け、メモリ不足になると適当なプロセスを選んでkillするOOM killerという機能がある

単純なメモリ割り当て

.p.95

  • カーネルがプロセスにメモリを割り当てるタイミング
    • プロセス生成時
    • プロセス生成後、追加で動的にメモリを割り当てる時
      • プロセス生成後に追加でメモリが必要になった際、メモリ獲得用のシステムコールを発行し、メモリ割り当て要求を行う
        • 問題点
          • メモリの断片化
          • 別用途のメモリにアクセスできてしまう
          • マルチプロセスの扱いが困難

仮想記憶

p.98

  • 仮想記憶
    • システムに搭載されているメモリにプロセスから直接アクセスするのではなく、仮想アドレスというアドレスを用いて間接的にアクセスさせるという方法
    • 実際のメモリは物理アドレスという
    • アドレスによってアクセス可能な範囲をアドレス空間という
    • プロセスから物理アドレスに直接アクセスする方法はない

ページテーブル

p.100

  • ページテーブル
    • 仮想アドレスから物理アドレスへの変換の際に使用するカーネルが使うメモリ内に保存されている表のこと
    • 全ページをメモリをページという単位で区切っている
      • 1のページに対応するデータをページテーブルエントリと呼ぶ
    • ページフォールト
      • プロセスが物理メモリがマップされていない仮想アドレス空間上のページにアクセスした際に発生するハードーウェアの割り込み

ファイルマップ

p.118

  • ファイルマップ
    • ファイルの領域を仮想アドレス空間上にメモリマップする機能

デマンドページング

p.122

  • プロセス生成時、プロセスにメモリを割り当てる通常の手順
    • カーネルが必要な領域を物理メモリ上に獲得する
    • カーネルがページテーブルを設定し、仮想アドレス空間を物理アドレス空間に紐付ける
  • 上記の手順ではメモリを無駄に消費するという問題点がある
    • 獲得したメモリの中には、メモリを獲得してからしばらくの間、あるいはプロセス終了まで使わない領域が存在してしまうため
  • デマンドページング
    • プロセスの仮想アドレス空間内の各ページに対応する物理メモリを、当該ページに最初にアクセスした時に割り当てる

コピーオンライト

p.135

  • コピーオンライト
    • 物理メモリをfork()システムコールの発行時ではなく、その後の書き込み時にコピーする方式

スワップ

p.141

  • スワップ
    • ストレージデバイスの一部を一時的にメモリ代わりにする仕組み
    • OOMの救済処置
    • ストレージデバイスへのアクセス速度はもメモリへのアクセス速度に比べて数桁遅い

ヒュージページ

p.153

  • ヒュージページ
    • プロセスの仮想メモリ使用サイズが増大すると、当該プロセスのページテーブルに使用する物理メモリ量も増大していく
      • メモリ使用量の増大だけでなく、fork()システムコールも遅くなるという問題もある
      • fork()システムコールは、プロセスが使用している物理メモリコピーせずにコピーオンライトによるメモリ割り当てを行うが、ページテーブルは親プロセスと同じサイズのものを新規作成する
        • ヒュージページを使うと、仮想メモリを沢山使うプロセスについて、ページテーブルに必要なメモリ量が減るようになる

第6章 記憶階層

  • 記憶装置の階層構造
    • レジスタ
      • キャッシュメモリ
        • メモリ
          • ストレージデバイス

参照の局所性

p.169

  • 時間的局所性
    • ある時点でアクセスされたデータは、近い将来に再びアクセスされる可能性が高い。典型的にはループ処理の中のコード領域。
  • 空間的局所性
    • ある時点であるデータにアクセスされると、それに近い場所のデータにアクセスする可能性が高い。典型的には配列要素の全走査。

第7章 ファイルシステム

容量制限

p.199

  • クォータ
    • ファイルシステムの容量を制限する機能
    • 種類
      • ユーザクォータ
        • ファイル所有者となるユーザーごとに容量制限
      • ディレクトリクォータ
        • 特定のディレクトリごとに容量制限
      • サブボリュームクォータ
        • ファイルシステム内のサブボリュームごとに容量制限

ジャーナリング

p.203

  • ジャーナリング
    • ジャーナル領域に更新履歴を残すこと
      • ユーザーが認識できないメタデータ
    • ファイルシステム更新手順
        1. 更新に必要な処理一覧をジャーナル領域に書き出す
        1. ジャーナル領域の内容をもとにファイルシステムの内容を更新

キャラクタデバイス

p.213

  • キャラクタデバイス
    • 読み出し・書き出しはできるが、シークができない
      • ex.端末(bashなどのシェルを通じてコマンドを実行する画面)、キーボード、マウス

ブロックデバイス

p.214

  • ブロックデバイス
    • 読み書き以外にランダムアクセスが可能
      • ex. HDDやSDDなど

メモリベースのファイルシステム

p.217

  • tmpfs
    • ストレージデバイスの代わりにメモリ上に作成するファイルシステム

ネットワークファイシステム

p.218

  • ネットワークを通じてリモートホスト上のファイルにアクセスするファイルシステム

仮想ファイルシステム

p.219

  • procfs
    • システムに存在するプロセス情報を得るためのファイルシステム
  • sysfs
    • procfsにカーネルのプロセス以外の情報が置かれるようになったので、それらを配置する場所として用意された
  • cgroupfs
    • 1つまたは複数のプロセスから成るグループに対してリソース使用量の制限をかけるcgroup機能のファイルシステム

第8章 ストレージデバイス

HDDの性能特性

p.232

  • プログラムで考慮すると良いこと
    • ファイル内のデータを連続する、あるいは近い領域に配置する
    • 連続する領域へのアクセスは複数回に分けずにひとまとめにする
    • ファイルにはできるだけ大きなサイズでシーケンシャルアクセスする

About the author

Image

bmf san @bmf_san
A web developer in Japan.