[解決済み] Pythonのランタイムとは何ですか?それは何から構成されていますか?
質問
この質問に関連すること ランタイム」とは何ですか?(https://stackoverflow.com/questions/3900549/what-is-runtime/3900561)
Pythonのランタイムは何からできているのか理解しようとしています。私の推測では
- すべてのランタイム変数を含む python プロセス。
- GIL
- 基礎となるインタプリタコード(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
が実行されている。
コア開発者が来て、この件についてもっと詳しく話してくれることを期待しています。今のところ、上記は単に、あなたがより大きな絵を理解し、見始めるためのソースをまとめたものに過ぎません。
関連
-
Python interpreted model libraryによる機械学習モデル出力の可視化 Shap
-
Python Pillow Image.save jpg画像圧縮問題
-
[解決済み】ValueError: xとyは同じサイズでなければならない
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] MVPとMVC、その違いは何ですか?
-
[解決済み】if __name__ == "__main__": は何をするのでしょうか?
-
[解決済み】PyPyが6.3倍速いなら、CPythonよりPyPyを使うべきじゃないのか?
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
pyCaret効率化乗算器 オープンソース ローコード Python機械学習ツール
-
風力制御におけるKS原理を深く理解するためのpythonアルゴリズム
-
[解決済み】ilocが「IndexError: single positional indexer is out-of-bounds」を出す。
-
[解決済み】pygame.error: ビデオシステムが初期化されていない
-
[解決済み] builtins.TypeError: strでなければならない、bytesではない
-
[解決済み】Python: OverflowError: 数学の範囲エラー
-
[解決済み】ValueError: pickleプロトコルがサポートされていません。3、python2 pickleはpython3 pickleでダンプしたファイルを読み込むことができない?
-
[解決済み】Flaskのテンプレートが見つからない【重複あり
-
[解決済み] プロセスとスレッドの違いは何ですか?
-
[解決済み] ランタイム」とは何ですか?