在 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.
那么我们应该使用 read 系统调用吗?或其他库函数?这应该取决于特定的应用程序。如果我们正在使用读取,那么我们再次需要更改代码以在其他一些读取不可用的操作系统上运行它。
我们正在失去一些灵活性。当我们确定平台并且我们可以通过使用只读进行一些优化或者应用程序必须只使用文件描述符而不是文件指针等时,它可能很有用。
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.
所以我觉得只有在我们有一个构建在系统调用之上的库函数的情况下才会在系统调用和库函数之间进行选择。
(就像添加到上面的示例一样,我们可以说malloc调用系统调用brk)。
这里的选择将取决于特定类型的软件、它应该运行的平台、精确的非功能性要求,如速度(虽然你不能肯定地说如果你使用 brk 而不是 malloc,你的代码会运行得更快),便携性等