なぜ並行プログラミングを知る必要があるのですか?


17

並行プログラミングは私にとって非常に困難です。基本的なスライドを見るだけでも、私にとっては難しいようです。それはとても抽象的なようです。

コンカレントプログラミングの概念をよく知ることの利点は何ですか?通常のシーケンシャルプログラミングで役立ちますか?私たちのプログラムがどのように機能するかを理解することに満足があることを知っていますが、他に何がありますか?


3
私はそれは一種の話題ではないと思いますが、すべての個人的なものを編集すると(すべての人にとって並行プログラミングは非常に困難ですが)概念の具体的な技術的メリットを求めると話題になります。
ヤニス

1
その利点は明らかです。並行プログラミングが提供する作業の分割により利用可能なすべてのパフォーマンス強化を活用できるプログラムを作成できます。誰にとっても簡単ではありません。今日、それは非常に挑戦的な概念です。
リグ

3
何かを学ぶ動機付けを手伝うことはできませんが、なぜ並行性について知っておくべきかについての一般的な質問は話題になっています。

2
並行プログラミングを知っています。あなたが提供するスライドは理解するのに役に立たないことがわかります。代わりに、食事の哲学者とのパーティーに行きます。
-mouviciel

1
リラックスしてください、それでも最大の困難を見つける:informit.com/articles/article.aspx?p
=

回答:


32

迅速で簡単な動機は次のとおりです。最小で最も脆弱なシステム以外のコードを作成する場合、並行コードを作成します。

クラウド用に書きたいですか?クラウド内のコンピューティングインスタンスは小規模です。大きなものを手に入れるのではなく、小さなものをたくさん手に入れます。突然、小さなWebアプリは同時実行アプリになります。適切に設計すれば、顧客を獲得するにつれて、より多くのサーバーに放り込むことができます。それ以外の場合は、インスタンスの負荷平均がペグされている間に学習する必要があります。

OK、デスクトップアプリを作成しますか?すべてにデュアルまたはそれ以上のコアCPUが搭載されています。最も安価なマシンを除きます。そして、最も安価なマシンを持っている人は、おそらくあなたの高価なソフトウェアに分岐することはないでしょうか?

たぶん、あなたはモバイル開発をしたいですか?ねえ、iPhone 4SにはデュアルコアCPUが搭載されています。残りはそれほど遅れることはありません。

ビデオゲーム?Xbox 360はマルチCPUシステムであり、SonyのPS3は本質的にマルチコアシステムです。

小さな単純な問題に取り組んでいない限り、並行プログラミングから逃れることはできません。

2016年の更新:35ドルのRaspberry Piの現在のイテレーションは、携帯電話向けのチップ上のクアッドコアシステムを中心に構築されています。AIの劇的な進歩は、並列計算エンジンとしてのハイエンドグラフィックスカードの利用可能性に一部起因しています。


1
私は原則として同意しますが、それEverything has a dual-or-more-core-CPU. Except the least expensive machines.は少し馬鹿げているように思えます。多くの人がシングルコアマシンを持っています。それは安かったからではなく、持っているものに満足しており、アップグレードする必要がないと思っているからです。つまり、どこかの努力を無駄にしないようにします(これはどちらか、プリエンプティブマルチタスクを想定することができ、同様にシングルコアのシステム上のスケジューラを助ける同時性の観点から考えて、言っている、ほとんどの開発者はと接触するすべてのマルチタスク環境について最近)。
CVn

1
わかりました-それは少し誇張ですが、新しいハードウェアはマルチコアである傾向があります。私はそれがなくなるとは思わない。ですから、もしあなたが現在学生であり、将来的に専門的に行う仕事について考えているのであれば、マルチコアシステムで作業していると想定しても安全です。
ObscureRobot

私はあなたが私の意見に反対するのと同じくらいあなたの答えに反対するのだろうか;)

1
私が読んだ方法では、@ acidzombie24という2つの言葉に似たカーネルがあります。開発者はどこにでもあるので、並行性に対処する方法を知っているべきだと言っています。あなたは...並行システムの落とし穴を回避する限り、並行プログラミングに
精通

並行性について知ることは非常に有用であることに同意しますが、「小さな、単純な問題」のためにしか並行性から逃れることができないことに同意しません。既存のフレームワークやアプリケーションサーバーに依存している場合など、自明ではないシステムでも、同時実行性を大幅に回避できます。インフラストラクチャが整ったら、私はジュニア開発者になり、Webアプリ用の新しいサービスを作成し、並行性や並列性についてほとんど何も知らないことができます。
アンドレスF.

