运行此脚本时:
#!/usr/bin/env python3
f = open("foo", "w")
f.write("1"*10000000000)
f.close()
print("closed")
Run Code Online (Sandbox Code Playgroud)
我可以在我的 Ubuntu 机器上观察到以下过程:
内存充满 10GB。页面缓存填充了 10GB 的脏页面。(/proc/meminfo) 打印“关闭”并且脚本终止。一段时间后,脏页减少。
但是,如果文件“foo”已经存在,close() 会阻塞,直到所有脏页都被写回。
这种行为的原因是什么?
如果文件不存在,这是 strace:
openat(AT_FDCWD, "foo", O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC, 0666) = 3
fstat(3, {st_mode=S_IFREG|0664, st_size=0, ...}) = 0
ioctl(3, TCGETS, 0x7ffd50dc76f0) = -1 ENOTTY (Inappropriate ioctl for device)
lseek(3, 0, SEEK_CUR) = 0
ioctl(3, TCGETS, 0x7ffd50dc76c0) = -1 ENOTTY (Inappropriate ioctl for device)
lseek(3, 0, SEEK_CUR) = 0
lseek(3, 0, SEEK_CUR) = 0
mmap(NULL, 10000003072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fcd9892e000
mmap(NULL, 10000003072, …
Run Code Online (Sandbox Code Playgroud)