Procfs

procfsは、Process Filesystem の略で、Unix系システムにある擬似ファイルシステム。主にプロセスに関するカーネル情報にアクセスする手段を提供する。procfs は実際のファイルシステムではないので、ディスクスペースを消費しないし、メモリもごくわずかしか消費しない。

通常、procfs は立ち上げ時に /proc ディレクトリにマウントされる。Solaris、BSD、Linux、AIX、QNXなどでサポートされ、特にLinuxではプロセス関連以外のデータにも拡張されている(AIXのprocfsはLinuxベース)。procfs は機能をカーネルモードからユーザーモードに移すことに重要な役割を果たしている。例えば GNUプロジェクト版の psコマンドは全てのデータを procfs から得ており、特別なシステムコールを使用しない。

歴史

Tom J. Killian は Version 8 Unix 上に /proc を実装し、1984年6月、USENIXで Processes as Files という題の論文を発表した。これは、プロセスのトレースを行う ptrace システムコールを置き換える目的で設計された。

Roger Faulkner と Ron Gomes は V8 /proc を SVR4 に移植し、1991年1月、USENIX で The Process File System and Process Model in UNIX System V という論文を発表した。この procfs は psコマンドの実装に使える程度の機能を有するようになったが、procfs内のファイルには read()、write()、ioctl() といったシステムコールしか使えなかった。

Plan 9で実装された procfs は V8 のものよりずっと進化していた。V8 の procfs では、あるプロセスに関する機能はひとつのファイルへの操作で実現されていた。Plan 9 は、それを複数のファイルに機能毎に分割し、procfs をよりファイルシステムらしくした。

4.4BSDで実装された procfs はプロセス毎のサブディレクトリがあり、プロセスのメモリ、レジスタ、現在ステータスにアクセスすることができた。Solaris 2.6 の procfs もプロセス毎のディレクトリがあり、制御用の ctl ファイルが用意され、トレースやプロセス毎の操作ができるようになっていた。

Linux

Linux では、procfs は動作中プロセスに関する情報を /proc/PID というディレクトリで提供し、以下のような情報を提供する。

特定のプロセスのPIDは、pgrep、pidof、ps といったユーティリティで得られる。

$ ls -l /proc/$(pgrep -n python)/fd        # 最近起動された `python' というプロセスの全ファイル識別子を一覧表示
samtala 0
lrwx------ 1 baldur baldur 64 2011-03-18 12:31 0 -> /dev/pts/3
lrwx------ 1 baldur baldur 64 2011-03-18 12:31 1 -> /dev/pts/3
lrwx------ 1 baldur baldur 64 2011-03-18 12:31 2 -> /dev/pts/3
$ readlink /proc/$(pgrep -n python)/exe    # 最近起動された `python' というプロセスの実行ファイルのパス名を表示
/usr/bin/python3.1

procfs では個々のプロセスとは直接関係しないシステム情報も提供するが、Linuxカーネル 2.6 では大部分が別の擬似ファイルシステム sysfs に分離移動されている(/sys にマウントされる)。

procfs を使用する Linux 上のユーティリティは procps パッケージに収められており、利用するには procfs が /proc にマウントされていなければならない。

*BSD

脚注

  1. ↑ proc(4) manual page on Version 8 Unix
  2. ↑ 3.2.2. /proc/buddyinfo CentOS 5.2
  3. ↑ “Understanding Linux /proc/cpuinfo”. 2012年7月12日閲覧。
  4. ↑ Why is procfs deprecated in favor of procstat?

参考文献

外部リンク