21

1970年から2002年までのプロセッサは、約18か月ごとに速度が2倍になりました。プログラマーとしては、待つだけでプログラムが高速になります。問題は、2002年頃にルールが変更されたことです。現在、彼らは大きな高速プロセッサを作っているのではなく、小さな低速プロセッサを作っているが、グループに分けている。現在作業しているコンピューターには4つのコアがあり、最大8つのコア(およびコアごとに4つのスレッド)を持つチップが存在します。すぐに、より多くのコアを備えたチップを使用できるようになります。

したがって、まったく並行していないプログラムを作成すると、1つのコアまたはスレッドを使用していることがわかりますが、CPUの残りの部分はそこに座って何もしていません。16コアがある場合、1がプログラムを実行し、残りの15がそこに座っています!

並行性の問題は、非決定的であるということです。つまり、異なるスレッドがどのような順序で処理するかを正確に知らないということです。従来、プログラマーはロックなどを使用してこれを解決しようとしました。これは、につながるたLOT痛みの。複数のスレッドが自由にアクセスできる可変状態の形式を持つことは、多くの場合、痛みとハイスネバグの公式です!

最近の傾向は、可変状態を厳密に制御する関数型言語に移行することです。関数型言語が並行性を処理する基本的な方法は2つあります。1つは、メッセージパッシングを使用する方法です。これは、Erlangが最もよく示しています。Erlangでは、一般的にプロセス間で共有状態はありません。彼らは、メモリを共有するのではなく、私の通過メッセージによって通信します。私たちは今それをやっているので、これはあなたにとって理にかなっているはずです。私は、あなたが私の脳からそれを覚えているのではなく、あなたにメッセージを送ることによって、この情報をあなたに送っています!ほとんどのロックのバグを渡すメッセージに切り替えることで、単純に消えます。さらに、メッセージは、1つのノード内だけでなくネットワークを介して渡すことができます。

もう1つの方法はSTMです。これはSoftware Transcriptional Memoryの略です。これはclojureとHaskell(およびその他)に存在します。STMではメモリは共有されますが、変更はトランザクションを介してのみ行えます。データベースの人々が1970年代にこのようなことすべてを考え出したように、私たちがそれを正しくすることを保証することは非常に簡単です。

実際、私は少し簡略化して、ClojureとHaskellの両方がメッセージの受け渡しを行うことができ、ErlangがSTMを行うことができます。

免責事項私はErlangを使用したプログラミングWebサービスの著者であり、今後数週間でアーリーリリースでリリースされます。


1
@Zachary K:関数型言語とネイティブ言語を組み合わせて、計算集中型の部分をネイティブ言語で実装する一方で、関数型言語で記述されたサーバーで使用できるインターフェイスを提供するアプローチはありますか?
rwong

100%確実ではありませんが、ClojureとScalaの両方がJVM上に存在するため、ここから始めます。Akkaフレームワークをご覧ください。私はそれを使用していませんが、しばらく前にAkkaについての話を聞いたことがあり、かなりクールなようです。今のところ、ErlangとJavascriptを使っていますが、これはほとんどの時間を占めています。
ザカリーK

1
@rwong:.NETを使用すると、プログラマーはアプリの一部にC#またはその他の非機能言語を使用し、その他の機能にF#を使用できます。
ケビン-モニカの復活2013年

5

並行性は、あなたがそれを最も期待しないときにあなたの顔に吹き飛ばすことができるので...


4
+10000000000000000000000000000000000000000

8
並行性は、新しいスペインの審問[/ python] [次のように:誰も期待しない...]
ObscureRobot

1
@ObscureRobotが2倍面白い!(説明は必要ありませんでした:-p)
-Fortran

4

並行プログラミングの最初のルールは「難しい」です。並行プログラミングの2番目のルールは、「It。Is。Difficult」です。

真面目な話ですが、並行プログラミングには、マルチスレッドとマルチプロセッシングという2つの一般的なアプローチがあります。マルチプロセッシングは、プロセスの複数のインスタンスを実行してタスクを達成することを意味するだけなので、理解するのが最も簡単です。Unixベースのシステムではfork / joinを呼び出すことで非常に簡単ですが、Windowsシステムではそれほど簡単ではありません。

