CodeGym /コース /Python SELF JA /マルチスレッド

マルチスレッド

Python SELF JA
レベル 25 , レッスン 0
使用可能

1.1 登場の歴史

人類は、これまでの壮大なプロジェクトを凌駕する新しい壮大なプロジェクトを作ろうとすることがよくあります。ギザのクフ王のピラミッドは最大で、ドバイのブルジュ・ハリファは最も高く、中国の万里の長城は最も長いです。

しかし、このようなプロジェクトの作業を組織するのは非常に難しいです。もし2倍の高さの新しいピラミッドを建設するなら、8倍の石が必要になります。つまり、石切場の生産性を上げるか、もっと多くの採石場を開く必要があります。

また、8倍のエンジニアを見つける必要がありますし、エンジニアリングスクールを開設し、設計図、幾何学、書記法を標準化することも必要かもしれません。その他にも、いろいろな課題があります…

ピラミッド建設以来の数千年間で何も変わっていません。人々は依然として、より少ない時間でより多くの作業を行う方法を模索しています。そしてコンピュータが発明されたとき、この課題に取り組むようになりました。

プログラムを10倍速く実行するにはどうすればいいのでしょうか。プロセッサが既に最大速度で動作している場合、これは不可能だと思いませんか。でも、最も賢い人たちがこれを考えました。彼らは全てのプログラムの作業を分析し、成長のための3つの大きな方向性があることに気付きました。

待機時間の削減

実は、プログラムは大半の時間、待機しています。データがメモリのある場所から別の場所にコピーされたり、ハードディスクからメモリにロードされたり、サーバーからのリクエストの応答を待ったり、ユーザーからの入力を待ったりする必要があります。

これらのタスクは、中央プロセッサではなく、メモリ、ディスクなどのコントローラによって実行されます。この間、中央プロセッサは何か有用なことに従事できるはずです。そこで、1つのプロセッサで単一のコマンド実行threadではなく、複数のthreadを実行するアイデアが生まれました。

例えば、1つのthreadがユーザーの入力を待っている間に、2番目のthreadがネットワーク経由で何かをダウンロードし、3番目のthreadがデータを処理し、4番目のthreadが画面に画像を描画しています。このタスクは、後に非同期タスクやコルーチンへと進化しますが、それについては後で説明します。

プログラムの増加

プログラムが80%の時間を待機しているなら、それは問題です。しかし、すべてのプログラムを新しいアプローチに基づいて書き直すことはできません。この問題は別の方法で解決できるかもしれません。単にコンピュータで複数のプログラムを同時に実行するだけです。

この場合、オペレーティングシステムはプログラムの作業を監視し、プログラムが待機している場合は、その実行時間を他のプログラムに渡します。この切り替えは1秒に数十回行われ、ユーザーはスイッチングに気付かないので、プログラムは同時に実行されているように見えます。

プロセッサの増加

プログラムを同時に実行するのは素晴らしいことですが、プログラムが多く、待機時間が少ない場合はどうでしょうか。待機時間がないと効率的な使用ができません。例えば、10個のプログラムが何かを計算しているか、リソースを大量に消費するゲームとその他の何かが一緒に動作しています。

この問題を解決するために、プロセッサに複数のプロセッサを追加しました。混乱を避けるために、これらをコアと呼ぶようになりました。現在、私たちには複数のコア(サブプロセッサ)を持つプロセッサがあり、これによって数十のプログラムが並行して動作しています。

これは面白い!プロセッサのコア数

現在、サーバープロセッサは64から256コアを持ち、特定のケースではそれ以上のこともあります。例えば、AMD EPYC第4世代プロセッサは最大96コア、IBM POWER10はチップあたり最大240コアを持つことができます。ユーザー向けのプロセッサも大いに進化し、AMD Threadripperのような高性能デスクトップCPUは最大64コアを持ち、より一般的なモデルは通常6〜16コアです。

次はどこへ?さらに進む余地があります!まず、1つのサーバーマザーボードに複数のプロセッサ、例えば2つや4つを搭載することができます。さらに、サーバーを10〜20台一緒にサーバーラックにまとめることができます。そして、ラックをデータセンターにまとめ、そこに何千ものラックが存在します。

分散システムとマイクロサービスアーキテクチャは、現在のソフトウェア開発の一般的なプラクティスとなっています。Google、Amazon、Netflixのような大企業、そしてより小さな企業でさえ、分散システムを使用して大量のデータを処理し、高い可用性とスケーラビリティを提供しています。これらのシステムは、多くのサーバーを効率的に使用し、一体として動作することで、アプリケーションのパフォーマンスと信頼性を大いに向上させます。

1.2 メリット

