8

私が使用している組み込みシステムがあり、現在、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 関数が行ったのと同じ低レベル関数を呼び出します)。

4

2 に答える 2

3

sysfs によってsysfs()ライブラリ呼び出しを意味する場合は、次の点に注意してman 2 sysfsください。

ノート

この System-V 派生システム コールは廃止されました。使用しないでください。 /proc を備えたシステムでは、同じ情報を /proc/filesystems から取得できます。代わりにそのインターフェイスを使用してください。

および sysfs インターフェースを持っていたものに気づいたことを思い出すことはできませんioctl()が、おそらくそれらは存在します。いずれにせよ、proc または sys ハンドルを使用したいと思います。

sysfs でファイルにアクセスする場合は/sys、それが推奨される方法です。

「関数呼び出しからファイルレイヤーを削除したため、ioctlの方が高速です」などの一般的な情報を探しています。

procfs または sysfs ファイルへのアクセスは、実際のファイルではなく、カーネル インターフェイスであるため、I/O ボトルネックを伴いません。いいえ、「ファイル層」を介してこのようなものにアクセスしても、パフォーマンスには影響しません。これは、Linux システムのプログラミングでは珍しくない誤解だと思います。プログラマーは、うまくいかないシステム コール、システム コール、およびファイルを開くのがどういうわけか遅くなるという偏執症についてきしむことができます。もちろん、ABI でのファイル I/O はシステム コールにすぎません。通常の (ディスク) ファイルの読み取りを遅くするのは、open、read、write などの呼び出しではなく、ハードウェアのボトルネックです。

これを行うときは常に、高レベルのストリームの代わりに低レベルの記述子ベースの関数 ( open()、 ) を使用します。それが決定的に正しいかどうかは、私には言えません。read()/proc

于 2013-10-23T17:23:15.463 に答える
2

興味深い質問でした。ioctl 用と sysfs 用の 2 つのモジュールを作成しました。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 の回答に同意します。HW が本当のボトルネックです。適切に作成されたドライバーを備えた Linux 環境では、ioctl または sysfs を選択しても大きな違いはありませんが、おそらくハードウェアで uClinux を使用している場合は、CPU サイクルが少しでも発生する可能性があります。違い。

私が行ったテストは、uClinux ではなく Linux 用であり、2 つのインターフェイスをプロファイリングする絶対的なリファレンスにはなりたくありませんでした。私の要点は、どちらがどれだけ速いかについての本を書くことができるということですが、テストだけがあなたに知らせます。物事をセットアップするのに数分。

于 2013-10-23T21:44:14.077 に答える