我发现在linux 64位系统上,每次创建python线程时,都会提供64兆字节的匿名块。
00007f4da6371000 8192K rw--- [ anon ]
00007f4da6b72000 8192K rw--- [ anon ]
00007f4d64021000 65404K ----- [ anon ]
00007f4d6c021000 65404K ----- [ anon ]
00007f4d70021000 65404K ----- [ anon ]
00007f4d74021000 65404K ----- [ anon ]
00007f4d78021000 65404K ----- [ anon ]
00007f4d7c021000 65404K ----- [ anon ]
00007f4d80021000 65404K ----- [ anon ]
00007f4d84021000 65404K ----- [ anon ]
00007f4d88021000 65404K ----- [ anon ]
00007f4d90021000 65404K ----- [ anon ]
00007f4d94021000 65404K ----- [ anon ]
00007f4d98021000 65404K ----- [ anon ]
00007f4d9c021000 65404K ----- [ anon ]
00007f4da0021000 65404K ----- [ anon ]
total 1076628K
通过这个微不足道的案例获得
>>> import threading
>>> class A(threading.Thread):
... def run(self):
... while True:
... pass
...
>>> A().start()
>>> A().start()
>>> A().start()
>>> A().start()
>>> A().start()
>>> A().start()
>>> A().start()
>>> A().start()
>>> A().start()
>>> A().start()
>>> A().start()
>>> A().start()
>>> A().start()
我的第一个嫌疑人是线程堆栈和线程本地存储,但是我无法找到65兆字节是所需数量的任何点。实际上,所有检查(例如,threading.stack_size,thread_pthread.c内容,ulimit -a)都指向远小于该值的数量。谁来决定这个数量并创建这个VM块?
答案 0 :(得分:2)
为堆栈保留64MB的地址空间。 64位进程中的地址空间实际上是免费的,因此没有理由保留更少的空间。 (这是对32位系统的一个很大改进,你必须做出痛苦的权衡。)
不要误以为这是物理记忆。这是一个虚拟映射。