python线程运行中64兆字节块的来源是什么?

时间:2014-11-05 10:18:29

标签: python linux multithreading

我发现在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块?

1 个答案:

答案 0 :(得分:2)

为堆栈保留64MB的地址空间。 64位进程中的地址空间实际上是免费的,因此没有理由保留更少的空间。 (这是对32位系统的一个很大改进,你必须做出痛苦的权衡。)

不要误以为这是物理记忆。这是一个虚拟映射。