由于'fread'已被缓存,是否有必要将数据存入内存然后使用它?

我在linux上用gcc使用fopen / fread / fwrite / fseek . 是否有必要在使用数据之前分配内存缓冲区并使用fread将数据顺序读入缓冲区?

回答(3)

2 years ago

您必须将缓冲区(由代码创建的缓冲区,malloced或local)传递给fread,以将读取的数据传递给您 . 我不知道你说“fread is buffered”是什么意思 . 大多数“C”库调用都以这种方式运行 . 他们不会将内部存储(缓冲或其他)返回给您,如果他们这样做,他们将为您提供相应的免费/发布功能 .

请参阅http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html它也有一个非常基本的例子 .

2 years ago

有了fread,是的,您必须在进程中分配内存,系统调用会将数据复制到缓冲区中 .

在某些特殊情况下,您可以处理数据而无需将其复制到用户空间 . 请参阅sendfile系统调用,该调用将数据从一个文件描述符直接复制到另一个文件描述符 . 这可用于将数据从文件传输到网络套接字而无需过多复制 .

2 years ago

当您在C标准库中使用 fread 或其他文件I / O函数时,内存将在多个位置进行缓冲 .

  • 您的应用程序分配一个传递给 fread 的缓冲区 . fread 将数据复制到缓冲区中,然后就可以用它做你想做的事了 . 您负责此缓冲区的分配/释放 .

  • C库通常会为您打开的每个 FILE* 创建一个缓冲区 . 数据以大块的形式读入此缓冲区 . 这允许 fread 满足许多小的请求,而不必进行大量的系统调用,这是很昂贵的 . 当人们说 fread 被缓冲时,这就是人们的意思 .

  • 内核还将缓冲磁盘缓存中正在读取的文件 . 这减少了 read 系统调用所需的时间,因为如果数据已经在内存中,则程序将不必等待内核从磁盘中获取数据 . 内核将保留最近读取的文件,并且可以提前读取正在按顺序访问的文件 .

打开文件时会自动分配C库缓冲区,并在关闭文件时释放 . 您根本不需要管理它 .

内核磁盘缓存存储在未用于其他任何内容的物理内存中 . 同样,您不必管理它 . 只要需要其他东西,就会释放内存 .