これはすべて Linux と C で行われます。
デバイス ドライバーの読み取り/書き込み関数を最大 8 回呼び出す必要があるユーザー空間ライブラリ関数があります。(私はライブラリとデバイス ドライバを作成しています。) これを実現するには 2 つの方法があります。
- ライブラリ呼び出しで必要な回数だけ読み取り/書き込みを行います。
- 必要な回数、デバイスへの読み取り/書き込みをドライバーに処理させます。
ドライバーは、以前の ioctl 呼び出しに基づいて、必要な回数を既に知っています。オプション 1 では、ユーザー空間とカーネル空間の間でより多くの切り替えが必要になるため、パフォーマンスが低下することがわかっています。一方、オプション 2 は問題を引き起こします。読み取り呼び出しの場合、2 つのモードを切り替えることなく一度に 1 つの読み取りをユーザー空間に戻すことができない限り、ユーザー空間に戻されるバッファーは最大 8 倍になります。同じデータが毎回書き込まれる場合を除き、書き込み呼び出しでも同じ問題が発生します。したがって、オプション 2 の最悪のケースでは、オプション 1 とは対照的に、8 倍の大きさのバッファをやり取りする必要があります。
結局のところ、どちらがより効率的ですか?