当 Linux 内核正在把 A 文件写入磁盘,这时另一个进程调用 write 写 A 文件,该进程会挂起么

2022-02-23 09:38:59 +08:00
 jdz

如果不会,内核怎么处理这种竞争呢。

1853 次点击
所在节点    程序员
9 条回复
soulzz
2022-02-23 09:42:08 +08:00
另一个进程 write 写 A 失败
msg7086
2022-02-23 09:45:34 +08:00
问题看得有点迷。内核把 A 刷入磁盘,然后进程又让内核写 A ?
wellsc
2022-02-23 09:55:58 +08:00
了解下 io 调度算法
cheng6563
2022-02-23 09:57:00 +08:00
不说同文件了,如果写的超过缓冲区了同硬盘都会挂起
jdz
2022-02-23 10:00:42 +08:00
@msg7086 比如进程 M 调用了 flush(A), 然后内核就会刷新 A 到磁盘,在内核刷新到磁盘的同时,进程 N 调用 write(A),这时会发生什么呢
msg7086
2022-02-23 10:11:52 +08:00
@jdz 会放进内存里等内核下一次 flush ?
tomychen
2022-02-23 14:49:13 +08:00
```C
static inline void file_start_write(struct file *file)
{
if (!S_ISREG(file_inode(file)->i_mode))
return;
__sb_start_write(file_inode(file)->i_sb, SB_FREEZE_WRITE, true);
}

static inline bool file_start_write_trylock(struct file *file)
{
if (!S_ISREG(file_inode(file)->i_mode))
return true;
return __sb_start_write(file_inode(file)->i_sb, SB_FREEZE_WRITE, false);
}

static inline void file_end_write(struct file *file)
{
if (!S_ISREG(file_inode(file)->i_mode))
return;
__sb_end_write(file_inode(file)->i_sb, SB_FREEZE_WRITE);
}

ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)
{
ssize_t ret;

if (!(file->f_mode & FMODE_WRITE))
return -EBADF;
if (!file->f_op || (!file->f_op->write && !file->f_op->aio_write))
return -EINVAL;
if (unlikely(!access_ok(VERIFY_READ, buf, count)))
return -EFAULT;

ret = rw_verify_area(WRITE, file, pos, count);
if (ret >= 0) {
count = ret;
file_start_write(file);
if (file->f_op->write)
ret = file->f_op->write(file, buf, count, pos);
else
ret = do_sync_write(file, buf, count, pos);
if (ret > 0) {
fsnotify_modify(file);
add_wchar(current, ret);
}
inc_syscw(current);
file_end_write(file);
}

return ret;
}
```
whileFalse
2022-02-23 16:59:21 +08:00
你确定另一个进程能以写方式 open 该文件?
mayli
2022-02-27 07:48:00 +08:00
不处理 写入会被序列化 后面的会覆盖之前的写入
内核相当于写同一个文件同一个 Offset 两次

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/835830

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX