我正在使用读/写来从本地磁盘常规文件读取/写入。

我必须读取/写入少量数据。例如

read(fd, buf, 15)
write(fd, buf, 39);

有人告诉我,当有人检查我的请求时,我应该避免少量的数据读/写。

他们说:例如,我应该分配一个较大的内存(例如4k),首先将小数据复制到大内存中,然后一次写入大内存,而不是多次写入小数据。
而且我还应该一次读取4k数据,并将其存储到大内存中,然后我才能使用该大内存。

但是我了解到,当我写小数据时,我写到页面缓存(?)中,因此内核将负责内存处理吗?当足够大时,内核将写入磁盘吗?

我明白吗?我应该避免读/写小数据吗?

最佳答案



您的想法正确,不,没有必要避免读取/写入小数据。

I/O子系统已经提供了BUFSIZ字节的读取缓冲区(Linux上为8192字节,Windows上为512字节)(在过去的一年中#define在glibc中发生了变化,最初是从_IO_BUFSIZE派生而来,然后是_LIO_BUFSIZ,现在仅是BUFSIZ了。 glibc来源)

这是从_IO_BUFSIZ到纯BUFSIZ Mechanically remove IO name aliases for types and constants (Wed, 7 Feb 2018).的glibc提交

因此,无论是读取一个字节或8192字节(在Linux上)还是512字节(在Windows上),都没有任何性能损失。在您第一次从文件中请求数据时,I/O缓冲区已经填充了BUFSIZ字节(或者如果文件包含的字符少于EOF字节,则直到BUFSIZ为止的字节数)。因此,您是直接从内存中的读取缓冲区读取数据,对于小规模读取不会造成性能损失。

写入以类似的方式处理,直到写入缓冲区已满(或调用syncfsfsync),才将其写入磁盘,从而导致所有缓冲的文件数据都写入底层文件系统。

09-04 03:02
查看更多