Skip to content

Instantly share code, notes, and snippets.

@habibutsu
Last active September 6, 2019 13:44
Show Gist options
  • Save habibutsu/bd7d41296d6577ef3c435702266b3b77 to your computer and use it in GitHub Desktop.
Save habibutsu/bd7d41296d6577ef3c435702266b3b77 to your computer and use it in GitHub Desktop.
Управление памятью в питоне

Управление памятью в Python

Организация памяти

Память в Python организована в несколько уровней.

  • Слой 3 (Уровень ядра) - предназначен для non-object данных самого интерпрeтатора
  • Слой 2 - выделение памяти под объекты
  • Слой 1 - PyMem_ API
import sys
import struct
import ctypes

from elftools.elf.elffile import ELFFile

fd = open(sys.executable, 'rb')
elf = ELFFile(fd)
symtab = elf.get_section_by_name('.symtab')

unpack_fmt = {
    ctypes.c_char: 'c',
    ctypes.c_ubyte: 'B',
    ctypes.c_bool: '?',
    ctypes.c_ushort: 'H',
    ctypes.c_int: 'i',
    ctypes.c_uint: 'I',
    ctypes.c_long: 'l',
    ctypes.c_ulong: 'L',
    # ...
    ctypes.c_size_t: 'N'
}
def read_value(symtab, name, ctype):
    # struct.calcsize('I')
    symbols = symtab.get_symbol_by_name(name)
    if symbols is None:
        return

    return [
        struct.unpack(
            unpack_fmt[ctype],
            ctypes.string_at(s['st_value'], ctypes.sizeof(ctype))
        )
        for s in symbols
    ]

(struct.unpack('I',
    ctypes.string_at(
        symtab.get_symbol_by_name('maxarenas')[0]['st_value'],
        ctypes.sizeof((ctypes.c_uint))
    )
)
# addr = f"objdump -t {sys.executable}|grep maxarena|awk '{print $1}'"
read_value(symtab, 'maxarenas', ctypes.c_uint)
read_value(symtab, 'ntimes_arena_allocated', ctypes.c_size_t)
read_value(symtab, 'narenas_currently_allocated', ctypes.c_size_t)

Ссылки

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment