はじめに
「プロセスとは?」「ファイルのアクセスとは?」「パーミッションって何?」**といった疑問にぶつかることが割と多いため、この記事では、それらを一度に理解できるように整理する。
プロセスとは?
プロセス = 実行中のプログラム
例:
-
php
(Webアプリの実行) -
nginx
(Webサーバー) -
git
(バージョン管理) -
/bin/bash
(シェル)
これらはすべてプロセスとしてOS上で動作している存在。
プロセスは独立したメモリ空間を持っている
それぞれのプロセスは独立したメモリ空間を持っている。
他のプロセスのメモリには直接アクセスできない。
でも、同じファイルシステムにはアクセスできる
[phpプロセス] → /var/www/myproject/index.php
[gitプロセス] → /var/www/myproject/.git
理由は、
カーネルが1つのファイルシステムを管理していて、すべてのプロセスがそのカーネルに仲介してもらってアクセスしている。
だから、全プロセスが同じファイルシステム空間を共有できる。
ファイル操作とファイルディスクリプタの仕組み
- プロセスがファイルを開くと、**ファイルディスクリプタテーブル(FDテーブル)**に登録される
- そのテーブルはOSのオープンファイルテーブルを参照している
つまり:
どのプロセスが、どのファイルを使っているかは、オープンファイルテーブルで管理されている
プロセス間通信(IPC)が必要になる場面
プロセスがファイルではなく、データそのものを直接やりとりしたいときはどうする?
→ そこで登場するのが パイプ + fork()
int pipefd[2];
pipe(pipefd);
pid_t pid = fork();
こうすることで、親子プロセスが同じオープンファイルテーブルのエントリを共有し、pipeを通じてデータ通信が可能になる。
プロセスとデータ(ファイルや通信)を分けて考える
- プロセス = 実行されるもの(動く主体)
- データ = ファイルやメモリ、パイプでやりとりされるもの(扱う対象)
この2つを混ぜずに、切り分けて考えることがシステムを理解するカギだと最近感じる。
ファイルのパーミッションの話
-rw-r--r-- 1 ubuntu ubuntu index.php
ファイルには:
- 所有者(user)
- グループ(group)
- その他のユーザー(others)
という3つの区分があり、それぞれに読み取り(r)、書き込み(w)、実行(x) のパーミッションが設定される。
所有者とグループはどう決まる?
- そのファイルを作成したユーザーが所有者になる
- 作成時に所属していたグループがグループになる
所有者以外がアクセスするには?
→ パーミッションで許可されていないとアクセスできない