Closed pengjunlong closed 5 years ago
欧盟最高法院规定使用Facebook“赞”按钮的网站对数据负责,需要获得用户同意才能将用户个人数据发送给facebook
Python中一切皆是对象,有些对象可以包含其它对象,如lists, tuples, dicts, classes等
因为Python的灵活特点,导致大量小内存分配,怎么加速内存操作以及减少碎片呢?Python使用了特殊的内存管理器—— PyMalloc
为了减少小对象(<512字节)的开销,Python使用拆解大内存块分配方式,小对象分配使用3种级别的管理方式——arena, pool, block
内存池是一个概念上的东西,表示Python对于整个小块内存分配和释放行为的内存管理机制。 更大的对象内存管理交给标准C分配器
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 |
具有相同大小的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支持)连接起来,
因为大规模枪击事件,Cloudflare停止托管相关不良网站