プロセス

proc ファイルシステム(procfs )は、 Unix 系オペレーティングシステムにおける特殊なファイルシステムです。プロセス情報やその他のシステム情報を階層的なファイル構造で提供し、従来のトレース手法やカーネルメモリへの直接アクセスよりも、カーネル内に保持されたプロセスデータに動的にアクセスするための、より便利で標準化された方法を提供します。通常、起動時に/procというマウントポイントにマッピングされます。proc ファイルシステムは、カーネル内で実行中のプロセスに関する内部データ構造へのインターフェースとして機能します。Linux ではカーネルに関する情報を取得したり、実行時に特定のカーネルパラメータを変更したりするためにも使用できます(sysctl)。

多くのUnix系オペレーティングシステムはprocファイルシステムをサポートしており、System VSolarisIRIXTru64 UNIXBSDLinuxIBM AIX[ 1 ] QNXベル研究所のPlan 9などが含まれます。OpenBSDは2015年5月にリリースされたバージョン5.7でサポートを終了しました。HP -UX [ 1 ]macOSには存在しません。[ 2 ]

Linuxカーネルはこれをプロセスに関連しないデータに拡張します。

procファイルシステムは、カーネル空間ユーザー空間間の通信手段を提供します。例えば、プロセスレポートユーティリティpsのGNU版は、特別なシステムコールを使用せずに、procファイルシステムを使用してデータを取得します。

歴史

UNIX 第8版

Tom J. KillianはUNIX第8版(V8)版の/procを実装しました。彼は1984年6月にUSENIX「Processes as Files(プロセスとしてのファイル)」と題した論文を発表しました。procfsの設計は、プロセストレースに使用されるptraceシステムコールの置き換えを目的としていました。詳細な説明はproc(4)のマニュアルページに記載されています。

SVR3

オリジナルのAT&T System V Release 3(SVR3)オペレーティングシステム(AT&T社内では1986年、一般向けには1987年に提供開始)には/procファイルシステムは搭載されていませんでしたが、その後の増分バージョンでは搭載されました。SVR3には、現在一般的に使用されているサブディレクトリではなく、プロセスを表すファイルのみが含まれていました。

SVR4

Roger FaulknerRon GomesはV8の/procをSVR4に移植し、1991年1月にUSENIXで「UNIX System Vにおけるプロセスファイルシステムとプロセスモデル」という論文を発表しました。このタイプのprocfsはpsの作成をサポートしていましたが、ファイルにはread()write()ioctl ()関数でしかアクセスできませんでした。1995年から1996年にかけて、Roger FaulknerはSolaris 2.6用のprocfs-2インターフェースを作成し、サブディレクトリを持つ構造化された/procファイルシステムを提供しました。

プラン9

Plan 9はプロセスファイルシステムを実装しましたが、V8よりも進化していました。V8のプロセスファイルシステムはプロセスごとに1つのファイルを実装していました。Plan 9はこれらの機能を提供するために個別のファイル階層を作成し、/procをファイルシステムの実質的な一部としました。

4.4BSDとその派生

4.4BSDは/procの実装をPlan 9からクローンしました。2011年2月現在、FreeBSDではprocfsが徐々に廃止されつつあり、[ 3 ]プロセス関連情報の取得にはsysctlインターフェースが使用されるようになりました。Linuxユーザー空間プログラムとのバイナリ互換性を確保するため、FreeBSDカーネルはLinux procfsに類似したlinprocfsも提供しています。 [ 4 ]これは2015年5月にリリースされたバージョン5.7でOpenBSD から削除されました。これは「常に競合状態が発生し、現在は使用されていない」ためです。[ 5 ] macOSはprocfsを実装しておらず、ユーザー空間プログラムはプロセスデータの取得にsysctlインターフェースを使用する必要があります。[ 2 ]

ソラリス

