2016-09-14 9 views
2

コンテキスト:Unix-ish環境では、プロセスの開始時間を変更するためにPIDラップアラウンドが保証されていますか?

私はPID wraparoundに対する証拠である方法で、UNIXプロセスを識別/追跡における学問的興味があります。 PIDによるプロセスの追跡を開始するには、システム上でプロセスを確定する必要があります。

したがって、PIDを取得し、そのPIDに対してシステム全体の一意のIDを決定した後にのみ返す関数get_identityが必要です。この関数は、POSIX準拠のシステムのすべてまたはほとんどで動作するはずです。

私が知っているプロセステーブルの不変な値は、PIDと開始時刻だけです。ただし、次のシナリオは、問題を提起:

  1. ユーザーは、それが存在する場合は、秒-以来-エポックpidので開始時間を読み込み、そして、できれば、独自のタプルを返しget_identity(pid)
  2. get_identityを呼び出します[pid, starttime](これはPythonライブラリが優れたものだと考えているので、かなり堅牢でなければなりません)。
  3. の1秒以内に、PIDラップアラウンドがシステムで発生し、pidがリサイクルされます。
  4. [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 the kvm subsystem or via sysctlsです。他のUnix上で。 。 。知るか?私は、このデータを収集するために複数のプラットフォーム固有の実装を開発する必要があります。
+1

あなたは、率直に言って、ホースしていると思います。プロセスが毎秒2^16以上の速度で生成されている場合、私はPID +開始時の衝突が可能であることを絶対に期待します。カーネルの人々は、PID +開始時刻を一意にするために開始時刻の値を歪ませる具体的な理由を持っていなければならず、開始時刻の精度がより重要であると感じられました。 – zwol

+2

@zwolあなたの全体的な結論には同意できませんが、PIDラップアラウンドは毎秒2^16より頻繁に発生する可能性があることに注意してください。確かに、それはまだ起こりそうもないですが、すでに2^16-4の長時間実行されているプロセスを持っているシステムを考えてください。その後、PIDフォワードは4つのフォーク毎に発生します... – twalberg

+0

@twalbergああ、私に。 – zwol

答えて

1

一般的に、PIDとprocテーブル管理の割り当てはどの標準でも定義されていないので、ポータブルな方法では何もできません。

プラットフォーム固有の実装を複数開発して、プロセスごとに一意のIDを判断するための十分な情報を収集する必要があります。

一方、プロセスが開始されても実行されている間にリアルタイムでこの情報を必要としない場合は、ほとんどのunix-yシステムでは単にプロセスアカウンティングを有効にし、システムによって実行されたすべてのプロセスの完全な記録が含まれます。プロセスアカウンティングファイルは標準化されていませんが、レコードフォーマットを定義するヘッダーファイルが存在するため、さまざまな方法でアカウンティングファイルを処理および要約できるツールが各タイプのシステムに存在する必要があります。

-2

PIDラップアラウンドが保証されています。あなたは同じpidで2つのプロセスを得ることはありません。

+0

downvoteについてのコメントは、異なるUNIXがそれを保証するために異なる方法を持っていることと、効率を保証するだけでなく、保証する必要があるという事実によって、評価されるでしょう。 –

+0

これは、PIDラップアラウンドがプロセスの開始時に及ぼす影響についての質問には答えません。 PIDの一意性は問題ではありません。 *プロセス*の一意性は、私が識別するのをより良くしようとしていることです。 –

関連する問題