Linuxで、タスクを実行するためにシステムコールまたは関数呼び出しのどちらかを選択できる場合、パフォーマンスが向上するため、どちらのオプションが優れていますか?
1 に答える
ほとんどの場合、システムコールを直接使用しないことに注意してください。glibcが提供するインターフェースを使用します。
http://www.kernel.org/doc/man-pages/online/pages/man2/syscalls.2.html
http://www.gnu.org/software/libc/manual/html_node/System-Calls.html
現在、オペレーティングシステムのコアリソース管理アクティビティであるファイル管理/ IPC /プロセス管理などの場合、唯一のオプションはシステムコールであり、ライブラリ関数ではありません。
このような場合、通常、システムコールのラッパーとして機能するライブラリ関数を使用します。つまり、ファイルを読み取るために、次のような多くのライブラリ関数があります。
fgetc/fgets/fscanf/fread - all should invoke read system call.
では、読み取りシステムコールを使用しますか?または他のライブラリ関数?これは特定のアプリケーションによって異なります。読み取りを使用している場合は、読み取りが利用できない他のオペレーティングシステムで、これを実行するためにコードを再度変更する必要があります。
柔軟性が失われています。プラットフォームが確実で、読み取り専用を使用していくつかの最適化を実行できる場合、またはアプリケーションがファイルポインターなどではなく、ファイル記述子のみを使用する必要がある場合に役立つことがあります。
Now in cases where we need to consider only say user level operations and invoke
no service from operating system , like say copying a string.(strcpy).
In this case definitely we shall not use any system call unnecessarily, if at
all something is there, since it should be an extra overhead due to operating
system intervention, which is not needed in this case.
したがって、システムコールとライブラリ関数のどちらを選択するかは、システムコールの上にライブラリ関数を構築した場合にのみ発生すると思います。
(上記の例に追加するように、システムコールbrkを呼び出すmallocと言うことができます)。
ここでの選択は、特定の種類のソフトウェア、実行するプラットフォーム、速度などの正確な非機能要件によって異なります(ただし、mallocの代わりにbrkを使用している場合、コードがより高速に実行されるとは言えません)。移植性など