pythonメモリ管理--階層化された割り当て

1539 ワード

1.階層配分
レベル
内容
 
辞書、元祖、リスト、文字列.....などpythonオブジェクト
階層3
オブジェクト固有のメモリディスペンサ(集約オブジェクトなど)
階層2
pythonオブジェクトディスペンサ
階層1
pythonローレベルメモリディスペンサ
階層0
glibcのmalloc
階層-1
OS仮想メモリマネージャ
レイヤ2
物理メモリ
2.第0層glibc
  • linux OSが提供するglibcというmalloc()
  • が申請したメモリは256 Kバイトより大きく、0階層mallocを忠実に呼び出す.そうでなければ、第1層及び第2層
  • に転送する.
  • 第1層は、256 Kバイト以下の短命オブジェクト
  • を担当する.
    3.階層1:python低レベルメモリディスペンサ
  • 3レベルのメモリ構造:arena > pool > block
  • arenaサイズは256 K
  • に固定されている
  • poolサイズ固定4 K(オペレーティングシステムの仮想メモリページサイズと一致)
  • unusedarenaobjects単一チェーンテーブル;usable_arenas双方向チェーンテーブル
  • arenaおよびpool
  • の生成および管理
    4.レイヤ2:pythonオブジェクトディスペンサ
  • pool内部のblock
  • の管理を担当する
  • blockサイズは8の整数倍で、最小は割り当ての需要を満たして、メモリの位置合わせがあって、例えば14バイトを申請して、あなたに16バイトの
  • をあげます
  • block 3つの状態:割り当て済み、使用済み、未使用
  • 5.第3層:対象固有分配器
  • タプル、リスト、ディクショナリを含む上から下へリソースをくださいPyDictObject(ディクショナリオブジェクト)--->PyDict_new()---->sizeof(PyDictObject)バイトのblock---->PyObject_GC_New()、PyObject_Malloc()---->sizeof(PyDictObject)バイトのpool---->usable_arenas-->freepools、 new_arena()------私はarenaを作りたいのですが、256 Kの直接メモリをください--->malloc()下から資源malloc()---->256 Kのメモリを返して、花を持って行きましょう---->usable_arenas-->freepools、 new_arena()---->arenaを作って、1つのpoolを返して、花を持って行きましょう---->PyObject_GC_New()、PyObject_Malloc()---->poolの中の1つのblockを返して、花を持って行きましょう---->PyDict_new()----->辞書の対象
  • をあげます