Solaris の /proc は当初(1992年6月)から利用可能でした。1996年の Solaris 2.6 では、Roger Faulkner による procfs2 が導入されました。

リナックス

Linux は 1992 年 9 月のv0.97.3で初めて /proc ファイルシステムを追加し、1992 年 12 月の v0.98.6 で初めてプロセスに関連しないデータへの拡張を開始しました。

2020年現在、Linux実装には、カーネルプロセスを含む実行中の各プロセス用のディレクトリが/proc/PIDというディレクトリに含まれています(PIDはプロセス番号)。各ディレクトリには、以下の情報を含む、1つのプロセスに関する情報が含まれています。

  • /proc/PID/cmdline、プロセスを最初に開始したコマンド。
  • /proc/PID/cwd、プロセスの現在の作業ディレクトリへのシンボリックリンク。
  • /proc/PID/environ には、プロセスに影響を与える環境変数の名前と値が含まれています。
  • /proc/PID/exe 、元の実行可能ファイルへのシンボリックリンク(まだ存在する場合)(元の実行可能ファイルが削除または置き換えられた後も、プロセスは実行を継続する場合があります)。
  • /proc/PID/fd 、開いているファイル記述子ごとにシンボリックリンクを含むディレクトリ。
  • /proc/PID/fdinfo は、開いている各ファイル記述子の位置とフラグを記述するエントリを含むディレクトリです。
  • /proc/PID/maps 、マップされたファイルとブロック (ヒープやスタックなど)に関する情報を含むテキスト ファイル。
  • /proc/PID/mem は、プロセスの仮想メモリを表すバイナリ イメージであり、 ptraceプロセスによってのみアクセスできます。
  • /proc/PID/root は、プロセスから見たルートパスへのシンボリックリンクです。プロセスがchroot jail内で実行されている場合を除き、ほとんどのプロセスでは / へのリンクになります。
  • /proc/PID/status には、プロセスの実行状態やメモリ使用量などの基本情報が含まれています。
  • /proc/PID/task は、この (つまり親) プロセスによって開始されたすべてのタスクへのハード リンクを含むディレクトリです。

