为什么当管道已满时唤醒作家?

为什么当管道已满时唤醒作家?

https://elixir.bootlin.com/linux/v5.19/source/fs/pipe.c#L247

当管道已满时,不应该唤醒读取器来读取数据吗?

    /*
     * We only wake up writers if the pipe was full when we started
     * reading in order to avoid unnecessary wakeups.
     *
     * But when we do wake up writers, we do so using a sync wakeup
     * (WF_SYNC), because we want them to get going and generate more
     * data for us.
     */
    was_full = pipe_full(pipe->head, pipe->tail, pipe->max_usage);

答案1

该代码在管道被读取时运行;由于正在读取管道,因此读取完成后管道不会满,因此将有空间进行更多写入。

如果在开始读取之前管道已满,则意味着可能有写入器因管道已满而被阻塞;这些作家现在醒来很有用,可以最大限度地减少等待时间。如果管道未满,则任何被阻止的写入器都不会因为管道已满而被阻止,因此释放管道中的空间不会对它们有帮助,唤醒它们也没有用。

读者们被唤醒了当管道被写入

相关内容