小编JMC*_*JMC的帖子

为什么在覆盖文件时关闭文件等待同步,而不是在创建时?

运行此脚本时:

#!/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)

cache ext4 files

9
推荐指数
1
解决办法
198
查看次数

标签 统计

cache ×1

ext4 ×1

files ×1