[Java Advanced] 同時実行性についての深い理解

序文:

        オペレーティング システムのマルチタスクについては、複数のプログラムを同時に実行できる機能として単純に理解できます。生活と同じように、音楽を聴きながらコンピューターを使って QQ を操作できます。

        ここでは、まず並列処理と同時実行の概念を理解する必要があります。並列処理とは異なり、同時実行は CPU の数によって制限されません。オペレーティング システムは各プロセスに CPUタイム スライスを与え、ユーザーに並列処理の感覚を与えます。

        したがって、いわゆるマルチスレッドは本質的にプロセス バージョンのマルチタスク状態であり、プログラムは複数のタスクを同時に実行します。スレッドは「軽量プロセス」と考えることができます。「軽量」という概念により、スレッドの作成または破棄のオーバーヘッドがプロセスのオーバーヘッドよりもはるかに小さいことが想像できます。

        実際にこの 2 つの違いについて話します。主なものはデータ共有であり、各プロセスには独自の独立変数があり、スレッドはデータを共有します。データの共有は危険に聞こえるかもしれませんが、実際は危険なのです。では、スレッドはどのようにデータを共有するのでしょうか、つまり、スレッドはどのように通信すべきでしょうか? 資源をめぐる競争をどう解決するか? これには、同期やロック機構などの関連知識が含まれますが、これらの部分はインタビューで最も難しい部分でもあるため、ここでは説明しません。

        スレッドと言えば、実際、マルチスレッドは実用的なアプリケーションでも非常に役立ちます。たとえば、QQ で同時にさまざまな人々とチャットでき、Web サーバーは複数の同時リクエストを同時に処理することもできます。

同時実行性

        並行性が登場する前は、ほとんどの人が実際に逐次プログラミングを使用していました。つまり、プログラムのすべてのタスクは常に 1 つのステップしか実行できませんでした。では、なぜ同時プログラミングが必要なのでしょうか? マルチタスクを処理できる前述の同時実行性に加えて、実際には、単一プロセッサーで実行されるパフォーマンスを向上させる非常に重要な理由がもう 1 つあります。

        実はこの文は上記の方々の意向に少し反しているように思えますが、なぜそう言えるのでしょうか?シングルスレッド、マルチスレッドの同時実行と比較して、コンテキスト切り替えのオーバーヘッドが増加しないことを想像してください。このように、同時実行によってプロセッサのパフォーマンス向上が低下するのではないか?

        実際、タスクがブロックされると、そのタスクがシングルスレッドの場合、後続のタスクが実行できなくなり、最終的にプログラム全体がクラッシュする可能性があると想像した方がよいでしょう。実際、パフォーマンスの観点から見ると、タスクのブロックがない場合、単一のスレッドで同時実行を使用する意味がありません。加工機。

        実際、同時実行性を実現する最も直接的な方法は、オペレーティング システム レベルでプロセスを使用することですが、前述したように、各プロセスは独自の独立したアドレス空間を持ち、2 つのプロセスは相互に干渉しません。対照的に、Java のような同時実行システムはメモリや I/O などのリソースを共有するため、マルチスレッドを作成する際の難しさは、異なるスレッド駆動タスク間のリソースの使用を調整して、これらのタスクが同時に複数のリソースによってアクセスされないようにすることにあります。同時。

        Java のスレッド メカニズムはプリエンプティブです。つまり、スケジューリング メカニズムが定期的にスレッドを中断しコンテキストを別のスレッドに切り替えることで、各スレッドにタイム スライスが提供され、各スレッドに適切な数

おすすめ

転載: blog.csdn.net/weixin_43918614/article/details/123629494