1. ホーム
  2. python

[解決済み] Pythonのランタイムとは何ですか?それは何から構成されていますか?

2022-03-03 03:54:49

質問

この質問に関連すること ランタイム」とは何ですか?(https://stackoverflow.com/questions/3900549/what-is-runtime/3900561)

Pythonのランタイムは何からできているのか理解しようとしています。私の推測では

  1. すべてのランタイム変数を含む python プロセス。
  2. GIL
  3. 基礎となるインタプリタコード(CPythonなど)。

さて、これが正しければ、pythonのマルチプロセシングは複数のランタイムを作り、pythonのプロセスはランタイムに直接関連付けられるものだと言えるでしょうか。(私はこれが正しい選択肢だと思います)

あるいは、親プロセスと同じGILとメモリ空間で動作する独自のスタックを持つすべてのpythonスレッドは、別々のランタイムを持つものとして呼び出すことができるでしょうか?

それとも、いくつのスレッドやプロセスが実行されていても、すべて単一のランタイムの下に置かれるのでしょうか?

簡単に言うと、Pythonの文脈におけるランタイムの定義とは何でしょうか?

PS:スレッドとプロセスの違いは理解しています。GIL: 影響は理解していますが、グロッキーではありません。

解決方法は?

コンピュータサイエンスにおける2つの異なる(しかし類似した)概念、マルチプロセスとマルチスレッドについて話しているのですね。ここでは、役に立つかもしれない質問と回答をいくつかまとめています。

<ブロッククオート

マルチプロセシングとは、1つのコンピュータシステム内で2つ以上の中央演算処理装置(CPU)を使用することです。この用語は、複数のプロセッサをサポートするシステムの能力、またはプロセッサ間でタスクを割り当てる能力も意味します。

コンピュータアーキテクチャにおいて、マルチスレッドとは、中央演算処理装置(CPU)(またはマルチコアプロセッサの1つのコア)が、オペレーティングシステムによってサポートされる複数のスレッドを同時に実行する能力のことである。この方法は、マルチプロセッシングとは異なります。マルチスレッドアプリケーションでは、スレッドは単一または複数のコアのリソースを共有し、これには演算ユニット、CPUキャッシュ、変換ルックサイドバッファ(TLB)が含まれます。

<ブロッククオート

プロセス

各プロセスは、プログラムの実行に必要なリソースを提供する。プロセスは、仮想アドレス空間、実行可能コード、システムオブジェクトへのオープンハンドル、セキュリティコンテキスト、一意のプロセス識別子、環境変数、優先度クラス、最小および最大のワーキングセットサイズ、および少なくとも1つの実行スレッドを持つ。各プロセスは、しばしばプライマリースレッドと呼ばれる単一のスレッドで起動されますが、そのスレッドのいずれかから追加のスレッドを作成することができます。

スレッド

スレッドは、プロセス内のエンティティで、実行のためにスケジュールすることができます。プロセスのすべてのスレッドは、その仮想アドレス空間とシステムリソースを共有します。さらに、各スレッドは例外ハンドラ、スケジューリング優先度、スレッドローカルストレージ、一意のスレッド識別子、およびスレッドコンテキストをスケジュールされるまで保存するためにシステムが使用する構造体のセットを維持します。スレッドコンテキストには、スレッドのマシンレジスタのセット、カーネルスタック、スレッド環境ブロック、およびスレッドのプロセスのアドレス空間内のユーザースタックが含まれます。また、スレッドは独自のセキュリティコンテキストを持つことができ、これはクライアントになりすますために使用することができます。


<ブロッククオート

ランタイム環境とは、基本的にマシンの上で動作する仮想マシンのことで、マシンの抽象化を提供するものです。一般に、ライブラリよりも低レベルです。フレームワークは、ランタイム環境を含むことができますが、一般的には、ライブラリと結びついています。

コンピュータプログラミングにおいて、ランタイムシステムは、ランタイム環境とも呼ばれ、主に実行モデルの一部を実装するものである。ほとんどの言語には、プログラムが実行される環境を提供する、何らかの形式のランタイムシステムがある。この環境は、アプリケーションメモリのレイアウト、プログラムが変数にアクセスする方法、手続き間でパラメータを渡す仕組み、オペレーティングシステムとのインターフェイスなど、多くの問題に対処することができる。一般に、ランタイムシステムはスタックとヒープの設定と管理に責任を持ち、ガベージコレクション、スレッド、その他言語に組み込まれた動的機能などの機能を含む場合があります。

<ブロッククオート

CPython インタープリタが、一度に実行する Python バイトコードは 1 つのスレッドだけであることを保証するために使用するメカニズムです。これはオブジェクトモデル(dict のような重要な組み込み型を含む)を同時アクセスに対して暗黙のうちに安全にすることで、CPython の実装を簡素化します。インタープリタ全体をロックすることで、マルチプロセッサマシンによる並列処理の多くを犠牲にして、インタープリタのマルチスレッド化を容易にします。

しかし、標準またはサードパーティの拡張モジュールの中には、圧縮やハッシュ化などの計算集約的な作業を行う際にGILを解放するように設計されているものがあります。また、I/Oを行う際には常にGILが解放されます。

これまで「フリースレッド」インタープリタ(共有データをより細かい単位でロックするもの)を作ろうとしても、一般的なシングルプロセッサの場合、パフォーマンスが低下するため、成功しなかった。この性能の問題を克服するためには、実装がより複雑になり、その結果、維持コストが高くなると考えられています。

GILの詳細については、便利なソースがあります。

<ブロッククオート

フォークするたびに、Pythonのプロセス全体がメモリ上に複製され(Pythonインタプリタ、あなたのコードとライブラリ、現在のスタックなどを含む)、2番目のプロセスが作成されます-プロセスのフォークがスレッドを作成するよりはるかに高価である理由の一つです。

Python インタープリタの新しいコピーが作成されます。

Python インタープリタを 2 つ実行する利点の 1 つは、GIL (Global Interpreter Locks) を 2 つ持つことになり、マルチコアシステムで真のマルチプロセッシングが可能になることです。

1つのプロセス内のスレッドは同じGILを共有します。つまり、ある瞬間に実行されるのは1つだけなので、並列性の錯覚を与えるだけです。

<ブロッククオート

Pythonのメモリ管理には、すべてのPythonオブジェクトとデータ構造を含むプライベートヒープが含まれます。このプライベートヒープの管理は、Pythonのメモリマネージャによって内部的に保証されています。Pythonのメモリマネージャは、共有、セグメンテーション、事前割り当てやキャッシュなど、様々な動的ストレージ管理の側面を扱う様々なコンポーネントを持っています。


を使用してスレッドを生成した場合、そのスレッドは threading ライブラリは、事実上1つのPythonランタイム内でジョブを生成していることになります。このランタイムは、スレッドが共有メモリを持つことを保証し、これらのスレッドの実行順序を global interpreter lock :

を使用してプロセスを起動すると multiprocessing ライブラリは、指定されたコードを実行する新しいPythonインタプリタ(新しいランタイム)を含む新しいプロセスを生成していることになります。もし、メモリを共有したい場合は multiprocessing.shared_memory :

<ブロッククオート

このモジュールは、クラスを提供します。 SharedMemory マルチコアまたは対称型マルチプロセッサ (SMP) マシン上の 1 つまたは複数のプロセスによってアクセスされる共有メモリの割り当てと管理のためのものです。特に、異なるプロセス間での共有メモリのライフサイクル管理を支援するために、BaseManagerサブクラスが用意されています。 SharedMemoryManager は、multiprocessing.managers モジュールでも提供されています。


pythonのマルチプロセシングは複数のランタイムを作り、pythonのプロセスはランタイムに直接関連付けることができるものだと言えるのでしょうか?

はい。異なるGIL、異なるメモリ空間、異なるランタイム。

親プロセスと同じGILとメモリ空間で動作する独自のスタックを持つすべてのPythonスレッドは、別のランタイムを持っていると呼ぶことができますか?

スタックとは何を意味するのかによります。同じGIL、共有メモリ空間、同じランタイム。

スレッドやプロセスがいくつあっても、すべて1つのランタイムのもとになるのですね。

マルチスレッド/マルチプロセスであるかどうかによります。

簡単に言うと、Pythonの文脈におけるランタイムの定義とは何でしょうか?

ランタイムが 環境 は文字通り python.exe または /usr/bin/python . これは、PythonのコードをCPUが読めるバイトコードに変換して解釈するPythonの実行ファイルです。マルチスレッドにした場合は、1つの python が実行されます。このとき multiprocess が複数ある場合は python が実行されている。


コア開発者が来て、この件についてもっと詳しく話してくれることを期待しています。今のところ、上記は単に、あなたがより大きな絵を理解し、見始めるためのソースをまとめたものに過ぎません。