コンテキスト:Unix-ish環境では、プロセスの開始時間を変更するためにPIDラップアラウンドが保証されていますか?
私はPID wraparoundに対する証拠である方法で、UNIXプロセスを識別/追跡における学問的興味があります。 PIDによるプロセスの追跡を開始するには、システム上でプロセスを確定する必要があります。
したがって、PIDを取得し、そのPIDに対してシステム全体の一意のIDを決定した後にのみ返す関数get_identity
が必要です。この関数は、POSIX準拠のシステムのすべてまたはほとんどで動作するはずです。
私が知っているプロセステーブルの不変な値は、PIDと開始時刻だけです。ただし、次のシナリオは、問題を提起:
- ユーザーは、それが存在する場合は、秒-以来-エポック
pid
ので開始時間を読み込み、そして、できれば、独自のタプルを返しget_identity(pid)
get_identity
を呼び出します[pid, starttime]
(これはPythonライブラリが優れたものだと考えているので、かなり堅牢でなければなりません)。- の1秒以内に、PIDラップアラウンドがシステムで発生し、
pid
がリサイクルされます。 [pid, starttime]
タプルは、get_identity
の呼び出し時に存在していたものとは異なるプロセスを参照します。
それは非常にPIDの回り込みがが特定された第二内で発生し、選択されたPIDを再利用するためのそうであるが、不可能ありません。 。 。右?
質問:
- PIDの開始時間が同じPID値のラップアラウンドに起因する再使用の間に異なるものになりますUNIX/POSIX準拠のシステム上の保証はありますか?
- もしそうでなければ、ラップアラウンドの起こりやすいシステム上でプロセスを一意に特定するにはどうすればよいですか? 私が試した何
:
- 私ができるだけで
sleep
第二のターゲット・プロセスを調べた後。 start-time-in-secondsがsleep
の後に同じ場合、それは私が見始めたプロセスと同じものか、PIDが別のものにラップされていますが、システムはその違いを知ることができません。開始時間が変更された場合は、エラーを返すか、最初からやり直すことができます。しかし、これには私の識別機能が戻ってくる前に1秒間待つ必要がありますが、これは理想的ではありません。 times()
は秒単位に変換できるクロックティックの値を返します。プロセスの開始時間がtimes
と同じクロックに基づいていると仮定し、すべてのUNIXが同じ丸めロジックを使用してclock ticks -> fractional seconds -> whole seconds
から変換すると仮定すると、理論的にはこの情報を使用してsleep
上記の回避策は、次の「プロセステーブルによる完全な第2の境界」までの時間までです。しかし、最悪の場合のスリープ時間は1秒近くになるため、理想的ではありません。- Linuxでは、
/proc/$pid/stat
ファイルから開始時刻をjiffies(または古いLinuxesの場合はCPUティック)にすることができます。その情報で、私のプログラムは1つのjiffy(つまり?)を待つことができ、starttimeをもう一度チェックし、同じであれば同一性を判断することができます。これは私の問題を正しく解決します(1つのjiffy +オーバーヘッドは十分に速いランタイムです)。他のUNIXプラットフォームには/proc
がない可能性があります。 BSDでは、その情報はavailable via thekvm
subsystem or viasysctl
sです。他のUnix上で。 。 。知るか?私は、このデータを収集するために複数のプラットフォーム固有の実装を開発する必要があります。
あなたは、率直に言って、ホースしていると思います。プロセスが毎秒2^16以上の速度で生成されている場合、私はPID +開始時の衝突が可能であることを絶対に期待します。カーネルの人々は、PID +開始時刻を一意にするために開始時刻の値を歪ませる具体的な理由を持っていなければならず、開始時刻の精度がより重要であると感じられました。 – zwol
@zwolあなたの全体的な結論には同意できませんが、PIDラップアラウンドは毎秒2^16より頻繁に発生する可能性があることに注意してください。確かに、それはまだ起こりそうもないですが、すでに2^16-4の長時間実行されているプロセスを持っているシステムを考えてください。その後、PIDフォワードは4つのフォーク毎に発生します... – twalberg
@twalbergああ、私に。 – zwol