tkd2017の勉強ブログ

日々の勉強をアウトプットするブログ

[ふつりな 2版] 第3章 Linuxを描き出す3つの概念

www.high-novice.com

  • P.38〜P.52

3.1 ファイルシステム

ファイル という用語の定義は難しい。あまり意識されずに次のような意味で使われていることが多い。

  1. 広義のファイル
  2. 狭義のファイル(regular file)
  3. ストリーム

ストリームについては後述。

lsコマンドの結果表示されるものを、本書では 広義のファイル と呼ぶ。

[vagrant@localhost ~]$ ls -l /etc/ | tail -20
drwxr-xr-x.  6 root root     4096 1128 23:47 sysconfig
-rw-r--r--.  1 root root      449  83 23:57 sysctl.conf
drwxr-xr-x.  2 root root       28 1028 11:04 sysctl.d
lrwxrwxrwx.  1 root root       14 1028 11:03 system-release -> centos-release
-rw-r--r--.  1 root root       23  830 15:53 system-release-cpe
drwxr-xr-x.  4 root root      151 1028 11:04 systemd
-rw-------.  1 tss  tss      7046  83 17:16 tcsd.conf
drwxr-xr-x.  2 root root        6  96 22:08 terminfo
drwxr-xr-x.  2 root root        6 1020 03:07 tmpfiles.d
drwxr-xr-x.  2 root root       70 1028 11:04 tuned
drwxr-xr-x.  3 root root       54 1127 15:23 udev
-rw-r--r--.  1 root root       37 1028 11:06 vconsole.conf
-rw-r--r--.  1 root root     1982  82 00:45 vimrc
-rw-r--r--.  1 root root     1982  82 00:45 virc
drwxr-xr-x.  2 root root       33 1028 11:04 wpa_supplicant
drwxr-xr-x.  4 root root       38 1028 11:04 xdg
drwxr-xr-x.  2 root root        6 115  2016 xinetd.d
drwxr-xr-x.  6 root root      100 1028 11:03 yum
-rw-r--r--.  1 root root      970  85 19:13 yum.conf
drwxr-xr-x.  2 root root      229 123 11:04 yum.repos.d

広義のファイルを網羅的に挙げてみる。

  • 普通のファイル(regular file)
    • 内容がそのまま記録されているファイル
    • 内容がテキストかバイナリかは区別しない
    • regular file または normal file と呼ばれる(日本語訳はともに「普通のファイル」?)
  • ディレクトリ(directory)
    • 他の(広義の)ファイルを複数入れることができるファイル
    • UNIXでは伝統的にディレクトリのデータも単なるバイト列として読むことができたが、Linuxはそれを禁止している
  • シンボリックリンク(symbolic link)
    • 他のファイルの名前を格納したファイル
    • ソフトリンク(soft link)とも呼ばれる
    • シンボリックリンクにアクセスすると、カーネルはそれを「シンボリックリンクが指す先のファイル」へのアクセスへ置き換える
  • デバイスファイル(device file)
    • デバイス(ハードウェア)をファイルとして表現したもの
    • たとえば、/dev/sdaは1台目のSSDまたはHDDを表している(APIを使ってファイルにアクセスするとデバイスを操作できる)
    • 表現するデバイスによってブロックデバイスとキャラクタデバイスがある
      • 好きなときに、好きなところにアクセスできるのがブロックデバイス(キャラクタデバイスはその逆)
      • SSDとHDDは代表的なブロックデバイス、プリンタやモデムはキャラクタデバイス
    • 対応するデバイスがないデバイスファイルも存在する
      • /dev/null
      • /dev/zero
      • /dev/random
      • など
  • 名前付きパイプ
    • プロセス間通信に使うファイル
    • FIFOとも呼ばれる
  • UNIX ドメインソケット(UNIX domain socket)
    • プロセス間通信に使うファイル
    • 名前付きパイプはバイトストリームにしか使えないが、こちらはバイトストリームだけでなくデータグラムとしても利用できる

ファイルにはデータ本体のほかにも、さまざまな付帯情報が付属している。

  • ファイルの種類
  • パーミッション
  • サイズ
  • 更新時刻

広義のファイルについてのまとめ。

  • 何らかのデータを保持する
    • どのファイルも、とにかく何らかのデータを保持している
  • 付帯情報が付いている
    • 更新時刻などの付帯情報が付いている
  • 名前(パス)で指定できる
    • 名前で呼べることはファイルにおいて欠かせない特性

ファイルを扱うためには、ファイルシステムというOSの機能が必要。SSDやHDDの場合、まずディスクをパーティションという区画に区切る。そして、それぞれの上にファイルシステムを用意してマウントすることで、一本の巨大なディレクトリツリーができあがる。

mountコマンドを実行することで、パーティション(に対応するデバイスファイル)とマウント先、ファイルシステムを確認できる。

[vagrant@localhost ~]$ mount -t xfs
/dev/mapper/VolGroup00-LogVol00 on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
/dev/sda2 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

ファイルシステム - Wikipedia

またprocfsやtmpfs、devfsといったデバイスの存在しないファイルシステムもあり、これらは 擬似ファイルシステム と呼ばれる。

3.2 プロセス

