pengjunlong / pengjunlong.github.io

Github+Markdown+hexo搭建自己的空间
https://pengjunlong.github.io
1 stars 0 forks source link

2019-08-05 #58

Closed pengjunlong closed 5 years ago

pengjunlong commented 5 years ago

因为大规模枪击事件,Cloudflare停止托管相关不良网站

pengjunlong commented 5 years ago

欧盟最高法院规定使用Facebook“赞”按钮的网站对数据负责,需要获得用户同意才能将用户个人数据发送给facebook

pengjunlong commented 5 years ago

Python的内存管理

Python中一切皆是对象,有些对象可以包含其它对象,如lists, tuples, dicts, classes等

因为Python的灵活特点,导致大量小内存分配,怎么加速内存操作以及减少碎片呢?Python使用了特殊的内存管理器—— PyMalloc

image

为了减少小对象(<512字节)的开销,Python使用拆解大内存块分配方式,小对象分配使用3种级别的管理方式——arena, pool, block

内存池是一个概念上的东西,表示Python对于整个小块内存分配和释放行为的内存管理机制。 更大的对象内存管理交给标准C分配器

最小的结构:block

block是特定大小内存块,每个block只维护一个固定大小的对象;大小从8到512字节,但是是8的倍数(8字节对齐),

Request in bytes Size of allocated block size class idx
1-8 8 0
9-16 16 1
17-24 24 2
25-32 32 3
33-40 40 4
41-48 48 5
... ... ...
505-512 512 63

pool

具有相同大小的block集合称为一个pool,通常一个pool的大小等于一个内存页的大小4kB;限制pool由固定大小block组成可以减少碎片,一个对象销毁后,内存管理器可以用相同大小的对象填满它之前的空间。 每个pool有特定的头结构,定义如下

/* Pool for small blocks. */
struct pool_header {
    union { block *_padding;
            uint count; } ref;          /* number of allocated blocks    */
    block *freeblock;                   /* pool's free list head         */
    struct pool_header *nextpool;       /* next pool of this size class  */
    struct pool_header *prevpool;       /* previous pool       ""        */
    uint arenaindex;                    /* index into arenas of base adr */
    uint szidx;                         /* block size class index        */
    uint nextoffset;                    /* bytes to virgin block         */
    uint maxnextoffset;                 /* largest valid nextoffset      */
};

有同样多block的pool用双向链表(nextpool、prevpool支持)连接起来,

未完待续:https://rushter.com/blog/python-memory-managment/

pengjunlong commented 5 years ago

人民的微积分 https://www.geogebra.org/m/x39ys4d7#material/phuyhqtw