一般来说,在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?

下一篇: How to convert .docx to .pdf in C#