マルチスレッド、つまりプログラム内でタスクを同時に実行することには、いくつかの重要な利点があります。これらの利点は、ソフトウェアのパフォーマンスと効率を大幅に向上させることができます。マルチスレッドの主な利点を見てみましょう。

1. パフォーマンスと実行速度の向上

タスクの並行実行: マルチスレッドは複数のタスクを同時に実行することができ、特に独立した操作を多数必要とするプログラムに役立ちます。これにより、タスクが並行して実行され、CPUのすべてのリソースを使用することによってプログラムの実行を加速することができます。

マルチコアプロセッサの使用: 現代のプロセッサは複数のコアを持ち、マルチスレッドにより、それぞれのコアにタスクを分配し、並行して実行することでその力を最大限に引き出すことができます。

2. 応答性とユーザーとのインタラクションの向上

バックグラウンドタスク: マルチスレッドにより、時間のかかる操作やリソースを大量に消費する操作をバックグラウンドで実行することができ、メインスレッドがユーザーインターフェースを担当している場合でも応答性を保つことができます。これにより、インターフェースが重たいタスクの実行中にブロックされることがなくなり、ユーザー体験が向上します。

非同期操作: ユーザーとのインタラクションやイベントの処理は、メインタスクの実行と並行して行うことができ、アプリケーションをより応答性が高く効率的にします。

3. システムリソースの効果的な利用

リソースの最適化: マルチスレッドは、CPU時間やメモリなどのシステムリソースをより効率的に使用することができます。これは特に、サーバーや高性能計算システムにおいて、マルチスレッドが多数のリクエストやタスクを同時に処理するのに役立ちます。

入出力の管理: マルチスレッドアプリケーションは、ネットワーク操作、ファイルの読み書きなどの入出力タスクをより効率的に管理することができます。threadは、1つの操作が完了を待っている間、他のタスクを実行することができます。

4. マルチタスクのサポート

マルチタスク: マルチスレッドは、1つのプロセス内で複数のタスクを同時に実行することができ、ウェブサーバー、データベース、リアルタイムアプリケーションなど、マルチタスクを必要とするアプリケーションの開発を簡素化します。

データの並列処理: 大量のデータを処理するタスクにおいて、マルチスレッドはデータを分割して並行処理することができ、タスクの実行を大幅にスピードアップします。

マルチスレッドの使用例

Webサーバー: マルチスレッドにより、Webサーバーは多くのクライアントリクエストを同時に処理することができ、サーバーのパフォーマンスとスケーラビリティを向上させます。

グラフィカルユーザーインターフェイス (GUI): グラフィカルインターフェイスを持つアプリケーションでは、マルチスレッドにより、長時間の計算をバックグラウンドで行いながら、インターフェイスの応答性を保つことができます。

科学的計算: マルチスレッドは、科学計算においてデータの並列処理に使用され、複雑な計算タスクの実行を大幅に加速します。

ゲームとシミュレーション: ゲームにおいて、マルチスレッドはフィジックス、グラフィックス、サウンド、ユーザーのアクションを同時に処理し、パフォーマンスとリアリズムを向上させます。

1.3 正しい名前

「マルチスレッド」という名前には異議があります。それは「多い」と「スレッド」という2つの言葉から成り立っており、プログラムの中に多くの「コマンド実行スレッド」が存在して何かを実行しているかのように暗示しています。

美しいアナロジーですが、英語(オリジナル)の文献では、並行して行われる複数のアクションを示すために「thread」という用語が使われています。したがって、マルチスレッドはそこでmulti-threadingと表現されています。

違う言語に用語を翻訳することがどのように影響するかは些細な誤解とも言えますが、プログラミングにおいてstreamのようなものが活発に使われ始め、これを「ストリーム」としか翻訳できません。

したがって、現在のロシア語の用語ではいくつかの混乱があり、これを2つの方法で解決しています:

  • Thread(スレッド)は「コマンド実行スレッド」として翻訳されます。
  • Stream(ストリーム)は「データの流れ」として翻訳されます。

一方で、多くのプログラマーは単に英語の用語を翻訳せずに使用し始めました:

  • Thread(スレッド)は「スレッド」と発音し、multi-threadingは「マルチスレッド」とします。
  • Stream(ストリーム)は「ストリーム」と発音します。

Threadはしばしばスレッドと呼ばれることがありますが、「多スレッド」という用語は定着しませんでした。したがって、会話の中で「スレッド」と「マルチスレッド」を同時に使用することが頻繁にあります。

借用された多数の用語の使用は言語を豊かにし、言葉に新しい意味を与え、他国の同僚とのコミュニケーションを簡単にします。私はこのアプローチを完全に支持しています。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION