地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【Linux】task_struct構造体について

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等でも使われているカーネルの機能の一つである。