一般来说,在ucLinux上,ioctl比写入/ sys文件系统更快吗?
我有一个我正在使用的嵌入式系统,它目前使用sysfs来控制某些功能。
但是,如果可能的话,我们希望加快速度。
我发现这个子系统也支持和ioctl接口,但在重写代码之前,我决定搜索以查看哪个接口更快(ucLinux上):sysfs或ioctl。
有没有人能够很好地理解这两种实现,以便让我大致了解每种实现的开销差异? 我正在寻找通用信息,例如“ioctl更快,因为您已经从函数调用中删除了文件层”。 或者“它们大致相同,因为sysfs具有非常简单的界面”。
2013年10月24日更新:
我现在正在做的具体情况如下:
int fd = open("/sys/power/state",O_WRONLY);
write( fd, "standby", 7 );
close( fd );
在kernel / power / main.c中,处理这种写入的代码如下所示:
static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,
const char *buf, size_t n)
{
#ifdef CONFIG_SUSPEND
suspend_state_t state = PM_SUSPEND_STANDBY;
const char * const *s;
#endif
char *p;
int len;
int error = -EINVAL;
p = memchr(buf, 'n', n);
len = p ? p - buf : n;
/* First, check if we are requested to hibernate */
if (len == 7 && !strncmp(buf, "standby", len)) {
error = enter_standby();
goto Exit;
((( snip )))
可以通过移动到定制ioctl()处理ioctl调用的代码看起来像这样:
case SNAPSHOT_STANDBY:
if (!data->frozen) {
error = -EPERM;
break;
}
error = enter_standby();
break;
(所以ioctl()调用与sysfs函数相同的低级函数)。
如果通过sysfs表示sysfs()
库调用,请注意man 2 sysfs
这一点:
笔记
这种System-V衍生的系统调用已经过时; 不要使用它。 在带有/ proc的系统上,可以通过/ proc / filesystems获取相同的信息; 改用该接口。
我不记得有一个ioctl()
和一个sysfs接口的东西,但可能它们存在。 无论如何,我会使用proc或sys句柄,因为它往往不那么神秘和灵活。
如果通过sysfs,你的意思是访问/sys
中的文件,这是首选的方法。
我正在寻找通用信息,例如“ioctl更快,因为您已经从函数调用中删除了文件层”。
访问procfs或sysfs文件不会导致I / O瓶颈,因为它们不是真正的文件 - 它们是内核接口。 所以不,通过“文件层”访问这些东西不会影响性能。 我认为,这在Linux系统编程中是一个不常见的误解。 程序员可能会对系统调用不好,系统调用和偏执狂打开文件的速度会变慢。 当然,ABI中的文件I / O只是系统调用。 正常(磁盘)文件读取速度慢的原因不是打开,读取,写入的调用,而是硬件瓶颈。
这样做时,我总是使用基于低级别描述符的函数( open()
, read()
)而不是高级别流,因为在某些时候,一些经验使我相信他们对此更具可靠性(从/proc
读取)。 我不能说这是否确实如此。
所以,这个问题很有意思,我构建了两个模块,一个用于ioctl,另一个用于sysfs,ioctl只实现了4字节的copy_from_user,仅此而已,sysfs在其写入接口中没有任何内容。
然后,几个用户空间测试多达100万次迭代,结果如下:
time ./sysfs /sys/kernel/kobject_example/bar
real 0m0.427s
user 0m0.056s
sys 0m0.368s
time ./ioctl /run/temp
real 0m0.236s
user 0m0.060s
sys 0m0.172s
编辑
我同意@goldilocks的回答,硬件是真正的瓶颈,在Linux环境下,选择ioctl或sysfs的驱动程序写得很好,但如果你的硬件使用uClinux,即使很少的cpu周期可以使用一个区别。
我所做的测试是针对Linux,而不是uClinux,它从来不想成为两个接口的绝对参考分析,我的观点是你可以写一本关于这个或那个有多快的书,但只有测试会让你知道,我几分钟就可以设置这个东西。
链接地址: http://www.djcxy.com/p/75149.html上一篇: In general, on ucLinux, is ioctl faster than writing to /sys filesystem?