chh*_*bra 13 python linux copy-on-write shared-memory python-multiprocessing
我正在尝试在Python中的父进程和子进程之间共享对象.为了解决这个想法,我创建了一个简单的Python脚本:
from multiprocessing import Process
from os import getpid
import psutil
shared = list(range(20000000))
def shared_printer():
mem = psutil.Process(getpid()).memory_info().rss / (1024 ** 2)
print(getpid(), len(shared), '{}MB'.format(mem))
if __name__ == '__main__':
p = Process(target=shared_printer)
p.start()
shared_printer()
p.join()
Run Code Online (Sandbox Code Playgroud)
代码片段使用优秀的psutil库来打印RSS(驻留集大小).当我在OSX上用Python 2.7.15运行它时,我得到以下输出:
(33101, 20000000, '1MB')
(33100, 20000000, '626MB')
Run Code Online (Sandbox Code Playgroud)
当我在Ubuntu上运行完全相同的代码片段(Linux 4.15.0-1029-aws#30-Ubuntu SMP x86_64 GNU/Linux)时,我得到以下输出:
(4077, 20000000, '632MB')
(4078, 20000000, '629MB')
Run Code Online (Sandbox Code Playgroud)
请注意,子进程'RSS在OSX上是基本的0MB,与Linux中的父进程'RSS大小相同.我曾假设写入时复制行为在Linux中的工作方式相同,并允许子进程为大多数页面引用父进程的内存(可能除了存储对象头部的内存之外).
所以我猜测2系统中的写时复制行为存在一些差异.我的问题是:在Linux中我能做些什么来获得类似OSX的写时复制行为?
所以我猜测这两个系统中的写时复制行为存在一些差异。我的问题是:在 Linux 中我可以做些什么来>获得类似 OSX 的写时复制行为吗?
答案是不。在命令后面,psutil.Process(getpid()).memory_info().rss / (1024 ** 2)操作系统使用 UNIX 命令$top [PID]并搜索字段 RES。其中包含任务已使用的非交换物理内存(以kb为单位)为单位) 。即RES = 代码+数据。
恕我直言,这意味着两个操作系统使用不同的内存管理器。因此,几乎不可能限制进程使用/需要多少内存。这是操作系统的内部问题。在 Linux 中,子进程与父进程具有相同的大小。事实上,它们复制相同的堆栈、代码和数据。但PCB(过程控制块)不同。因此,不可能像OSX那样接近0。感觉 OSX 并没有真正复制代码和数据。如果它们是相同的代码,它将指向父进程的数据。
PD:我希望这对你有帮助!