並行プログラミングは私にとって非常に困難です。基本的なスライドを見るだけでも、私にとっては難しいようです。それはとても抽象的なようです。
コンカレントプログラミングの概念をよく知ることの利点は何ですか?通常のシーケンシャルプログラミングで役立ちますか?私たちのプログラムがどのように機能するかを理解することに満足があることを知っていますが、他に何がありますか?
並行プログラミングは私にとって非常に困難です。基本的なスライドを見るだけでも、私にとっては難しいようです。それはとても抽象的なようです。
コンカレントプログラミングの概念をよく知ることの利点は何ですか?通常のシーケンシャルプログラミングで役立ちますか?私たちのプログラムがどのように機能するかを理解することに満足があることを知っていますが、他に何がありますか?
回答:
迅速で簡単な動機は次のとおりです。最小で最も脆弱なシステム以外のコードを作成する場合は、並行コードを作成します。
クラウド用に書きたいですか?クラウド内のコンピューティングインスタンスは小規模です。大きなものを手に入れるのではなく、小さなものをたくさん手に入れます。突然、小さなWebアプリは同時実行アプリになります。適切に設計すれば、顧客を獲得するにつれて、より多くのサーバーに放り込むことができます。それ以外の場合は、インスタンスの負荷平均がペグされている間に学習する必要があります。
OK、デスクトップアプリを作成しますか?すべてにデュアルまたはそれ以上のコアCPUが搭載されています。最も安価なマシンを除きます。そして、最も安価なマシンを持っている人は、おそらくあなたの高価なソフトウェアに分岐することはないでしょうか?
たぶん、あなたはモバイル開発をしたいですか?ねえ、iPhone 4SにはデュアルコアCPUが搭載されています。残りはそれほど遅れることはありません。
ビデオゲーム?Xbox 360はマルチCPUシステムであり、SonyのPS3は本質的にマルチコアシステムです。
小さな単純な問題に取り組んでいない限り、並行プログラミングから逃れることはできません。
2016年の更新:35ドルのRaspberry Piの現在のイテレーションは、携帯電話向けのチップ上のクアッドコアシステムを中心に構築されています。AIの劇的な進歩は、並列計算エンジンとしてのハイエンドグラフィックスカードの利用可能性に一部起因しています。
Everything has a dual-or-more-core-CPU. Except the least expensive machines.
は少し馬鹿げているように思えます。多くの人がシングルコアマシンを持っています。それは安かったからではなく、持っているものに満足しており、アップグレードする必要がないと思っているからです。つまり、どこかの努力を無駄にしないようにします(これはどちらか、プリエンプティブマルチタスクを想定することができ、同様にシングルコアのシステム上のスケジューラを助ける同時性の観点から考えて、言っている、ほとんどの開発者はと接触するすべてのマルチタスク環境について最近)。
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サービスの著者であり、今後数週間でアーリーリリースでリリースされます。
並行性は、あなたがそれを最も期待しないときにあなたの顔に吹き飛ばすことができるので...
並行プログラミングの最初のルールは「難しい」です。並行プログラミングの2番目のルールは、「It。Is。Difficult」です。
真面目な話ですが、並行プログラミングには、マルチスレッドとマルチプロセッシングという2つの一般的なアプローチがあります。マルチプロセッシングは、プロセスの複数のインスタンスを実行してタスクを達成することを意味するだけなので、理解するのが最も簡単です。Unixベースのシステムではfork / joinを呼び出すことで非常に簡単ですが、Windowsシステムではそれほど簡単ではありません。
マルチスレッドは、おそらく同時実行性について話すときにほとんどの人が考える方法です。アプリケーション内で複数のスレッドを開始することは難しくありませんが、悪魔は詳細にあります。スレッド間でデータ共有を調整する必要があり(通常はロックを使用)、デッドロックまたは無効な状態のデータにつながる可能性があります。また、セマフォ、条件変数などの概念を使用してスレッド間で通信する方法を理解する必要があります。
このすべての利点は、一度理解すれば、基礎となるハードウェアをより効果的に利用できることです。最近では、プロセッサが複数のコアを持つことはほぼ標準です。並行プログラミングを利用することで、これらのコアを機能させることができ、アプリケーションの速度が向上します。
欠点は、アプリケーションをさまざまなスレッドで実行できる小さな部分に分割する方法について考え始める必要があることです。これは思ったよりずっと難しいです。また、実行の順序があまり決定的ではないため、高度な同時実行ソリューションではユニットテストが困難になります。
最近では、ほとんどの言語は、生活を少し楽にするために、ほとんどの並行プリミティブを抽象化して出荷されています。たとえば、.NET 4にはTask Parallel Libraryが付属しているため、作業が少し楽になります。Javaランドには、同時実行パッケージがあります。
私は最近、マルチプロセッシングが私を救った非常に興味深い仕事をしました。基本的に、いくつかの別個のサーバーに大量の要求を行い、非常に少量のデータを処理しなければなりませんでしたが、多くの要求を処理しました。
PHPを使用して、昔ながらの方法で作業を行い、数時間の作業の後に得た最高の時間は、特定のテスト(多くの要求+ネットワーク遅延+非同期なし)の実行に最大120秒かかりました。
しかし、それは私が必要とするものに比べて十分ではなく、PHPのマルチプロセッシングで悲惨な失敗をした後、Pythonに切り替えました。
数時間後、20秒以内に実行されたPythonマルチプロセッシングスクリプトを実行しましたが、タイムアウトを少しいじってからはいじめました。使用されるスレッドのうち、最大10秒になりました。
これは、単一の100行のPythonスクリプトを除き、PHPで100%記述されたWebサイト用です。そして、すべてが完璧に機能しています。
私の結論は、たとえそれが日々あなたに役立たないとしても、少なくとも並行プログラミングの基本を知っていることが大いに役立つ状況に出会うかもしれないということです。
幸運を祈ります!
PS:私はPHPをバッシングしようとはしていませんが、PHPは手元の仕事に適したツールではありませんでした。
PS2:新しい技術や物事の新しい方法を知ることは、まったく新しい可能性の世界への扉を開くことができます。
何らかのWeb開発を行う場合、少なくともほとんどの言語で並行性が重要になります。たとえば、Web開発にはspringを使用し、新しいリクエストはそれぞれ独自のスレッドとして受信します。したがって、変数の状態を変更できる要求が共有オブジェクトにアクセスすることになった場合、並行性は非常に重要な要素であり、考慮する必要があります。そうでない場合は、予測できない方法でデータを編集でき、データが破損する可能性があります。並行性に関する最後のすべての詳細を知ることは重要ではありませんが、デスクトップアプリで作業している場合は、複数のスレッドを実行する必要がない限り、Webアプリのプログラミングをよりよく理解するために一度に学習することが重要です。