使用缓冲区高速缓存写服务
有三个略有不同的写例程。 所有这些操作都将缓冲区指针作为参数,并通过将缓冲区放在空闲列表中以逻辑方式释放该缓冲区。
bwrite 服务通过调用设备的策略例程将缓冲区放置在相应的设备队列上。 然后, bwrite 服务会等待 I/O 完成,并设置调用者的错误标志 (如果需要)。 当调用者希望确保以同步方式进行 I/O ,以便可以立即处理任何错误时,将使用此服务。
巴文特 服务是 bwrite 服务的异步版本,且不等待 I/O 完成。 当需要处理和设备 I/O 活动的重叠时,通常使用此服务。
布德文特 服务不会启动任何 I/O 操作,但会将缓冲区标记为延迟写操作,并将其释放到空闲列表。 稍后,当从空闲列表中获取缓冲区并发现该缓冲区包含来自其他某个块的数据时,会在使用该缓冲区之前将该数据写出到正确的设备。 如果未确定是否立即需要写操作,那么将使用 布德文特 服务。
例如,当与块特殊文件关联的写操作的最后一个字节低于块的末尾时,将调用 布德文特 服务。 调用 布德文特 服务的假设是,很快将发生另一个将再次使用同一块的写操作。 另一方面,由于传递了块的末尾,因此将调用 巴文特 服务,因为假定很快将不会再次访问该块。 因此,可以尽早启动 I/O 处理。
请注意, 格布尔克 和 面包 服务在使其他进程等待时将指定的块专用于调用者,而 布雷尔塞, bwrite, 巴文特或 布德文特 服务最终必须被调用以释放该块以供其他进程使用。