回答:
これは、dpkg
特定の問題ではありません(私の編集のタイトルが示唆したとおり)。むしろ、これは(私が知っている)すべてのパッケージマネージャーが行うことです。そして正当な理由で。しかし、それがなぜ混乱を招くのか理解しています。
パッケージマネージャーは、インストール済みパッケージの情報を追跡するためにデータベースに依存しています。複数のユーザーが同時にデータベースに書き込もうとすると、データを破壊する可能性が高くなります(これは実際にシステムに悪影響を及ぼします)。
その結果、多くの(すべての?)パッケージマネージャーはデータベースが書き込まれていることを通知するためにロックファイルに依存しているため、別のクライアントがそうすることを許可すべきではありません。
インテリジェントパッケージマネージャーは、リクエストが読み取り専用で、データベースをロックする必要がない場合を判断できる場合があることに注意してください。結果として; 一部のアクションは、他のアクションが実行されない場所で同時に実行できる可能性があります。
ロックファイルは、複数のインスタンスの並列実行を防ぐために使用されます。
これがパッケージマネージャーにとってなぜ重要なのですか?
パッケージマネージャは、全体像から見て、ハードディスクに複雑な変更を加えるプログラムです。
変更は1つのステップ(「アトミック」)では実行できないため、複数のステップがあります。手順の多くは、前の手順の結果に依存しています。
そのため、パッケージマネージャーは、各ステップを実行する前にハードディスクを分析するか、一度だけ分析して、適用される変更を追跡する必要があります。最初のオプションは非常に遅いです。2番目は、他のインスタンスが変更を加えないことを要求します。
表示される可能性のある他の多くの問題があります。
並行して動作するパッケージマネージャーを実装することは不可能ではありませんが、それだけの価値があるほど複雑です。のように、あなたはどれほど複雑であるか想像することはできません。本当に。
dkpg
(およびrpm
他のほとんどの従来のパッケージマネージャー)は、パッケージをグローバルスペースにインストールすることで機能します。これは、パッケージが互いに競合する可能性があることを意味します(たとえばA
、B
両方がインストールされるため、同時にインストールすることはできません/usr/lib/libfoo.so
)。パッケージマネージャーは、システムを一貫した状態に保つために、このような競合を検出し、そのようなインストール要求を拒否する必要があります。パッケージマネージャーの複数のインスタンスを同時に実行すると、非常に複雑になり、エラーが発生しやすくなります。
競合のないパッケージマネージャー(例:http : //0install.net)では、複数のパッケージを並行してインストールできます。A/libfoo.so
また、ロックファイルは必要ありません(B/libfoo.so
別のディレクトリに移動します)。
1システムに同時に存在し、利用可能であるという意味で、および同時にダウンロードされ、システムに追加されるという意味で、並列処理。