什么应该使用 mmap、malloc 或 File I/O

What should use mmap, malloc or File I/O

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

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

注意这个问题When should I use mmap for file access?讨论的很好,但是没有讨论short lived many processes的情况

What is the preferred way to read a small file that is shared among short lived many processes?

getline() or fread() using standard POSIX I/O from <stdio.h>, or low-level <unistd.h> open() and read() 足够大的缓冲区(具有足够积极的增长政策);取决于读取数据的方式 parsed/interpreted.

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

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

Our kernel level program invokes a process in user space for making some decisions on the basis of values in a file.

我觉得效率很低。就个人而言,我会将 "file" 作为一个结构保留在内核中,并且只公开一个用户 space 接口,可能是一个字符设备,以修改其内容。

这样,只要 "file" 被用户 space 进程改变,你就只会发生上下文切换,而 kernel-space 的东西可以直接检查结构的内容,采用原生格式,没有开销。

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