2011-09-06 69 views
2

我知道当您调用fwritefprintf或者其他任何写入文件的函数时,内容不会立即刷新到磁盘,而是缓冲在内存中。操作系统如何为文件执行缓冲

首先,OS在哪里管理这些缓冲区以及如何管理这些缓冲区。其次,如果您写入文件,然后读入您编写的内容,并假设操作系统在您写入和读取之间没有刷新内容,如何知道它必须从缓冲区中返回读取?它如何处理这种情况。

我想知道这一点的原因是我有兴趣在用户空间中实现自己的缓冲方案,而不是像OS那样在内核空间中实现。也就是说,写入文件将被缓存在用户空间中,而实际写入只会在某个点发生。通常,我还需要处理对仍在缓冲区中的内容调用read的情况。是否有可能在用户空间中完成所有这些。

回答

4

首先,你在哪里的OS管理这些缓冲器和

功能fwritefprintf这已经是完全在用户空间使用标准输入输出缓冲区如何。缓冲区(可能)是静态数组或可能是malloced内存。

它是如何知道它必须从它没有,所以的更改不会看到缓冲

回读。在调用基础系统调用(write)之前(甚至在读取之前)文件没有真正发生。

是否有可能做这一切在用户空间

不,这是不可能的。好消息是内核已经有了缓冲区所以你所做的每一个write都不是真的被翻译成实际的文件写入。它被推迟并在稍后执行。如果在此期间有人试图从文件中读取,那么内核足够聪明,可以从缓冲区中为他提供服务。从TLPI

位:

当磁盘文件,读取(工作)和write()系统调用 不直接ini- tiate磁盘访问。相反,他们只是在用户空间缓冲区和内核缓冲区缓存中的缓冲区之间复制数据 。

在磁盘文件上执行I/O时,从写入() 的成功返回不能保证数据已传输到磁盘,因为内核执行缓冲磁盘I/O以减少磁盘 活动和加速write()调用。 稍后,内核将其缓冲区写入(刷新)到 磁盘。

如果在此期间,另一进程试图读取这些字节的 的文件,然后内核自动从 缓存提供数据,而不是从文件(过时的内容)。

因此,您可能想了解有关syncfsync

多级缓冲通常是不好的。 stdio缓冲区的原因很有用,它们可以最大限度地减少系统调用的执行次数。如果系统调用会更便宜,则无人再使用stdio缓冲区。

+0

cnicutar,thanx。但我认为,出于我的目的,我可以使用stdio缓冲区概念,将写入缓存在用户空间中,然后再调用实际的写入。因为在我的情况下,写操作不能立即执行。我每隔50毫秒左右检查一次系统中的错误,只有在确定没有错误时才写入文件。请注意,我正在讨论应用程序使用可靠性的库,因此它应该适用于所有情况。也就是说,它不应该是特定于应用程序的。 – MetallicPriest

+0

@MetallicPriest从某种意义上讲,它将重塑stdio。只要你不期望一致性(其他进程立即看到你的修改)应该没问题。 – cnicutar

+0

因此,您的意思是,在用户级别,当stdio尚未实际进行系统调用时,读取仍保存在stdio写入缓冲区中的内容将被返回以进行读取? – MetallicPriest