【问题标题】:What should use mmap, malloc or File I/O什么应该使用 mmap、malloc 或 File I/O
【发布时间】:2019-04-07 17:42:52
【问题描述】:

背景 我们的内核级程序调用用户空间中的一个进程,以根据文件中的值做出一些决定。用户空间程序是一个短暂的进程,它将内核传递的值与文件内容进行比较。一次通常用户空间程序的许多实例可以被调用。该文件少于一千行。

问题 读取在短暂的多个进程之间共享的小文件的首选方法是什么?目前我们正在使用 File I/O (fopen, fread)

注意问题When should I use mmap for file access?讨论得很好,但没有讨论短寿命多进程的情况

【问题讨论】:

  • 你可以考虑做一个tmpfs文件系统,把文件保存在里面。
  • 对不同的方法进行基准测试,看看哪种方法更适合您的用例。

标签: c linux file malloc mmap


【解决方案1】:

读取在短寿命的多个进程之间共享的小文件的首选方法是什么?

getline()fread() 使用来自 <stdio.h> 的标准 POSIX I/O,或低级 <unistd.h> open()read() 到足够大的缓冲区(具有足够积极的增长策略);取决于读取数据的解析/解释方式。

您不会使用内存映射来读取一次文件;由于映射开销,它不如read()/fread() 高效。

请注意,如果文件包含许多数字,则实际瓶颈是字符串到整数和字符串到浮点数的转换(strtol()strtod()sscanf() 等),因为如果经常访问的文件内容将保留在页面缓存中。字符串转换函数的标准实现是为了正确性而不是为了效率而设计的。

我们的内核级程序调用用户空间中的一个进程,以根据文件中的值做出一些决定。

对我来说似乎效率很低。就个人而言,我会将“文件”作为一个结构保留在内核中,并且只公开一个用户空间界面,可能是一个字符设备,以修改其内容。

这样,只要“文件”被用户空间进程更改,您就只会发生上下文切换,而内核空间的东西可以直接以本机格式检查结构的内容,没有任何开销。

这就是例如netfilter(内置防火墙)和其他现有的东西。

【讨论】:

  • 感谢您的回复。我从您的回复中得到两点 1)不需要在内存中加载文件 2)在内核中读取文件是可以的,但应该避免写入文件。我说的对吗?
  • @incompetent:我不确定我是否理解你的观点。首先,如果文件是普通文件,你确实需要读取它;我个人会改为通过内核字符设备公开相同的逻辑内容。此外,这是您第一次提到写入文件。也许您应该编辑您的问题,并添加有关文件被修改的频率(以及修改的频率)的信息(与读取频率相比),以及它包含什么样的信息(数字?标志?字符串)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-24
  • 2011-12-19
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
  • 2010-12-30
相关资源
最近更新 更多