「プロセス」とは簡単にいえば 動作中のプログラム のこと。「プログラム」とはコンピュータに対する命令のことで、ソースコードをコンパイル・リンクすることで生成される、実行ファイルに格納されていることが一般的。プログラムを動かすと、動かすたびに新しいプロセスができる。

用語がわからなくなってきたのでいったん整理。

  • プログラム
    • コンピュータに対する命令を記述したもの
    • 実行ファイルのことをそう呼ぶことも多い
  • ソースコード
    • プログラミング言語で記述されたプログラム(テキストないしはテキストファイル)
  • ソースファイル
    • ソースコードと同意。文字列ではなくファイルであることを強調したいときに使う?
  • オプジェクトファイル
    • コンパイラがソースコードを処理した結果生成される、バイナリコードを含む中間的なデータ表現のファイル
  • 実行ファイル
    • コンピュータがプログラムとして解釈して実行できるファイル
    • リンカがオブジェクトファイルと他のライブラリなどを結合して生成する

第1章で作ったhello.cはソースコード(ないしはソースファイル)、gccでコンパイルした結果生成されたhelloはプログラム(ないしは実行ファイル)。

www.high-novice.com

helloプログラムを動かせば、そのたびプロセスが作られることになる。

1つのプログラムから何個でもプロセスが作れるということは、単なるhelloではプロセスが区別できない。そこで一意な プロセスID(PID) が振られている。

[vagrant@localhost ~]$ ps -ef | head
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 1202 ?      00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root         2     0  0 1202 ?      00:00:00 [kthreadd]
root         3     2  0 1202 ?      00:00:00 [ksoftirqd/0]
root         5     2  0 1202 ?      00:00:00 [kworker/0:0H]
root         6     2  0 1202 ?      00:00:00 [kworker/u2:0]
root         7     2  0 1202 ?      00:00:00 [migration/0]
root         8     2  0 1202 ?      00:00:00 [rcu_bh]
root         9     2  0 1202 ?      00:00:00 [rcu_sched]
root        10     2  0 1202 ?      00:00:00 [watchdog/0]

プロセスIDはコメントで明示的に使用することもあれば、Ctrl + Cなどで暗黙的に使用されることもある。Ctrl + Cを押すと、カーネルが該当プロセスに対して 割り込みシグナル(SIGINT) を送り、それを受け取ったプロセスが自発的に終了する。

シグナルの種類については次のサイトなどを参考に。

シグナル (ソフトウェア) - Wikipedia

3.3 ストリーム

英語でstreamといえば、「何かの細かい流れ」のこと。本書ではバイトの流れ、つまり バイトストリーム のこと。

本章で用いている「ストリーム」という用語は本書独自で、他のLinuxの書籍には本書でいうところの「ストリーム」は明確には出てこないので注意。本書でいう「ストリーム」は、他書では単に ファイルopen file と呼ばれている。

Wikipedia)からストリームの説明文を引用。

ストリーム(stream)とはデータを「流れるもの」として捉え、流れ込んでくるデータを入力、流れ出ていくデータを出力として扱う抽象データ型である。ファイルの入出力を扱うもの、メモリバッファの入出力を扱うもの、ネットワーク通信を扱うものなどさまざまなものがある。特にファイルの入出力には、標準ストリームと呼ばれる特別なストリームが用意されていることもある。

さらに他の書籍では、ストリームという語を次の2つの意味で使うことがある。

  • FILE型の値
  • STREAMSカーネルモジュール

本書では例外なく、「ストリーム」といったら「バイトストリーム」のこと。

  • ファイルにつながったストリーム
    • プロセスがファイルの内容にアクセスしたいときは、システムコールを使って、カーネルにファイルとつながるストリームを作ってもらう
    • そして、システムコールを使ってストリームを操作し、ファイルの中身を取り出す
  • デバイスにつながったストリーム
    • バイト列の流れとして考えられるものであれば、どんなものでもストリームにつなぐことができる
    • たとえば、SSDやHDD、キーボードのようなハードウェアもストリームとして扱える
    • デバイスファイルは、このようなストリームを得るための とっかかり として実は存在している
  • パイプ
    • バイト列が出入りする(読み書きできる)ものであるなら、なんでもストリーム
    • そのため、プロセスとプロセスをつなぐストリームも作れる
    • これは パイプ と呼ばれるもので、Linuxでは|という記号を使って簡単に扱える
  • ネットワーク通信
    • バイト列の書き込み元/読み込み先が別のコンピュータでも何の問題もない
    • これは ネットワーク通信 と呼ばれる
  • プロセス間通信
    • パイプやネットワーク通信のように、プロセスどうしがストリームを通じてデータをやりとりしたり意思の疎通をはかることを、一般に プロセス間通信 と呼ぶ
    • ただし、ストリームだけがプロセス間通信機構というわけではなく、たとえばPOSIX IPCと呼ばれるストリームを使わない機構もある

3.4 3大重要概念のまとめ

  • ファイルシステム
    • データに名前をつけて保存する場所
  • プロセス
    • 何らかの活動をする主体
  • ストリーム
    • プロセスがファイルシステムや他のプロセスとデータをやりとりする手段

わずかこれだけのしくみで、Linux OSの構造はおおむね語ることができてしまう。

本日はここまで。