syscall()を呼び出さないlibc関数があるかどうか知りたいですか?たとえば、libc関数 "strcpy()"の場合、任意のシステムコールを実行します(考えられるすべてのLinuxシステムについて考えてみましょう)。
2 に答える
システム コールは、カーネルへのコンテキスト スイッチを意味するため、パフォーマンスが非常に高くなります。strcpy
したがって、 (その機能は実質的に と同等ですが、アーキテクチャ用に最適化される可能性がある) のような単純なライブラリ関数の場合while(*d++ = *s++)
、システム コールは意味をなさないでしょう。
コピー中にページ フォールトが発生すると、カーネル コンテキスト スイッチが発生し、システム コールが発生する可能性がありますが、これはシステムstrcpy
コールを直接呼び出した結果ではないことに注意してください。
システムコールは、ユーザーランド (プログラムが実行される場所) からカーネルランドへのインターフェースのようなものです。brk
これらは、ハードウェアとの通信 (ネットワーク カードからのバイトの読み取り、プロセスの開始、malloc (を使用) によるメモリの割り当てなど) など、カーネルだけが実行できることを行うときに必要です。
一方、 のようなユーザーランド関数は、strcpy
syscall を実行するためにインデントされていません。ユーザーランドのプロセスのメモリ上で動作するだけで、特別な権限は必要ありません。
syscall はパフォーマンスに重大なペナルティをもたらすため (モードをユーザー ランドからカーネル ランドに変更したり、その逆に変更したりするのはコストがかかります)、頻繁に呼び出される関数のようなものをstrcpy
使用することは、設計の観点からは意味がなく、そのようなものは見られそうにありません。