最適なユーザー時間対リアルタイム比は効率的な並列化の指標ですか?

最適なユーザー時間対リアルタイム比は効率的な並列化の指標ですか?

time一部のUNIXシェルには、特定のコマンドを実行するのに必要な時間を印刷するコマンドがあります。出力は次のとおりです。

実際の1m0.000s
ユーザー10m0.000s
システム0m0.000s

マルチコアで並列化を使用するプログラムを作成すると、ユーザー時間はリアルタイムの倍数になります。

私の質問は、ユーザーの時間に使用されたスレッドの数を掛けたリアルタイムに非常に近い場合は、プログラムが最も並列化されると結論付けることができるかどうかです。つまり、たとえば、どのスレッドも長い間他のスレッドを待つ必要はありません。

答え1

簡単に言うと:いいえ。

多くのエネルギーを無駄にすることは、カーネル空間とユーザー空間の間を切り替えることです。この変換は、最も多くの無駄が発生する場所です。実際にやるべき場所に到達するには、やるべきことがたくさんあります。必要なスイッチ数が少ないほど、最も効率的な動作しなければならないはい。

一部の操作は完全にカーネル空間で行われます(そしてそれをバイパスする(安全な)方法はありません)。この場合、ほとんどの時間はカーネルスペースで費やされます。これは最も効率的な方法です。

カーネルがサービス/機能を実装していないため、ユーザースペースで実行する必要がある他の操作があります。このようなタスクでは、ユーザースペースを使用するほど作業効率が向上します。

しかし、誰かがあまり効率的でないアルゴリズムを使用して、ユーザー空間で効率的なカーネルサービスを実装したかもしれません。これはユーザー時間を増やしますが、効率は低下します。カーネル空間の同じサービスと比較してみてください。

一部の他の開発者は、一度に1MBを読み込む対応する呼び出しの代わりに(ブロックの代わりにブロックに対応する関数がある場合)、カーネルを呼び出して一度に1バイトを読み取ることができます(各バイトに対して切り替える必要があります)。バイト)。

そして最終的にはカーネルタスクとユーザータスクを混ぜて行う必要があります。たとえば、ディスクブロックを読み取るには、カーネルがこの機能を提供する必要があり、メモリブロック(バッファ)がディスクブロックの読み取り結果で満たされるまで「Fire and Forget」機能を提供する必要があります。プロセスメモリ(プログラムの配列など)にアクセスするためにカーネル呼び出しは必要ありません。

時間効率を測定する簡単な方法はありません。

関連情報