(ユーザーはpgreppidofpsなどのユーティリティを使用してPID を取得できます。

$ ls -l /proc/ $( pgrep -n python3 ) /fd # 最近起動した `python3' プロセスのすべてのファイル記述子を一覧表示しますtotal 0 lrwx------ 1 baldur baldur 64 2020-03-18 12:31 0 -> /dev/pts/3 lrwx------ 1 baldur baldur 64 2020-03-18 12:31 1 -> /dev/pts/3 lrwx------ 1 baldur baldur 64 2020-03-18 12:31 2 -> /dev/pts/3 $ readlink /proc/ $( pgrep -n python3 ) /exe # 最近起動した `python3' プロセスの起動に使用された実行可能ファイルを一覧表示します /usr/bin/python3.8

/proc にはプロセスに関連しないシステム情報も含まれますが、2.6 カーネルではその情報の多くが/sysの下にマウントされた別の疑似ファイル システムsysfsに移動されました。

  • 電源管理のモード (ある場合) に応じて、ディレクトリ/proc/acpiまたは/proc/apmのいずれかになります。これらのディレクトリは sysfs より前に存在し、電源管理の状態に関するさまざまな情報が含まれています。
  • /proc/buddyinfoメモリの断片化を処理するbuddyアルゴリズムに関する情報。[ 6 ]
  • /proc/bus には、 PCI / USBなど、コンピュータ上の様々なバスを表すディレクトリが含まれています。これは、より詳細な情報を提供する /sys/bus 下のsysfsにほぼ置き換えられました。
  • /proc/fb、利用可能なフレームバッファのリスト
  • /proc/cmdline、カーネルに渡されるブートオプションを指定します
  • /proc/cpuinfoには、CPUのベンダー (およびユーザーが CPU を識別できる CPU ファミリ、モデル、モデル名) や速度 (CPUクロック速度)、キャッシュ サイズ、兄弟プロセッサの数、コア、CPU フラグなどのCPUに関する情報が含まれています。形式と利用可能な情報は、アーキテクチャによって大きく異なります。一部のアーキテクチャでは、/proc/cpuinfoに「 bogomips 」の値が含まれます。これは、ベンチマークのような CPU 速度の指標であると誤解されることがよくありますが、実際には (エンド ユーザーにとって) 意味のある値をまったく測定していません。これは、カーネル タイマーの調整による副作用として発生し、同じクロック速度でも CPU の種類によって大きく異なる値を生成します。
$ cat /proc/cpuinfo プロセッサ: 0ベンダーID: AuthenticAMD CPU ファミリ: 16モデル: 6モデル名: AMD Athlon II X2 270 プロセッサステッピング: 3マイクロコード: 0x10000c8 CPU MHz: 2000.000キャッシュ サイズ: 1024 KB ...プロセッサ: 1ベンダーID: AuthenticAMD CPU ファミリ: 16モデル: 6モデル名: AMD Athlon II X2 270 プロセッサステッピング: 3マイクロコード: 0x10000c8 CPU MHz: 800.000キャッシュ サイズ: 1024 KB ...

マルチコアCPUでは、/proc/cpuinfoに「兄弟」と「CPUコア」のフィールドが含まれており、以下の計算が適用されます。[ 7 ]

「兄弟」 = (CPU パッケージあたりの HT) * (CPU パッケージあたりのコア数) 「CPU コア数」 = (CPU パッケージあたりのコア数)

CPUパッケージとは、複数のコア(シングルコアは1つ、デュアルコアは2つ、クアッドコアは4つ)を持つ物理CPUを指します。これにより、ハイパースレッディングとデュアルコアを区別することができます。つまり、CPUパッケージあたりのハイパースレッド数は、兄弟コア数 / CPUコア数で計算できます。CPUパッケージの両方の値が同じ場合、ハイパースレッディングはサポートされていません。[ 8 ]例えば、兄弟コア数が2でCPUコア数が2のCPUパッケージはデュアルコアCPUですが、ハイパースレッディングはサポートされていません。

  • /proc/crypto、利用可能な暗号化モジュールのリスト
  • /proc/devices、デバイスIDでソートされたキャラクタデバイスとブロックデバイスのリストですが、/dev名の大部分も表示されます。
  • /proc/diskstats、各論理ディスクデバイスの情報(デバイス番号を含む)を提供します
  • /proc/filesystems、リスト作成時点でカーネルがサポートしているファイルシステムのリスト
  • /proc/interrupts/proc/iomem/proc/ioports、およびディレクトリ/proc/irqには、さまざまなシステムリソースを使用しているデバイス(物理または論理)に関する詳細情報が提供されます。
  • /proc/kmsgカーネルから出力されたメッセージを保持する[ 9 ]
  • /proc/loadavg には、過去数分間の現在の負荷平均に関する統計が含まれています。
  • /proc/meminfo には、カーネルがメモリを管理する方法の概要が含まれています。
  • /proc/modules は/proc内で最も重要なファイルの一つで、現在ロードされているカーネルモジュールのリストが含まれています。このファイルは依存関係に関する情報(必ずしも完全に正確とは限りません)を提供します。
  • /proc/mounts はself/mounts へのシンボリックリンクで、現在マウントされているデバイスとそのマウント ポイント (および使用されているファイル システムとマウント オプション) のリストが含まれています。
  • /proc/net/、ネットワーク スタックに関する有用な情報を含むディレクトリ。特に、既存のネットワーク接続を一覧表示する/proc/net/nf_conntrack ( iptables FORWARD を使用してネットワーク接続をリダイレクトする場合のルーティングの追跡に特に有用)
  • /proc/partitions 、カーネルが既存のパーティションとして識別したデバイス番号、サイズ、および/dev名のリスト
  • /proc/scsi は、 SCSIまたはRAIDコントローラ経由で接続されたデバイスに関する情報を提供します。
  • /proc/selfにある現在の(トラバース)プロセスへのシンボリック リンク(つまり、/proc/PID/、ここでPID は現在のプロセスのものです)。
  • /proc/slabinfo、Linuxカーネルで頻繁に使用されるオブジェクトのキャッシュの統計情報を一覧表示します。
  • /proc/swaps、アクティブなスワップパーティションのリスト、そのさまざまなサイズと優先度
  • /proc/sys配下の動的に構成可能なカーネルオプションへのアクセス。/proc/sys 配下には、カーネル領域を表すディレクトリが存在し、そこには読み取り/書き込み可能な仮想ファイルが含まれています。例えば、よく参照される仮想ファイルは /proc/sys/net/ipv4/ip_forwardです。これは、ファイアウォールやトンネルのルーティングに必要となるためです。このファイルには「1」または「0」が格納されます。1の場合、IPv4スタックはローカルホスト宛ではないパケットを転送し、0の場合は転送しません。
  • /proc/sysvipc には、メモリ共有とプロセス間通信(IPC) 情報が含まれています。
  • /proc/tty には端末に関する情報が含まれています。/proc/tty/driverはTTYドライバとその使用法のリストが含まれています[ 10 ]
  • /proc/uptime、ブートからカーネルが実行中であり、アイドルモードで費やされた時間の長さ(どちらも秒単位)
  • /proc/version には、Linuxカーネルのバージョン、ディストリビューション番号、gccのバージョン番号(カーネルの構築に使用)、および現在実行中のカーネルのバージョンに関するその他の関連情報が含まれます。
  • その他のファイルは、さまざまなハードウェア、モジュール構成、カーネルの変更に応じて異なります。

Linux で /proc を使用する基本ユーティリティは、procps ( /procプロセス) パッケージに含まれており、マウントされた/procと組み合わせてのみ機能します。

シグウィン

Cygwin は、基本的に Linux procfs と同じ procfs を実装しました。

参考文献

  1. ^ a b Nemeth, Evi; Snyder, Garth; Hein, Trent R.; Whaley, Ben (2010年7月14日). UNIX and Linux System Administration Handbook . Pearson Education. p. 136. ISBN 978-0-13-211736-4
  2. ^ a b Amit Singh (2003). 「Mac OS Xの/proc」 . Mac OS X Internals: The Book . 2012年5月4日時点のオリジナルよりアーカイブ。 2021年7月10日閲覧
  3. ^ 「なぜprocfsは非推奨となり、procstatが推奨されるのか?」freebsd.org . 2011年2月22日。
  4. ^ "linprocfs(5)" . FreeBSDマニュアルページ. FreeBSDプロジェクト. 2019年11月13日. 2021年6月12日閲覧
  5. ^ 「OpenBSD 5.6 と 5.7 の間の詳細な変更点。openbsd.org
  6. ^ “3.2.2. /proc/buddyinfo” . centos.org . 2013年9月2日時点のオリジナルよりアーカイブ2011年5月23日閲覧。
  7. ^ Baron, Jason. 「HT vs. デュアルコア」 。 2016年5月13日時点のオリジナルよりアーカイブ。 2011年6月28日閲覧
  8. ^ 「Linux /proc/cpuinfoを理解する」richweb.com . 2012年4月3日時点のオリジナルよりアーカイブ。 2015年4月21日閲覧
  9. ^ Nguyen, Binh (2004年7月30日). 「Linuxファイルシステム階層」 . Binh Nguyen. p. 63. 2016年7月18日閲覧. /proc/kmsg[:] カーネルによって出力されるメッセージ。これらはsyslogにもルーティングされます。
  10. ^ 「/procファイルシステム」 . Linuxカーネルドキュメント. 2024年8月9日閲覧

出典