背景我们的内核级程序调用用户空间中的一个过程,以基于文件中的值做出一些决策。用户空间程序是一个短暂的过程,该过程将内核传递的值与文件内容进行比较。通常一次可以调用用户空间程序的许多实例。该文件少于一千行。
问题:读取在短暂的许多进程之间共享的小文件的首选方法是什么?当前,我们正在使用文件I / O(打开,读取)
注意问题When should I use mmap for file access?讨论得非常好,但是对于许多进程短暂的情况则没有讨论
答案 0 :(得分:1)
读取短暂存在的许多进程之间共享的小文件的首选方法是什么?
getline()
或fread()
使用来自<stdio.h>
的标准POSIX I / O,或使用较低级别的<unistd.h>
open()
和read()
较大的缓冲(具有足够积极的增长政策);取决于如何解析/解释读取的数据。
您不使用内存映射一次读取文件;由于映射的开销,它的效率不如read()
/ fread()
。
请注意,如果文件包含许多数字,则实际的瓶颈是字符串到整数和字符串到浮点的转换(strtol()
,strtod()
,sscanf()
,等等),因为如果访问频率足够高,文件内容将保留在页面缓存中。字符串转换函数的标准实现是为确保正确性而不是为了效率而设计的。
我们的内核级程序调用用户空间中的一个过程,以基于文件中的值做出一些决定。
对我来说似乎效率很低。就个人而言,我会将“文件”作为结构保留在内核中,并且仅公开用户空间界面(可能是字符设备)来修改其内容。
这样,仅当用户空间进程更改“文件”时,您才需要进行上下文切换,并且内核空间的东西可以直接以本机格式直接检查结构的内容,而不会产生开销。
这是例如netfilter(内置防火墙)和其他现有的东西。