並行処理の抽象化はUNIXプロセスをエミュレートしていますか?


8

さて、私は今日これについて考えていました、そして私はそれについて完全に主観的でバイアスのある意見を求めるようになりました。逆説的に、これにもかかわらず、私はそれが炎戦の飼料でもないと思います。完全に文明化された会話の余地はあると思います-Vim対Emacsはほとんどありません。

私は多くの並行処理の抽象化、特にスレッドの上に構築されたものを使用しました。メッセージパッシング、デフォルトでは不変、デフォルトではスレッドローカル、その他のいずれでも、それらの間には大きな傾向があります。

トレンドは、データ共有を暗黙的ではなく明示的にすることで、スレッドの考え方を逆転させているというものです。つまり、特に指定しない限り、すべてのデータは共有されません。これは、Javaなどの言語で見られる従来のスレッド化とは逆です。(ただし、Javaは独自の高レベルの同時実行抽象化をサポートしていることを知っています。)たとえば、メッセージを明示的に渡します。どの変数がスレッドローカルであるかを明示的に指定します。変更可能な変数を明示的に指定します。これらは、いくつかの言語で見られるほんの一例です。

この並行性の簡単なスタイルは現代のコンセプトだと思いました。間違えた。最近fork()やpipe()のようなUNIXのおもちゃをいじり始めましたが、UNIXの開始以来、簡単で明示的な並行処理メカニズムが存在していることを知ってショックを受けました。

70年代のC + UNIXが同時実行性を多くの最新のトレンディなスレッド化メカニズムよりもはるかに簡単にすることを実現することには、少し奇妙な点があります。

だから、ここで私が疑問に思っているのは...これらの現代のスレッド抽象化は、すべての明示性とデフォルトで共有されない特性を備えたスレッド上でUNIXスタイルのプロセスを単にエミュレートしようとしているのでしょうか?STMのようないくつかのメカニズムがDBスタイルのトランザクションのようなものを提供することは確かですが、それは本当に並行性のための現代的で革新的なソリューションですが、ほとんどの場合、UNIXプログラマーが昔行っていたことを行う新しい方法のように見えます。

言うまでもなく、私はUNIXのファンではなく、想像力を伸ばしているわけでもありません。プロセスは多くのプラットフォームで初期化するためにスレッドよりもはるかに遅いことを認識していますが、これは概念的に述べています。


悪い質問ではありませんが、その問題は、「[...]会話の余地があると思います」です。

私はそれを主観的/意見があるとしてすぐに閉じられなかったのでそれを追加しました:)私はこれについて人々の考えを聞くのは本当に興味があります...

良い質問。プログラミング言語のタグを省略することで、質問に対するより多くの聴衆を逃していると思います(なぜそうするのか理解しています)。パフォーマンス、テスト、ベンチマークなどのタグを含めると、追加のフィードバックが得られる場合があります。私の知らない他のタグがあなたの応答を広げるかもしれません(誰ですか?)。幸運を!
シェルター、2011

あなたの質問は明らかにunixドメインに限定されないので、私はunixタグを削除することをお勧めします。多くの人は、無視タグに特定のオペレーティングシステムを持っています(OS-Xの私のように)。
Bernd Elkemann、2011

同時実行の抽象化が「エミュレート」している可能性が高いと思います(より正確には、順次プロセスの理論の伝達
gnat

回答:


1

よい観察です。明示的に共有する傾向が確実にあります(関数型言語でも慣習でも)。遅くているプロセスについてのコメントは、私は少し適応になります。彼らはより多くのある重い彼らは生のパフォーマンスで実行して遅くはありませんが、すべてのことを意味し、スイッチそれらの間が長いスレッドの切り替えよりも多くかかります。他の並行性の形式がいくつかあることをすでに認識し、STMを認識しています。(明示的な共有とSTMに加えて)スレッドプーリングへの傾向も高まっていることを付け加えておきます。 (並列タスク;事前に開始されたワーカースレッドにタスクを割り当て、それらをリサイクルする):プールされたスレッドは通常すべて1つのプロセス内にあるため、明示的に共有するためのパフォーマンスの面と奇妙な異なるアプローチへの確実な道。


私はあなたが言ったことに合わせてパフォーマンスラインを変更しました。興味深いことに、PythonではProcessPoolを使用することがあります。これは、スレッドではなくプロセスのプールであることを除けば、スレッドプールのようなものです。Windowsでもスムーズに動作するようです。それから、私はそれをあまり緊張しすぎていません。プロセスプールは、すぐにマルチスレッド化されることを地獄で望んでいないランタイムで言語で並行処理を行うための優れた方法だと思います( GIL )。

奇妙なことに、スレッドプールは1つのプロセスを使用することがよくあります。CPUコアと同じ数のプロセスにスレッドプールを分割することになると思いました。

1
@Louis:各スレッドは異なるコアで実行できます。
ninjalj 2011

@ninjalj:申し訳ありませんが、私からの脳死の一瞬です。私はまだ無意識のうちにプロセスプールについて考えていたと思います。

この回答から多くの情報が得られたので、それを承認済みとしてマークします。主観的な文脈で答えが「受け入れられた」と述べることは少し変な感じがしますが、それは正当化されると思います:)

2

XがYをエミュレートすることは、バランスを見つけることよりも問題ではないと思います。

完全に独立したプロセスにより、生活が比較的シンプルになります。それらは、複数のプロセッサの少なくともいくつかの利点を利用するプロセスのパイプラインのようなものを構築することをかなり簡単にします。ただし、明らかな欠点もいくつかあります。特に柔軟性の欠如と、かなりのオーバーヘッドです。

本質的にすべてのリソースを共有する複数の実行スレッドを持つ単一のプロセスは、本質的にそれらを逆転させます:設計の困難さや安定性の維持を犠牲にして、オーバーヘッドを減らし、柔軟性を大幅に高めます。

ほとんどの場合、何が起こっているかというと、人々は、スレッドの柔軟性と速度に近い中間的な地盤を見つけようと取り組んでいることです。少なくともある程度)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.