挑戦する
CRIUは、プロセスの状態をディスクに保存し、後でこのマシンまたは他のマシンで解決できるユーティリティです。 回復サブタスクの1つは、プロセスツリーを復元するための一連のアクションを見つけることです。 入力には、各プロセスのパラメーターのセット(一意の識別子(PID)、親へのリンク(PPID)、およびセッション識別子(SID))が含まれます。
Linuxがライブで処理するルール
- Linuxプロセス階層にはツリー構造があります。
- 各プロセスには一意のPID(プロセスID)があります
- 各プロセスにはSID(セッションID)があります。 親から継承され、いつでもプロセスはリーダーになることを決定できます。その後、そのSIDはPIDと等しくなります。
- プロセスが停止すると、そのすべての子プロセスは最も近い先祖である子リーパーに移動し、プロセス自体は「ゾンビ」状態になります。
- 親は娘のゾンビを拾う(破壊する)ことができます。
- ルートプロセスは常に子リーパーであり、残りはオプションです(この機能はいつでもオンとオフを切り替えることができます)。
- プロセスは、(娘になるために)下に生まれるだけでなく、(兄弟になるために)横に生まれることもできます。
チーム:
- fork(pid)-指定されたPIDでプロセスを作成し、現在のプロセスの子になります
- clone(pid、CLONE_PARENT)-指定されたPIDでプロセスが作成され、現在の兄弟になります
- prctl(PR_SET_CHILD_SUBREAPER、フラグ)-flag = trueの場合、現在のプロセスは子刈り機になり、flag = falseの場合、現在のプロセスは子刈り取りを拒否する
- setsid()-現在のプロセスをセッションリーダーにします。
- exit()-プロセスは終了しますが、消えませんが、「ゾンビ」状態になります。 彼の子孫はすべて、最も近い子刈り取り機に移動します。
- wait(pid)-指定されたPIDのゾンビを選択(破棄)します。 この操作は、ゾンビの親のみが実行できます。
サンプル入力
入力データには、各プロセスの行が含まれています。 各行には、pid、ppid(親のpid)、sid、ゾンビフラグの3つの数値が含まれます。値は0(プロセスが停止している場合(「ゾンビ」)、1-プロセスが実行中の場合)です。
1 0 1 1
6 1 6 1
8 6 7 1
15 6 12 1
10 1 10 1
11 10 7 1
13 10 12 1
サンプル出力
1:フォーク(6)
6:フォーク(7)
7:setsid()
7:クローン(8、CLONE_PARENT)
7:終了()
6:待機()
8:フォーク(9)
9:フォーク(10)
10:フォーク(11)
10:フォーク(12)
12:setsid()
12:クローン(13、CLONE_PARENT)
12:クローン(14、CLONE_PARENT)
12:終了()
10:待機(12)
14:フォーク(15)
6:prctl(PR_SET_CHILD_SUBREAPER、1)
14:終了()
10:待機(14)
6:prctl(PR_SET_CHILD_SUBREAPER、0)
9:終了()
8:待機(9)
6:setsid()
10:setsid()