【问题标题】:Write system call and blocking the process编写系统调用并阻塞进程
【发布时间】:2014-07-15 16:16:39
【问题描述】:

在 UNIX 中:read 系统调用会阻塞进程,直到它完成。

write 系统调用的行为如何?它在磁盘上写入时会阻止进程吗?

对于 write 系统调用,我的意思是 write(fd, bf, nbyte) 过程调用。

【问题讨论】:

    标签: unix linux-kernel posix system


    【解决方案1】:

    不,它只会阻塞进程,直到缓冲区的内容被复制到内核空间。这通常时间很短,但在某些情况下它可能会等待一些磁盘操作:

    • 如果没有空闲页面,则必须释放一些页面。如果有干净的页面,可以丢弃它们的内容(因为它只是从磁盘复制),但如果没有,则必须清洗一些页面,这涉及到写入。由于页面会在几秒钟后自动清洗,如果您有足够的内存,这几乎不会发生。
    • 如果写入到文件的中间,则可能需要读取周围的内容,因为页面缓存具有页面粒度(在大多数平台上对齐 4 KiB 块)。这种情况很少发生,因为很少会在不读取文件的情况下更新文件,并且如果您先读取文件,则内容已被缓存。

    如果你想等到数据真正上板,你需要跟进fsync(2)

    【讨论】:

    • 我很高兴你提到它“阻塞进程,直到缓冲区的内容被复制到内核空间”
    猜你喜欢
    • 2017-10-03
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2013-04-26
    • 2019-10-01
    • 1970-01-01
    • 2014-03-23
    • 2023-03-09
    相关资源
    最近更新 更多