マルチスレッドは、おそらく同時実行性について話すときにほとんどの人が考える方法です。アプリケーション内で複数のスレッドを開始することは難しくありませんが、悪魔は詳細にあります。スレッド間でデータ共有を調整する必要があり(通常はロックを使用)、デッドロックまたは無効な状態のデータにつながる可能性があります。また、セマフォ、条件変数などの概念を使用してスレッド間で通信する方法を理解する必要があります。

このすべての利点は、一度理解すれば、基礎となるハードウェアをより効果的に利用できることです。最近では、プロセッサが複数のコアを持つことはほぼ標準です。並行プログラミングを利用することで、これらのコアを機能させることができ、アプリケーションの速度が向上します。

欠点は、アプリケーションをさまざまなスレッドで実行できる小さな部分に分割する方法について考え始める必要があることです。これは思ったよりずっと難しいです。また、実行の順序があまり決定的ではないため、高度な同時実行ソリューションではユニットテストが困難になります。

最近では、ほとんどの言語は、生活を少し楽にするために、ほとんどの並行プリミティブを抽象化して出荷されています。たとえば、.NET 4にはTask Parallel Libraryが付属しているため、作業が少し楽になります。Javaランドには、同時実行パッケージがあります。


1
できるだけ速くロックから逃げると、桁違いに大きくなります。STMまたはアクターを使用すると、あなたが言ったことはすべてなくなります。もちろん、JavaからScala、Erlang、Clojureなどの言語に移行することを意味します。(私もこれは良いことだと主張しますが)
ザカリーK

@Zachary:それは良いことかもしれませんが、たとえば.NETショップで働いている場合、実用的ではありません。STMは将来オプションになる可能性がありますが、現時点では主流言語のオプションではありません。
ショーン

Clojureは.netで実行され、F#があります。C#にはSTM実装もあると思います。
ザカリーK

3

私は最近、マルチプロセッシングが私を救った非常に興味深い仕事をしました。基本的に、いくつかの別個のサーバーに大量の要求を行い、非常に少量のデータを処理しなければなりませんでしたが、多くの要求を処理しました。

PHPを使用して、昔ながらの方法で作業を行い、数時間の作業の後に得た最高の時間は、特定のテスト(多くの要求+ネットワーク遅延+非同期なし)の実行に最大120秒かかりました。

しかし、それは私が必要とするものに比べて十分ではなく、PHPのマルチプロセッシングで悲惨な失敗をした後、Pythonに切り替えました。

数時間後、20秒以内に実行されたPythonマルチプロセッシングスクリプトを実行しましたが、タイムアウトを少しいじってからはいじめました。使用されるスレッドのうち、最大10秒になりました

これは、単一の100行のPythonスクリプトを除き、PHPで100%記述されたWebサイト用です。そして、すべてが完璧に機能しています。

私の結論は、たとえそれが日々あなたに役立たないとしても、少なくとも並行プログラミングの基本を知っていることが大いに役立つ状況に出会うかもしれないということです。

幸運を祈ります!

PS:私はPHPをバッシングしようとはしていませんが、PHPは手元の仕事に適したツールではありませんでした。

PS2:新しい技術や物事の新しい方法を知ることは、まったく新しい可能性の世界への扉を開くことができます。


2

何らかのWeb開発を行う場合、少なくともほとんどの言語で並行性が重要になります。たとえば、Web開発にはspringを使用し、新しいリクエストはそれぞれ独自のスレッドとして受信します。したがって、変数の状態を変更できる要求が共有オブジェクトにアクセスすることになった場合、並行性は非常に重要な要素であり、考慮する必要があります。そうでない場合は、予測できない方法でデータを編集でき、データが破損する可能性があります。並行性に関する最後のすべての詳細を知ることは重要ではありませんが、デスクトップアプリで作業している場合は、複数のスレッドを実行する必要がない限り、Webアプリのプログラミングをよりよく理解するために一度に学習することが重要です。


-1

オペレーティングシステムの洞察を学びます。スケジューラとデバイスドライバーのソースコードを読むと役立ちます。彼らは間違いなく同時です。


2
プログラマーの並行性は、通常、複数のインスタンスで実行される独自のプログラムを対象としています。

OSカーネルのスケジューリングアルゴリズムの詳細を知らないと、とにかく独自の並行プログラムを記述できないことを強調しようとしました。
jj1bdx

何故なの?ロックメカニズムを正しく使用する場合、OSスケジューリングアルゴリズムは重要ではありません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.