Linux のプロセスは、task_struct 構造体というデータ構造で表現されている。その話についてのLT的資料です。
プロセスとは
- 実行中のプログラムのイメージ。機械語のプログラムがメモリに読み込ま れて「プロセッサ(CPU)」の実行の対象になったもの。
- 資源割当の単位 資源として、CPU時間、メモリ、アドレス空間、レジスタ、開いたファイル等を持つ CPU資源の割当ては、スケジューリングという。
- ファイル等のアクセス制御に用いる権限(利用者の識別子、利用者のグルー プの識別子)を持つ
- プロセスの操作は、生成、終了、強制終了、プログラムの実行、一時停止、 再開、デバッグなど。
- 3つの基本的な状態を持つ ** Ready/Running/Blocked (waiting)
task_struct構造体とは
プロセスが使用しているメモリーやファイル,ソケット,シグナルなどの情報を管理する構造体 定義はinclude/linux/sched.hで定義されている。
1023: struct task_struct { 1024: volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ ... 1099: int exit_state; 1100: int exit_code, exit_signal; ... 1131: struct task_struct __rcu *real_parent; /* real parent process */ 1132: struct task_struct __rcu *parent; /* recipient of SIGCHLD, wait4() reports */ ... 1136: struct list_head children; /* list of my children */ 1137: struct list_head sibling; /* linkage in my parent's children list */ 1138: struct task_struct *group_leader; /* threadgroup leader */ ... 1149: struct pid_link pids[PIDTYPE_MAX]; ... 1182: const struct cred __rcu *cred; /* effective (overridable) subjective task ... 1184: char comm[TASK_COMM_LEN]; /* executable name excluding path 1185: - access with [gs]et_task_comm (which lock 1186: it with task_lock()) 1187: - initialized normally by setup_new_exec */ ... 1414: };
Linux のプロセス識別子は、名前空間(namespace) ごとに、分割されてい る。 同一のnamespceでは同じPIDは存在しない。namespeceについてはdocker等でも使われているカーネルの機能の一つである。